繁体   English   中英

Web 多个来源的音频 echoCancellation 不起作用

[英]Web audio echoCancellation with multiple sources does not work

我有一个同时播放多个 web 音频源的应用程序,并允许用户同时录制音频。 如果物理输入(例如网络摄像头)无法检测到物理 output(例如耳机),它工作正常。 但是,如果 output 可以渗入输入(例如,使用带网络摄像头的笔记本电脑扬声器),则录音会拾取其他音频源。

我的理解是echoCancellation约束应该解决这个问题,但是当涉及多个源时它似乎不起作用。

我提供了一个简单示例来重现该问题。 JSfiddle 似乎过于严格地沙箱化以允许用户媒体,否则我会把它转储到某个地方。

重现步骤

  1. record
  2. 发出声音,或者只是观察。 “节拍器”应发出 5 声蜂鸣声
  3. 2 秒后, <audio>元素源将设置为录制的音频数据
  4. 播放<audio > 元素 - 你会听到“节拍器”的哔哔声。 理想情况下,节拍器的蜂鸣声将通过在 MediaStream 上设置的echoCancellation约束“取消”,但这种方式不起作用。

index.html

<!DOCTYPE html>
<html lang="en">
  <body>
    <button onclick="init()">record</button>
    <audio id="audio" controls="true"></audio>
    <script src="demo.js"></script>
  </body>
</html>

demo.js

let audioContext
let stream
async function init() {
  audioContext = new AudioContext()
  stream = await navigator.mediaDevices.getUserMedia({
    audio: {
      echoCancellation: true,
    },
    video: false,
  })

  playMetronome()

  record()
}

function playMetronome(i = 0) {
  if (i > 4) {
    return
  }

  const osc = new OscillatorNode(audioContext, {
    frequency: 440,
    type: 'sine',
  })
  osc.connect(audioContext.destination)
  osc.start()
  osc.stop(audioContext.currentTime + 0.1)

  setTimeout(() => {
    playMetronome(i + 1)
  }, 500)
}

function record() {
  const recorder = new MediaRecorder(stream)
  const data = []
  recorder.addEventListener('dataavailable', (e) => {
    console.log({ event: 'dataavailable', e })
    data.push(e.data)
  })
  recorder.addEventListener('stop', (e) => {
    console.log({ event: 'stop', e })
    const blob = new Blob(data, { type: 'audio/ogg; codecs=opus' })
    const audioURL = window.URL.createObjectURL(blob)
    document.getElementById('audio').src = audioURL
  })
  recorder.start()
  setTimeout(() => {
    recorder.stop()
  }, 2000)
}

不幸的是,这是 Chrome(及其所有衍生产品)中长期存在的问题。 它应该在 Firefox 和 Safari 中工作。

这是门票: https://bugs.chromium.org/p/chromium/issues/detail?id=687574

它基本上表示回声消除仅适用于来自对等连接的音频。 一旦它被 Web 音频 API 本地处理,回声消除将不再考虑它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM