html5原生标签无法混音,必须用web audio api:声道合并用channelmergernode路由多单声道为多声道,信号混音用gainnode或离线处理逐样本相加防削波。

HTML5 原生 <audio></audio> 标签无法真正合并或混音——它只能独立播放多个音频文件,彼此无时间对齐、无幅度控制、更拿不到原始 PCM 数据。真正的音频流合并与混音,必须依赖 Web Audio API,在内存中对采样点做精确运算。
什么是合并 vs 混音
这两个概念常被混淆,但技术实现完全不同:
-
声道合并(Channel Merging):把多个单声道信号按顺序“拼成”一个多声道输出,比如左声道 + 右声道 → 立体声;或 6 个单声道 → 5.1 声道。用
ChannelMergerNode实现,不改变内容,只做路由。 -
信号混音(Mixing):把多路音频(无论单/立体声)在相同采样率下逐样本相加,生成一路新信号。例如背景乐 + 人声 + 音效 → 单声道或立体声输出。核心是加法 + 防削波,通常用多路
.connect()到同一个GainNode或自定义处理器完成。
用 ChannelMergerNode 合并多声道
适用于需要保持原始声道布局的场景,比如制作环绕声母带:
如果你了解HTML,CSS和JavaScript,您已经拥有所需的工具开发Android应用程序。本动手本书展示了如何使用这些开源web标准设计和建造,可适应任何Android设备的应用程序 - 无需使用Java。您将学习如何创建一个在您选择的平台的Android友好的网络应用程序,然后转换与自由PhoneGap框架到一个原生的Android应用程序。了解为什么设备无关的移动应用是未来的潮流,并开始构建应用程序,提供更
- 创建节点:
const merger = audioCtx.createChannelMerger(6);(最多支持 6 路输入) - 每路输入必须是单声道 AudioNode(如 OscillatorNode、BufferSourceNode 输出单通道)
- 按索引连接:
leftSrc.connect(merger, 0, 0);表示把leftSrc的第 0 声道连到 merger 的第 0 输入口 - 未连接的输入口自动静音,不会报错但会影响声像定位
- 浏览器对 5.1/7.1 的实际播放支持有限,多数仅保障立体声可靠输出
用 GainNode 实现安全混音
这是最常用、最轻量的多轨叠加方式,适合背景乐+语音+提示音等典型场景:
- 创建一个总控增益节点:
const mixGain = audioCtx.createGain(); mixGain.gain.setValueAtTime(0.5, audioCtx.currentTime); - 所有音源都连到它:
trackA.connect(mixGain); trackB.connect(mixGain); trackC.connect(mixGain); - Web Audio 默认对多路输入做“无缩放相加”,两路满幅信号直接叠加必削波(超出 [-1, 1]),所以初始 gain 设为 0.5 是合理起点
- 可动态调节每轨音量:单独给每路加
GainNode,再统一进mixGain - 若需立体声分布,可在每路后加
StereoPannerNode控制左右比例
从 AudioBuffer 出发的离线混音
适合剪辑、导出、预处理等非实时场景,精度高且可控性强:
- 先用
fetch()+decodeAudioData()获取解码后的AudioBuffer - 确保所有 buffer 采样率一致(否则需重采样)
- 创建新 buffer:
const output = audioCtx.createBuffer(channels, length, sampleRate) - 遍历每个声道和每个采样点,执行加法并归一化:
output.getChannelData(i)[j] = (a[i][j] + b[i][j]) / 2; - 防削波不能只靠除以轨数——应检测峰值,再全局缩放至
maxAmplitude ≤ 0.99 - 导出时用
OfflineAudioContext渲染,再封装 WAV 头部生成 Blob 下载
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










