网络音频API定时比setTimeout更精确

问题描述:

当在网络音频API中推送声音时,您可以设置声音以source.start(startTime);开始的时间。不过,我想知道这是多么的精确。我知道setTimeout()只是把代码在事件queu中执行。我认为这是Web音频API所做的,但这只是一个猜测。因此,他们两人之间没有任何区别。网络音频API定时比setTimeout更精确

我试着在播放声音之前运行一段长时间的运行过程,并且声音确实延迟了。

//... 
    source.start(startTime + 0.2); 
    //.... 
let i = 0; 
while(i < 100000){ 
    console.log("p" + i); 
    i++; 
} 

因此,网络音频API使用setTimeout底下。如果可以的话,我可以通过使用网络工作人员来提高响应速度?我知道网络工作者可以访问setTimeout,但我不确定它可以访问网络音频API。

从DOC:

音频工作者提供了一个网络工作者上下文中做直接照本宣科音频处理 的能力,并通过几个 接口(新作为29日2014年8月被定义。)这些没有在 任何浏览器中实现

这只能说明音频处理的重点,我不确定是否只包括播放音频。

Web音频API时间比setTimeout更精确吗?

是,目前为止!音频计时器implementation试图减少(累积)延迟,并将实时和精确的计时功能降至样本级别。它使用精确的调度程序来处理音频事件。

MDN

定时被控制以高精度和低延迟,允许 开发者编写准确响应事件以及是 能够靶向特定的样品,即使在高采样率的代码。所以 应用程序,如鼓机和音序器都在 范围内。

和从the W3C Editor's Draft 20 December 2016

[...]特别地,而不是使用消息队列,实现者可以使用 存储器被线程之间共享,只要存储器 操作不重新排序。

方式setTimeout()作品是不适合的一般音频处理和其下端的时间值足够精确甚至可以限制(例如,将其设置为1毫秒可由浏览器被改变为4ms)。根据事件队列以及其他因素,它可能会或可能不会在目标时间触发。

要记住的另一件事是Web Audio API中的所有预定时间都是相对于AudioContextcurrentTime(同上)的值。

那么web音频api会在引擎盖下使用setTimeout吗?

排序已经回答了,但没有,绝对没有:)

音频工作节点将被用来处理音频数据(如当前但反对ScriptProcessorNode),但在单独的线程,而不是播放音频他们自己。所有音频播放都通过主音频线程进行。请参阅Audio Workers Nodes here

+1

谢谢您的详尽解答,它有帮助。我不确定当时是否看到了音频工作者的使用,或者我确实是这样。例如,当我想用​​“释放效果”(声音逐渐降低)来停止声音时,我使用'setTimeout'。如果我有一个音频网络工作者,我想我可以在音频网络工作者而不是主线程中做到这一点,并且更精确。这没什么大不了的,因为它是一种进步,但我很乐意拥有。我希望它能很快实施。再次感谢。 – Ced