【问题标题】:Stop playing sound after specified duration in milliseconds using web audio API使用网络音频 API 在指定持续时间(以毫秒为单位)后停止播放声音
【发布时间】:2015-08-07 21:39:23
【问题描述】:

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

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

// play audio from source
source.start();

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

source.stop(0.25); // should be 250 milliseconds, but audio stops immediately

setTimeout 不够精确,偶尔会出现抖动/漂移,尤其是在 UI 工作量很大或正在其他地方执行其他计算的情况下。

setTimeout(function () {
    source.stop(); // very inaccurate
}, 250);

是否有一个简单的解决方案可以在一定的 毫秒 后停止播放音频,而不需要使用工作线程中的忙等待等技巧?

【问题讨论】:

    标签: javascript web-audio-api


    【解决方案1】:

    我认为您误解了 stop() 的第一个参数的作用。

    它表示相对于音频上下文时间的时间量,这意味着在调用stop()时,你需要将那个时间加进去:

    source.stop(context.currentTime + 0.25);
    

    由于该函数接受双精度数,因此不应将其四舍五入到最接近的秒数。根据Web Audio API specification:

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

    【讨论】:

    • "如果值小于 currentTime" - 现在说得通了。这解决了时序问题,但是仍然会出现一些抖动。我想我可以通过中间增益节点使音频源静音,然后使用setTimeout(fn, 0) 之后停止播放,但是,这不会使时间精确,至少在我弄清楚是否可以将硬件时间添加到更改 gainNode 的gain.value。
    • source.stop() 应该可以工作并且非常精确。如果你想使用增益节点,那么gain.value.setValueAtTime(0, <time>)也应该非常准确。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-19
    • 1970-01-01
    • 2018-07-13
    相关资源
    最近更新 更多