我想制作一个Javascript程序来处理来自麦克风的一些音频。但是当我做一个基本的例子时,比如从麦克风获取音频并在没有任何处理的情况下播放它,就像这样
source = audioCtx.createMediaStreamSource(stream);
source.connect(audioCtx.destination);
输入和输出音频之间的延迟时间为200毫秒。我尝试使用Windows 7和Windows 10在2台不同的PC上使用谷歌浏览器和Firefox,它在各处看起来都一样。我通过使用外部设备录制和分析音频得到了这个数字(200ms),而不仅仅是我的耳朵。
在官方W3C规范here中,它们讲述了大约3-50毫秒的延迟。我需要30-50毫秒。我真的不需要3-5毫秒。
我尝试使用像这样的延迟参数
navigator.mediaDevices.getUserMedia({
audio: {
latency: 0.05,
echoCancellation: false,
mozNoiseSuppression: true,
mozAutoGainControl: false
}
});
但看起来Chrome和FireFox会忽略它。
我的完整示例可在此处找到。
https://jsfiddle.net/xfq3ykp7/71/
是浏览器/硬件限制还是我做错了什么?我的例子可以听到一些延迟吗?通常,通过敲击麦克风附近的桌子很容易检查。在200毫秒内,命中和声音之间会有明显的延迟。
我不需要复杂的东西,如游戏或在线乐器所需的预定音频事件等。我只需要将简单示例中的延迟从200毫秒减少到50毫秒,或理想情况下减少到20毫秒。
UPDATE1:
我可以在Windows 10上创建70毫秒,在Firefox上使用该代码更改在Windows 7上创建100毫秒
var p = navigator.mediaDevices.getUserMedia({
audio: {
latency: 0.02,
echoCancellation: false,
mozNoiseSuppression: false,
mozAutoGainControl: false
}
});
感谢firefox支持(https://bugzilla.mozilla.org/show_bug.cgi?id=1375466)。但他们告诉我们应该有30毫秒。问题仍然是“如何在Windows上获得30毫秒的延迟?”和“什么是硬件要求?”。