【问题标题】:How to play multiple AudioBufferSourceNode synchronized?如何同步播放多个 AudioBufferSourceNode?
【发布时间】:2013-11-09 02:33:14
【问题描述】:

我有多个必须同步播放的音频文件。我读过 Web Audio API 是最好的解决方案。但是,我找不到任何说明如何实现这一点的文档。

我读过的几乎所有文章都是这样开始播放的。

//Let's say I have AudioBufferSourceNode connected to two buffers
var source1, source2;

source1.start(0);
source2.start(0);

这不应该导致 source2 开始播放的时间比 source1 稍晚吗?

另外,是什么让源保持同步?我在任何文档中都找不到任何可确保源同步播放的内容。

谢谢。

【问题讨论】:

    标签: html web-audio-api


    【解决方案1】:

    音频上下文有一个时钟,缓冲区播放在那个时钟上 - 所以是的,它们将保持同步。

    甚至调用 start(0);开始(0);如上所述将完美同步,因为 start() 正在音频线程上设置调度请求,而这两者的实际调度将一起发生。 “现在”实际上稍微有点未来(音频系统延迟)。

    【讨论】:

    • 哦,这很有趣。因此,无论我做多少工作或花费多长时间,在给定调用堆栈中对start(0) 的任何调用都将被安排在完全相同的时间?
    • 嗯,对此并不积极;正如你所说,最好用未来的开始时间来创建它们。那里可能存在不可观察的竞争条件。但实际上,如果你调用 start(0);start(0);他们会同步。
    【解决方案2】:

    您可以在以后稍微安排它们。

    var source1, source2;
    var when = context.currentTime + 0.01;
    
    source1.start(when);
    source2.start(when);
    

    这将安排这两种声音在您定义 when 的那一刻起正好播放 10 毫秒。它的速度足够快,会被认为是即时的,但为在第一个源节点上实际调用 start 的开销提供了一点喘息的空间。

    如果您有大量节点,有更好的方法来做到这一点,但对于简单的情况,这应该没问题。

    【讨论】:

    • Kevin,来源会保持同步吗?有这方面的信息吗?谢谢。
    • 是的,它们会保持同步。不过,我真的没有任何关于它的信息。据我所知,规范中根本没有解决时钟问题。
    • 仅供参考,您可能应该继续接受下面克里斯的回答,而不是我的。
    猜你喜欢
    • 2012-03-15
    • 2021-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-15
    相关资源
    最近更新 更多