Javascript 使用web音频API在指定的持续时间(毫秒)后停止播放声音
使用开始播放音频缓冲区中的音频后,如何使其在预定时间(毫秒)后停止?我的设置很简单:Javascript 使用web音频API在指定的持续时间(毫秒)后停止播放声音,javascript,web-audio-api,Javascript,Web Audio Api,使用开始播放音频缓冲区中的音频后,如何使其在预定时间(毫秒)后停止?我的设置很简单: // create audio source var source = audioCtx.createBufferSource(); // play audio from source source.start(); 使用I只能以秒为单位指定此持续时间,但由于某些原因,提供任何非整数都将计算为零,并使音频立即停止: setTimeout不够精确,偶尔会出现抖动/漂移,尤其是当UI工作频繁或其他计算正在别处执
// create audio source
var source = audioCtx.createBufferSource();
// play audio from source
source.start();
使用I只能以秒为单位指定此持续时间,但由于某些原因,提供任何非整数都将计算为零,并使音频立即停止:
setTimeout不够精确,偶尔会出现抖动/漂移,尤其是当UI工作频繁或其他计算正在别处执行时
setTimeout(function () {
source.stop(); // very inaccurate
}, 250);
有没有一个简单的解决方案,可以在一定的毫秒之后停止播放音频,而不用求助于工作线程中的忙等待之类的黑客手段?我想您误解了
stop()
的第一个参数的作用
它表示相对于音频上下文时间的时间量,这意味着在调用stop()
时,需要将该时间添加到其中:
source.stop(context.currentTime + 0.25);
由于函数接受double,因此不应将其四舍五入到最接近的秒。根据报告:
when参数描述声音应在何时(以秒为单位)停止播放。它与AudioContext的currentTime属性位于同一时间坐标系中。如果该值传入0或该值小于currentTime,则声音将立即停止播放
“如果该值小于currentTime”-现在就有意义了。这解决了计时问题,但仍会出现一些抖动。我想我可以通过中间gainNode使音频源静音,然后使用设置超时(fn,0)
停止播放,但是,这不会使计时精确,至少在我弄清楚是否可以添加硬件计时来更改gainNode的增益.value
源.stop()
应该可以工作并且非常精确。如果要使用增益节点,那么gain.value.setValueAtTime(0,)
也应该非常精确。
source.stop(context.currentTime + 0.25);