Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用web音频API在指定的持续时间(毫秒)后停止播放声音_Javascript_Web Audio Api - Fatal编程技术网

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);