使用Web音频API在指定的持续时间(以毫秒为单位)后停止播放声音

Joh*_*isz 3 javascript web-audio-api

在使用AudioBufferSourceNode开始播放来自AudioBuffer的音频后,如何在预定时间(以毫秒为单位)后停止播放?我的设置很简单:

// create audio source
var source = audioCtx.createBufferSource();

// play audio from source
source.start();
Run Code Online (Sandbox Code Playgroud)

使用AudioBufferSourceNode.stop()我只能以秒为单位指定此持续时间,但由于某种原因,提供任何非整数将被评估为零,并使音频立即停止:

source.stop(0.25); // should be 250 milliseconds, but audio stops immediately
Run Code Online (Sandbox Code Playgroud)

setTimeout不够精确,偶尔出现抖动/漂移,特别是如果UI工作很多,或者其他计算正在其他地方执行.

setTimeout(function () {
    source.stop(); // very inaccurate
}, 250);
Run Code Online (Sandbox Code Playgroud)

是否有一个简单的解决方案,在一定的毫秒数后停止播放音频,而不是像工作线程中的繁忙等待那样的黑客,或类似的?

Qan*_*avy 6

我想你误解了第一个论点是stop()做什么的.

它表示相对于音频上下文时间的时间量,这意味着在调用时stop(),您需要将该时间添加到它:

source.stop(context.currentTime + 0.25);
Run Code Online (Sandbox Code Playgroud)

由于函数接受double,因此不应将其舍入到最接近的秒.根据Web Audio API规范:

when参数描述声音应停止播放的时间(以秒为单位).它与AudioContext的currentTime属性在同一时间坐标系.如果为此值传入0或者该值小于currentTime,则声音将立即停止播放.

  • `source.stop()`应该工作并且非常精确.如果你想使用增益节点,那么`gain.value.setValueAtTime(0,<time>)`也应该非常准确. (4认同)