getUserMedia 的音频质量很差。有什么想法吗?

问题描述 投票:0回答:4

我正在尝试在 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);

  ...

}

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

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

今天,我将约束设置为:

const constraints = {
    audio: {
      echoCancellation: false,
      autoGainControl: false,
      noiseCancellation: false
    },
    video: false
}

但我怀疑这是否会成为高质量录音的神奇门票,并且我开始认为也许我应该放弃 MediaRecorder 而选择其他东西。有谁知道 1) 问题是什么以及 2) 我们如何解决它?

谢谢!

javascript audio-recording getusermedia web-mediarecorder
4个回答
6
投票

您永远不应该在

sampleRate
约束中设置
getUserMedia
值!
sampleRate
由客户端自动设置,修改它会导致发出间隙声音。例如,您设置的值 48000
 仅与 Google Chrome 兼容。 Firefox 和 Edge 使用完全不同的值。

此外,当您将

echoCancellation

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

根据我自己的经验,您应该只将约束设置为

audio

,然后让浏览器完成其余的工作:

const constraints = { audio: true, video: false }
    

3
投票
罪犯是噪音抑制:true 这应该设置为

false


0
投票
我在 Firefox 和 Chrome 中都遇到了问题,分别是由于

noiseSuppression

echoCancellation
,将它们设置为 false 修复了它

const stream = await navigator.mediaDevices.getUserMedia({ audio: { deviceId, noiseSuppression: false, echoCancellation: false, }, });
    

-1
投票
使用 google 的 Adapter.js 库

© www.soinside.com 2019 - 2024. All rights reserved.