Javascript Web 音频 API 延迟

Zle*_*lik 6 html javascript audio html5-audio web-audio-api

我想制作一个 Javascript 程序来处理来自麦克风的一些音频。但是当我只做一个基本的例子时,比如从麦克风获取音频并在没有任何处理的情况下播放它,就像这样

source = audioCtx.createMediaStreamSource(stream);
source.connect(audioCtx.destination);
Run Code Online (Sandbox Code Playgroud)

我在输入和输出音频之间有 200 毫秒的延迟。我在 2 台装有 Windows 7 和 Windows 10 的不同 PC 上尝试了 Google Chrome 和 Firefox,它在任何地方看起来都一样。我通过使用外部设备录制和分析音频(而不仅仅是通过我的耳朵)获得了这个数字(200 毫秒)。

此处的官方 W3C 规范中他们讲述了大约 3-50 毫秒的延迟。30-50 毫秒是我需要的。我真的不需要 3-5 毫秒。

我尝试使用这样的延迟参数

navigator.mediaDevices.getUserMedia({
  audio: {
    latency: 0.05,
    echoCancellation: false,
    mozNoiseSuppression: true,
    mozAutoGainControl: false
  }
});
Run Code Online (Sandbox Code Playgroud)

但看起来它被 Chrome 和 FireFox 忽略了。

我的完整示例可在此处获得。

https://jsfiddle.net/xfq3ykp7/71/

是浏览器/硬件限制还是我做错了什么?任何人都可以通过我的示例听到一些延迟吗?通常,通过敲击麦克风附近的桌子可以很容易地检查它。敲击声与其声音之间有 200 毫秒的明显延迟。

我不需要复杂的事情,例如游戏或在线乐器所需的预定音频事件等。我只需要在我的简单示例中将延迟从 200 毫秒减少到 50 毫秒,或者理想情况下减少到 20 毫秒。

更新1:

通过更改代码,我可以在 Firefox 中在 Windows 10 上运行 70 毫秒,在 Windows 7 上运行 100 毫秒

var p = navigator.mediaDevices.getUserMedia({
  audio: {
    latency: 0.02,
    echoCancellation: false,
    mozNoiseSuppression: false,
    mozAutoGainControl: false
  }
});
Run Code Online (Sandbox Code Playgroud)

感谢 Firefox 支持(https://bugzilla.mozilla.org/show_bug.cgi?id=1375466)。但他们说 30 毫秒应该是可能的。问题仍然悬而未决“如何在 Windows 上获得 30 毫秒的延迟?” 和“什么是硬件要求?”。