【问题标题】:How can I mix multiple stereo signals to one with WebAudio?如何使用 WebAudio 将多个立体声信号混合为一个?
【发布时间】:2018-12-09 00:24:58
【问题描述】:

我正在编写一个网络应用程序,它需要将多个立体声声音组合到一个立体声输出中,所以我想要一个等效的 gstreamer's audiomixer element,但在 WebAudio 中似乎没有。 ChannelMerger 做的事情并不完全相同 - 它将多个单声道信号合并为一个多声道信号。

AudioNode.connect 的文档说您可以将一个输出连接到其他节点的多个输入,并且尝试将同一输出多次连接到同一输入将被忽略。但它并没有说明如果您尝试将多个不同的输出连接到同一个输入会发生什么。这会像我想要的那样充当简单的混音器吗?我怀疑不是,因为 WebAudio 确实提供的拆分/合并功能(请参阅上面的 ChannelMerger)似乎主要基于在多个单声道信号和一个多声道信号之间进行转换,并具有一个通道到一个单声道信号的映射。

我可以采用任意节点(我猜 GainNode 可以工作,我可以利用它的增益功能)并将其 channelInterpretation 模式设置为“扬声器”以实际混合通道,但它仅适用于 1、2、 4 或 6 个输入。我不太可能需要超过 6 个,但我肯定需要能够处理 3 个,可能还有 5 个。这可以通过使用多个混音器来完成(例如,对于一个混音器中的三个通道混合输入 1 和 2,然后在第二个混音器中将其输出与输入 3 混合),但我认为我必须添加更多 GainNode 才能正确平衡混音。混频器可能必须衰减每个输入以防止重合峰值超出范围,因此对于没有补偿的链式混频器,我最终会得到 1/4,1/4,1/2 而不是 1/3,1/3 ,1/3?

【问题讨论】:

    标签: web-audio-api


    【解决方案1】:

    你几乎猜对了。使用单个GainNode 并将每个源连接到GainNode 的单个输入。这将总结所有不同的连接并产生单个输出。如果您知道所有单独的源都是立体声,则无需更改 channelInterpretationchannelCountModechannelCount 的任何内容即可获得所需的内容。

    您可能需要调整GainNode 的增益值以降低输出音量,以免输出设备过载。

    除此之外,这应该都可以。

    【讨论】:

    • 谢谢。对输入求和多个连接的能力是我缺少的信息。毕竟在规范中记录在 w3.org/TR/webaudio/#channel-up-mixing-and-down-mixing>,但我仍然无法在 MDN 上找到相应的信息,这通常是一个很好的信息来源。
    • 规范还说,没有对求和的输入或结果输出应用裁剪,但是到达目的地的超出范围的样本是未定义的。我的输入将使用全动态范围产生噪声等,所以我认为我需要将每个输入除以输入数量以确保没有削波。您是否知道 GainNode 是否可以在内部处理超出范围的值,因此可以只使用其增益参数执行一次衰减,还是应该在每个信号到达我的“混音器”之前对其进行衰减?
    • WebAudio 使用 32 位浮点数处理所有内容。只要处理不溢出这个,一切都会好起来的。因此,您实际上只需要一个最终增益节点(最多)即可将信号减小到 [-1,1] 范围,这样您就不会在最终输出处剪辑(或其他未定义的行为)。
    猜你喜欢
    • 2018-09-27
    • 2022-07-13
    • 2019-05-19
    • 1970-01-01
    • 2013-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多