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



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

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

在我的应用程序中,ScriptProcessorNode正在做主要工作,即通过WebSocket处理原始音频流并将其传输到远程服务器(我的应用软件基本上是一个基于web的录音机)以进行保存。这很好用。

然而,现在我正试图引入第二个MediaStreamSource,这一次源于WebRTC对等连接。对等连接本身工作良好,如果将音频路由到一个元素中,我可以听到来自对等设备的音频。然而,我希望第二个MediaStreamSource也能通过管道传输到ScriptProcessorNode,从而有效地记录两个音频流。

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

类似这样的东西:

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

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

对于当前的WebAudio API来说,这是可能的吗?

非常感谢你的帮助!

Eirik

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

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

您可以创建一个MediaStreamDestination:

audioStreamDestination = audioContext.createMediaStreamDestination();

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

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

你可以在这里看到如何在实践中使用麦克风的输入和音频工件的输出:

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

最新更新