Web音频api时序是否比setTimeout更精确

时间:2016-12-23 19:35:17

标签: javascript audio web-audio web-audio-api

在网络音频api中按下声音时,您可以设置声音从source.start(startTime);开始的时间。但是我想知道它有多精确。我知道setTimeout()只是将代码放在事件队列中执行。我认为这也是Web音频api所做的,但这只是猜测。因此,他们俩之间没有区别。

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

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

Web音频API也使用了setTimeout。如果是这样,我可以通过使用网络工作者来提高响应速度吗?我知道一个Web worker可以访问setTimeout,但我不确定它是否可以访问web audio api。

来自doc:

  

音频工作者提供直接脚本音频处理的能力   要在Web工作者上下文中完成,并由几个人定义   接口(新截至2014年8月29日。)这些没有实现   任何浏览器

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

1 个答案:

答案 0 :(得分:3)

  

网络音频api时间是否比setTimeout更精确?

是的,到目前为止!音频计时器implementation寻求减少(累积)延迟并提供低至样本级别的实时和精确计时功能。它为音频事件使用精确调度程序。

来自MDN

  

时间控制具有高精度和低延迟,允许   开发人员编写能够准确响应事件的代码   能够针对特定样品,即使在高采样率下也是如此。所以   鼓机和音序器等应用都在其中   达到。

the W3C Editor's Draft 20 December 2016

  

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

setTimeout()的工作方式对于一般的音频处理来说不够准确,其下端时间值甚至可能受到限制(例如,设置为1ms可能会被浏览器更改为4ms)。它可能会也可能不会在目标时间触发,具体取决于事件队列以及其他因素。

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

  

Web音频API在引擎盖下使用了setTimeout吗?

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

Audio Worker节点将用于处理音频数据(如当前但已弃用的currentTime),但是在不同的线程上,而不是自己播放音频。所有音频播放都通过主音频线程进行。有关Audio Workers Nodes here的更多信息,请参阅。