我正在尝试在 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) 我们如何解决它?
谢谢!
您永远不应该在
sampleRate
约束中设置 getUserMedia
值! sampleRate
由客户端自动设置,修改它会导致发出间隙声音。例如,您设置的值 48000
仅与 Google Chrome 兼容。 Firefox 和 Edge 使用完全不同的值。此外,当您将
echoCancellation
和
noiseSuppression
设置为
true
时,这意味着当增益接近
0
时麦克风将自行静音。当这个人开始说话和结束他的句子时,这会导致言语断断续续。根据我自己的经验,您应该只将约束设置为
audio
,然后让浏览器完成其余的工作:
const constraints = {
audio: true,
video: false
}
false
noiseSuppression
和
echoCancellation
,将它们设置为 false 修复了它
const stream = await navigator.mediaDevices.getUserMedia({
audio: {
deviceId,
noiseSuppression: false,
echoCancellation: false,
},
});