在网络音频中,为什么 contextTime 比 baseLatency 滞后 currentTime?
In Web Audio, why does contextTime lag currentTime by more than baseLatency?
据我了解,音频上下文有:
.currentTime
,下一个可调度的 128 样本帧缓冲区开始的时间(之前的缓冲区已发送)
.baseLatency
,将预定音频从WebAudio land传输到OS
所需的时间
.getOutputTimestamp().contextTime
,当前传递给 OS
的样本帧的时间戳
据此理解,context.getOutputTimestamp().contextTime
永远不应小于 context.currentTime - context.baseLatency
。
但确实如此!在我在 Chrome 的快速 MacBook 上进行的测试中,它比那个小了多达 -0.025s。这落后了 > 1000 个样本帧。
const context = new AudioContext();
// Let the audio clock settle
setTimeout(function() {
const currentTime = context.currentTime;
const contextTime = context.getOutputTimestamp().contextTime;
console.assert(
contextTime > (currentTime - context.baseLatency),
'contextTime', contextTime,
'currentTime', currentTime,
'baseLatency', context.baseLatency,
'contextTime - (currentTime - baseLatency)', contextTime - (currentTime - context.baseLatency)
);
}, 1000);
我对它应该做什么的假设是有偏差的,还是 API 对我撒谎说它是 baseLatency?
.baseLatency
基本上是 WebAudio 实现顺利工作所需的音频样本数。它可以低至 128(但不能更低),也可以大得多(8000 或更多)。对于 Macs,默认值为 256。这用于消除音频时钟的任何抖动。 Mac 的抖动非常低,因此 256(或 128)效果很好。 Linux 机器往往不那么准确,因此使用 512 或更高版本。 (对于chrome。)
这不包括 webaudio 和浏览器音频系统以及浏览器到 OS 以及从 OS 到实际输出设备之间的任何额外缓冲。 (我知道蓝牙设备有时会有很大的延迟。)
有一个 outputLatency
属性应该显示这一点,但是据我所知,它还没有在任何浏览器中实现。
我的假设有偏差。 Web Audio 规范在 getOutputTimestamp (https://www.w3.org/TR/webaudio/#dom-audiocontext-getoutputtimestamp).
部分下的注释中明确说明了这一点
我问题中的第三个项目符号是错误的。 .getOutputTimestamp().contextTime
是 不是 当前正在交给 到 音频驱动程序的样本帧的时间戳,正如我在问题中所述。顾名思义,它是当前从音频驱动程序输出的样本帧的时间戳。
正如@Raymond 在他的回答中暗示的那样,比较此时间戳的正确延迟是 outputLatency
(截至 2019 年 1 月尚未实施)。
据我了解,音频上下文有:
.currentTime
,下一个可调度的 128 样本帧缓冲区开始的时间(之前的缓冲区已发送).baseLatency
,将预定音频从WebAudio land传输到OS 所需的时间
.getOutputTimestamp().contextTime
,当前传递给 OS 的样本帧的时间戳
据此理解,context.getOutputTimestamp().contextTime
永远不应小于 context.currentTime - context.baseLatency
。
但确实如此!在我在 Chrome 的快速 MacBook 上进行的测试中,它比那个小了多达 -0.025s。这落后了 > 1000 个样本帧。
const context = new AudioContext();
// Let the audio clock settle
setTimeout(function() {
const currentTime = context.currentTime;
const contextTime = context.getOutputTimestamp().contextTime;
console.assert(
contextTime > (currentTime - context.baseLatency),
'contextTime', contextTime,
'currentTime', currentTime,
'baseLatency', context.baseLatency,
'contextTime - (currentTime - baseLatency)', contextTime - (currentTime - context.baseLatency)
);
}, 1000);
我对它应该做什么的假设是有偏差的,还是 API 对我撒谎说它是 baseLatency?
.baseLatency
基本上是 WebAudio 实现顺利工作所需的音频样本数。它可以低至 128(但不能更低),也可以大得多(8000 或更多)。对于 Macs,默认值为 256。这用于消除音频时钟的任何抖动。 Mac 的抖动非常低,因此 256(或 128)效果很好。 Linux 机器往往不那么准确,因此使用 512 或更高版本。 (对于chrome。)
这不包括 webaudio 和浏览器音频系统以及浏览器到 OS 以及从 OS 到实际输出设备之间的任何额外缓冲。 (我知道蓝牙设备有时会有很大的延迟。)
有一个 outputLatency
属性应该显示这一点,但是据我所知,它还没有在任何浏览器中实现。
我的假设有偏差。 Web Audio 规范在 getOutputTimestamp (https://www.w3.org/TR/webaudio/#dom-audiocontext-getoutputtimestamp).
部分下的注释中明确说明了这一点我问题中的第三个项目符号是错误的。 .getOutputTimestamp().contextTime
是 不是 当前正在交给 到 音频驱动程序的样本帧的时间戳,正如我在问题中所述。顾名思义,它是当前从音频驱动程序输出的样本帧的时间戳。
正如@Raymond 在他的回答中暗示的那样,比较此时间戳的正确延迟是 outputLatency
(截至 2019 年 1 月尚未实施)。