通过网络音频 API 的 WebRTC 在 Google Chrome 上静默

Mic*_*l S 1 javascript google-chrome webrtc web-audio-api

我正在从 WebRTC 获取媒体流并进行一些音频处理和监控。它可以在 FireFox 上运行,但在 Chrome 上保持沉默。

这是一个简化版本,以单个增益节点为例。

    const AudioContext = window.AudioContext || window.webkitAudioContext;
    let myAudioCtx = new AudioContext();
    let mySource = myAudioCtx.createMediaStreamSource(stream);
    let gainNode = myAudioCtx.createGain();
    gainNode.gain.value = 2;
    mySource.connect(gainNode);
    gainNode.connect(myAudioCtx.destination);
Run Code Online (Sandbox Code Playgroud)

而如果我直接将流分配给 srcObject,我就会听到声音。

看来 createMediaStreamSource() 没有返回任何音频,因为我的监控显示静音。但是,如果我将来自 WebRTC 的流分配给 srcObect 并通过我的监控运行,那么监控会检测到声音。

myAudioCtx.state 说“正在运行”

想不出还有什么地方可以检查。任何帮助,将不胜感激

Mic*_*l S 5

经过一晚良好的睡眠并再次查看 MDN 文档后找到了解决方案。

您必须将流分配给音频元素

audio.srcObject = stream;
Run Code Online (Sandbox Code Playgroud)

但你必须将输出静音,这样它就不会直接进入扬声器

audio.muted = true;
Run Code Online (Sandbox Code Playgroud)

这不会阻止您的网络音频工作

const AudioContext = window.AudioContext || window.webkitAudioContext;
let myAudioCtx = new AudioContext();
let mySource = myAudioCtx.createMediaStreamSource(stream);
let gainNode = myAudioCtx.createGain();
gainNode.gain.value = 2;
mySource.connect(gainNode);
gainNode.connect(myAudioCtx.destination);
Run Code Online (Sandbox Code Playgroud)

这适用于 Chrome、Safari 和 Firefox。

  • 这是 [Chrome 问题 933677:来自 RTC 的 MediaStream 对于 Web Audio API 来说是静默的](https://bugs.chromium.org/p/chromium/issues/detail?id=933677)。另请参阅 [Chrome 不会通过 WebRTC/Peer.js 播放 WebAudio getUserMedia](/sf/ask/1700093811/#55644983) (2认同)