getUserMedia 的音频质量不佳。任何想法为什么?

Nic*_*way 9 javascript audio-recording getusermedia web-mediarecorder

我正在尝试在 React Web 应用程序中设置一个录音机来录制大量人群(15 岁以上)的谈话,但似乎无法获得正确的录音质量。我最初尝试通过将以下约束传递给 getUserMedia 来捕获录音:

const constraints = {
  audio: {
    sampleRate: 48000,
    channelCount: 1,
    volume: 1.0,
    echoCancellation: true,
    noiseSuppression: true,
  },
  video: false
}

navigator.mediaDevices.getUserMedia(constraints)
.then( stream => {
  this.processStream(stream);
})

processStream = stream => {
  let options = MediaRecorder.isTypeSupported('audio/webm') ? {
    mimeType: 'audio/webm'
  } : {};

  let recorder = new MediaRecorder(stream, options);

  ...

}
Run Code Online (Sandbox Code Playgroud)

对于大多数录音,录音质量都很好。然而,有时录音会以这种非常糟糕的、失真的、几乎金属般的音质结束。我一直无法弄清楚如何重现效果(我已经开始捕获用户的浏览器,以尝试帮助调试此问题)。

大约一周前,我使用约束 = { audio: true, video: false } 部署了应用程序,但这有时也会产生质量略有失真的录音。到目前为止,没有任何录音像之前的一些录音一样糟糕,但质量仍然没有达到我们想要的水平。

今天,我将约束设置为:

const constraints = {
    audio: {
      echoCancellation: false,
      autoGainControl: false,
      noiseCancellation: false
    },
    video: false
}
Run Code Online (Sandbox Code Playgroud)

但我怀疑这是否会成为获得高质量录音的神奇门票,我开始认为也许我应该放弃 MediaRecorder 来做其他事情。有没有人有关于 1)问题是什么以及 2)我们如何解决它的想法?

谢谢!

Kob*_*uek 5

你永远不应该sampleRategetUserMedia约束中设置值!该sampleRate设置由客户端自动修改它会导致裂开的声音。48000例如,您设置的值仅与 Google Chrome 兼容。Firefox 和 Edge 使用完全不同的值。

此外,当您将echoCancellation和设置noiseSuppression为 时true,这意味着当增益接近 时麦克风将自行静音0。当这个人开始说话并结束他的句子时,这将导致语音中断。

根据我自己的经验,您应该将约束设置为audio单独设置,让浏览器完成其余的工作:

const constraints = {
  audio: true,
  video: false
}
Run Code Online (Sandbox Code Playgroud)

  • “您永远不应该在 getUserMedia 约束中设置 sampleRate 值”。你有这方面的参考吗? (15认同)