使用 WebAudio 合并/混合两个音频流

Merging/mixing two audio streams with WebAudio

提问人:eirikrye 提问时间:12/12/2013 最后编辑:eirikrye 更新时间:1/25/2023 访问量:5455

问:

我有一个来自 navigator.getUserMedia 的 MediaStreamSource,它连接到一个 GainNode,而 GainNode 又连接到一个 ScriptProcessorNode,如下所示:

[getUserMediaStream] -> [MediaStreamSource] -> [GainNode] -> ScriptProcessorNode -> (destination)

在我的应用程序中,ScriptProcessorNode 正在执行主要工作,即处理原始音频流并通过 WebSocket 传输到远程服务器(我的应用程序基本上是基于 Web 的录音机)进行保存。这工作正常。

但是,现在我正在尝试引入第二个 MediaStreamSource,这次来自 WebRTC PeerConnection。对等连接本身工作正常,如果将音频路由到元素中,我可以听到来自对等的音频。但是,我希望将第二个 MediaStreamSource 也通过管道传递到 ScriptProcessorNode,从而有效地录制两个音频流。

我想做的是在两个音频流到达 ScriptProcessorNode 之前将它们混合在一起。我尝试将第二个MediaStreamSource连接到同一个GainNode(也直接连接到ScriptProcessorNode),但这不起作用,因为这两个节点都不接受多个输入节点(即使它从未在尝试连接多余的节点时返回任何错误)。我正在尝试实现这样的目标:

像这样的东西:

[MediaStreamSource] -> [Intermediary Node(s)?] -> [GainNode] -> [ScriptProcessorNode] -> [Server]
                     /
[MediaStreamSource] /

然后,我查看了 WebAudio 规范,发现唯一真正接受多个输入的节点是 ChannelMergerNode。但是,该规范指出,流根据它们连接到节点的顺序合并到通道中,因此在输入上连接的第一个流将成为输出的左通道,第二个流将成为右通道。由此我认为,结果最终将是我的左耳上有一股流,右耳上有另一股。我只想将两个流合并并均匀地混合到一个单声道中。

当前的 WebAudio API 是否可能?

非常感谢您的帮助!

埃里克

javascript html 音频 webrtc

评论


答:

0赞 flo850 12/14/2013 #1

您是否尝试过将 ChannelMergerNode 与下混音相结合?

http://www.w3.org/TR/webaudio/#UpMix<--棘手的链接,它是关于下混和上混的

0赞 Peter Salomonsen 9/30/2021 #2

您可以创建一个 MediaStreamDestination:

audioStreamDestination = audioContext.createMediaStreamDestination();

然后将多个节点连接到它:

node1.connect(audioStreamDestination)
node2.connect(audioStreamDestination)

您可以在此处查看麦克风的输入和音频处理方式的输出在实践中是如何完成的:

https://github.com/petersalomonsen/javascriptmusic/blob/master/wasmaudioworklet/screenrecorder/screenrecorder.js#L15