在我们的项目中,我们使用AudioContext将输入从麦克风连接到AudioWorkletProcessor,然后再连接到MediaStream。最终,这将在WebRTC调用中发送给其他对等体。
如果有人加载页面,音频总是听起来很好。但如果他们用笔记本电脑麦克风或网络摄像头等硬连线麦克风连接,然后再连接蓝牙设备(如airpods或耳机),那么音频就会失真&听起来像机器人一样。
如果我们去掉所有其他代码并简化它,我们仍然会有问题。
bypassProcessor.js
// Basic processor that wires input to output without transforming the data
// https://github.com/GoogleChromeLabs/web-audio-samples/blob/main/audio-worklet/basic/hello-audio-worklet/bypass-processor.js
class BypassProcessor extends AudioWorkletProcessor {
process(inputs, outputs) {
const input = inputs[0];
const output = outputs[0];
for (let channel = 0; channel < output.length; ++channel) {
output[channel].set(input[channel]);
}
return true;
}
}
registerProcessor('bypass-processor', BypassProcessor);main.js
const microphoneStream = await navigator.mediaDevices.getUserMedia({
audio: true, // have also tried { channelCount: 1 } and { channelCount: { exact: 1 } }
video: false
})
const audioCtx = new AudioContext()
const inputNode = audioCtx.createMediaStreamSource(microphoneStream)
await audioCtx.audioWorklet.addModule('worklet/bypassProcessor.js')
const processorNode = new AudioWorkletNode(audioCtx, 'bypass-processor')
inputNode.connect(processorNode).connect(audioCtx.destination)有趣的是,我发现如果您注释掉2行音频工作板行,而不是创建一个简单的gain节点,那么它工作得很好。
// await audioCtx.audioWorklet.addModule('worklet/bypassProcessor.js')
// const processorNode = new AudioWorkletNode(audioCtx, 'bypass-processor')
const gainNode = audioCtx.createGain()此外,如果您只是创建AudioWorkletNode,但甚至没有将其与其他this连接,这也会重现问题。
我在这里创建了一个小的React应用程序来重现这个问题:https://github.com/JacobMuchow/audio_distortion_repro/tree/master
我已经尝试了一些选项,比如使用'ondevicechange‘事件检测何时发生这种情况,关闭旧的AudioContext & nodes并重新创建所有内容,但这只在某些情况下有效。如果我等待一段时间,然后重新创建它,它会起作用,所以当我尝试这样做时,我担心处理器会出现某种类型的垃圾收集问题,但这可能不是重点。
我怀疑这与采样率有关。当正确重新创建AudioContext时,它会从48 kHz切换到16 kHz,然后就会发出查找的声音。但有时它仍然是用48 kHz重新创建的,而且它听起来仍然像机器人。
互联网上关于这个问题的帖子非常稀少,我希望有人对这个问题或这个API有具体的经验,并能指出我需要做的不同之处。
发布于 2021-05-11 06:27:40
对于Chrome来说,问题很可能是最近修复的https://crbug.com/1090441。我认为Firefox没有这个问题,但我没有检查。
https://stackoverflow.com/questions/67337794
复制相似问题