使用MediaStream Recording API进行最低延迟的音频播放/监视有哪些好的约束条件?

时间:2019-08-20 18:40:05

标签: javascript html media mediastream

我目前正在使用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错误。延迟是可以的(比默认值更好),但是对于录制时听到自己的声音来说仍然不是很好。当您弹吉他并在耳机中听到声音时,会有一点可察觉的延迟。

我可以在这里进行其他优化以获得更好的结果吗?我不太在乎视频和音频的质量,因此降低分辨率,采样率等可能对您有所帮助?

1 个答案:

答案 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 );

在这里您可以看到一些使用该功能的演示: