我试图在React网络应用程序中设置一个录音机,用于录制大量人群(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)我们如何解决它的想法?
谢谢!
答案 0 :(得分:3)
您永远不应在sampleRate
约束中设置getUserMedia
值! sampleRate
由客户端自动设置,修改它会导致声音空白。例如,您设置的值48000
仅与Google Chrome兼容。 Firefox和Edge使用完全不同的值。
此外,当您将echoCancellation
和noiseSuppression
设置为true
时,这意味着当增益接近0
时麦克风将自动静音。当这个人开始说话并结束他的句子时,这将导致言语破裂。
根据我自己的经验,你应该只将约束设置为audio
,然后让浏览器完成剩下的工作:
const constraints = {
audio: true,
video: false
}
答案 1 :(得分:0)
使用来自 google 的 Adapter.js 库