HTML5媒体API不支持多声道音频分离、合并或独立路由,需通过Web Audio API实现:用AudioContext构建处理图,借助AudioBuffer、ChannelMergerNode、AudioWorklet等完成声道操作、安全混音与动态路由,并支持播放、WAV导出及MP3转码。

HTML5 媒体 API 本身不支持多声道音频的分离、合并或独立路由,这些能力必须通过 Web Audio API 实现。核心在于用 AudioContext 搭建处理图,把原始音频流接入后,手动操作通道数据或借助专用节点完成分流与混音。
声道分离:提取左/右通道并独立处理
从音频文件或媒体元素获取音频数据后,需解码为 AudioBuffer,再调用 getChannelData() 分别读取左右声道:
- 索引 0 对应左声道,1 对应右声道(立体声前提下)
- 可将任一通道数据写入新
AudioBuffer,生成单声道音频用于监听、分析或转播 - 也可分别送入不同效果链:比如左声道加延迟、右声道加均衡,再各自输出到不同扬声器或录制轨道
双声道合并:安全混音避免削波
直接相加容易导致幅度超限(超出 [-1, 1]),引发数字失真。推荐使用以下策略之一:
- 平均法:每帧样本 = (left[i] + right[i]) / 2 —— 简单稳定,响度变化小
- 峰值归一化加权:先扫描左右声道最大绝对值,按比例缩放后再相加,保留更多动态范围
- 若需实时合并(如麦克风+背景音),可用
ChannelMergerNode或多个源同时connect()到同一GainNode,再统一输出
动态分流:用 AudioWorklet 实现低延迟路由
ScriptProcessorNode 已废弃,现代方案依赖自定义 AudioWorklet:
立即学习“前端免费学习笔记(深入)”;
- 注册处理器,在
process()中接收输入通道数组 - 例如:仅转发左声道 →
outputs[0][0] = inputs[0][0];右声道静音 →outputs[0][1] = 0 - 支持运行时切换逻辑,适合监听模式(L/R 单独监听)、无障碍字幕音频同步、多语言音轨切换等场景
输出与导出:播放、下载与格式兼容
处理后的音频既可即时播放,也能导出为文件:
- 播放:用
AudioBufferSourceNode加载处理后的缓冲区,连接至context.destination - 导出 WAV:用
OfflineAudioContext渲染,构造标准 WAV 头 + PCM 数据,生成 Blob URL 下载 - 导出 MP3:浏览器原生不支持编码,需集成
lamejs等第三方库完成转码



















