我目前正在使用HTML5 / JS制作音乐应用程序,并试图实现MediaStream Recording API所能达到的最低延迟。该应用程序允许用户使用相机和麦克风录制音乐。在打开相机和麦克风的同时,该代码将允许用户听到和看到自己的声音。
目前我有:
const stream = await navigator.mediaDevices.getUserMedia(
{
video: true,
audio: {
latency: {exact: 0.003},
}
}
);
// monitor video and audio (i.e. show it to the user)
this.video.srcObject = stream;
this.video.play();
如果我降低了延迟要求,则会收到OverConstrained错误。延迟是可以的(比默认值更好),但是对于录制时听到自己的声音来说仍然不是很好。当您弹吉他并在耳机中听到声音时,会有一点可察觉的延迟。
我可以在这里进行其他优化以获得更好的结果吗?我不太在乎视频和音频的质量,因此降低分辨率,采样率等可能对您有所帮助?
答案 0 :(得分:3)
0.003的延迟是非常低的延迟(3毫秒),人耳无法察觉。
说,当我们谈论数字音频时,延迟不能为0。 尽管您将值设置得很低,但是由于各种原因并不能保证延迟实际上匹配,如果系统无法匹配延迟,承诺将被拒绝。
您可以在文档中阅读here:
使用最大,最小或精确值中的任何一个或全部指定的约束 总是被视为强制性的。如果任何约束使用一个或 调用applyConstraints()时,无法满足更多要求, 诺言将被拒绝。
注意:不同的浏览器和不同的操作系统行为不同。
Chrome
Chrome在某些canary build中引入了一种低延迟功能,称为 实时网络音频输入:
// success callback when requesting audio input stream
function gotStream(stream) {
window.AudioContext = window.AudioContext || window.webkitAudioContext;
var audioContext = new AudioContext();
// Create an AudioNode from the stream.
var mediaStreamSource = audioContext.createMediaStreamSource( stream );
// Connect it to the destination to hear yourself (or any other node for processing!)
mediaStreamSource.connect( audioContext.destination );
}
navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia;
navigator.getUserMedia( {audio:true}, gotStream );
在这里您可以看到一些使用该功能的演示: