ChannelMergerNode用于将多个单声道音频流按序合并为多声道输出,仅做通道路由不处理内容;需指定输入数创建,各单声道源按索引连接对应输入端口,未连输入默认静音。

ChannelMergerNode 用于将多个单声道(或更少声道)的音频流合并为一个多声道输出,比如把两个单声道 AudioNode 合并成一个立体声(2声道)信号,或把6个单声道合并为5.1环绕声。它本身不处理音频内容,只做通道路由和拼接。
创建并连接 ChannelMergerNode
你需要先创建 AudioContext 和目标声道数的 ChannelMergerNode,再把各路单声道 AudioNode 的 output 连接到它的对应输入端口(从 0 开始编号):
- 创建 merger:const merger = audioCtx.createChannelMerger(6); // 支持最多6个输入(对应6声道)
- 每个输入必须是单声道(Mono)AudioNode;若源节点本身是立体声,需先用 ChannelSplitterNode 拆分
- 按顺序连接:source1.connect(merger, 0, 0); // 第0个输入,取 source1 的第0个声道(即左/单声道)
- source2.connect(merger, 0, 0); // 第1个输入,同样取单声道;以此类推
典型立体声合并示例
假设你有两个独立生成的单声道信号(如左、右通道分别用 OscillatorNode 生成),想合成标准立体声输出:
- const ctx = new (window.AudioContext || window.webkitAudioContext)();
- const leftOsc = ctx.createOscillator(); leftOsc.frequency.value = 440;
- const rightOsc = ctx.createOscillator(); rightOsc.frequency.value = 660;
- const merger = ctx.createChannelMerger(2); // 立体声需2个输入
- leftOsc.connect(merger, 0, 0); // 连入第0路(未来成为左声道)
- rightOsc.connect(merger, 0, 0); // 连入第1路(未来成为右声道)
- merger.connect(ctx.destination); // 输出到扬声器
- leftOsc.start(); rightOsc.start();
注意事项与常见问题
ChannelMergerNode 不会自动重采样或调整声道布局,它严格按输入顺序映射到输出声道索引:
立即学习“前端免费学习笔记(深入)”;
- 输入数不能超过构造时指定的通道数(如 createChannelMerger(4) 最多接受4路输入)
- 未连接的输入默认静音(全零样本),不会报错但可能影响预期声像定位
- 浏览器对高声道数(如5.1、7.1)的支持依赖系统音频后端和硬件;多数桌面浏览器仅保证立体声可靠播放
- 若需动态切换声道配置(如从立体声切到四声道),需断开重建 merger 及连接链路,无法运行时修改通道数
配合 ChannelSplitter 实现灵活声道路由
实际项目中常与 ChannelSplitterNode 配合使用,例如把一个立体声源拆开、分别处理后再合并:
- const splitter = ctx.createChannelSplitter(2);
- stereoSource.connect(splitter); // 自动拆为左(0)、右(1)两个单声道输出
- const merger = ctx.createChannelMerger(2);
- splitter.connect(merger, 0, 0); // 左→merger第0路
- splitter.connect(merger, 1, 0); // 右→merger第1路
- 注意:splitter 的每个输出都是单声道,可安全接入 merger 对应输入



















