首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在MediaStream信号源中使用AudioWorkletProcessor并在蓝牙设备已经运行的情况下连接蓝牙设备时,会发生音频失真

在MediaStream信号源中使用AudioWorkletProcessor并在蓝牙设备已经运行的情况下连接蓝牙设备时,会发生音频失真
EN

Stack Overflow用户
提问于 2021-05-01 01:02:22
回答 1查看 166关注 0票数 2

在我们的项目中,我们使用AudioContext将输入从麦克风连接到AudioWorkletProcessor,然后再连接到MediaStream。最终,这将在WebRTC调用中发送给其他对等体。

如果有人加载页面,音频总是听起来很好。但如果他们用笔记本电脑麦克风或网络摄像头等硬连线麦克风连接,然后再连接蓝牙设备(如airpods或耳机),那么音频就会失真&听起来像机器人一样。

如果我们去掉所有其他代码并简化它,我们仍然会有问题。

bypassProcessor.js

代码语言:javascript
复制
// 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

代码语言:javascript
复制
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节点,那么它工作得很好。

代码语言:javascript
复制
// 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有具体的经验,并能指出我需要做的不同之处。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-11 06:27:40

对于Chrome来说,问题很可能是最近修复的https://crbug.com/1090441。我认为Firefox没有这个问题,但我没有检查。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67337794

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档