我想制作一个 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 上运行 …
在getter和setter中进行一些数据处理/验证是否是一种好习惯?在维基百科中,有两个示例:
这些是好的例子还是最好避免?如果最好避免这种情况,如何更好地实现以上两个示例?
更新:请不要以日期等为严重的例子。这只是一个例子,当然它可能是愚蠢的。
我有的真实例子。
我有一个外部第三方系统,我必须进行集成。这个外部系统从我那里希望得到一些带有getter和setter方法的数据。我必须在此处传递2个字段,id(类似于09df723987cd7(假设为GUID))和formattedID类似于“ objecttype / 09df723987cd7”。我无法更改此外部系统。
我想像实施
getId() {
return id
}
getFormattedId() {
return objectType + "/" + id;
}
Run Code Online (Sandbox Code Playgroud)
objectType是此类中的另一个字段。
我的问题:可以,还是有一些更优雅的实现方法?