Web Audio API 实战:浏览器端音频处理架构
技术架构(更新于 2026年5月26日)
Web Audio API 架构
Web Audio API 基于音频图 (Audio Graph) 模型——音频数据流经一系列节点,每个节点执行特定处理:
AudioBufferSource → GainNode → AnalyserNode → AudioDestination
(音源) (音量) (分析/可视化) (扬声器)
与 HTML5 <audio> 元素不同,Web Audio API 提供底层、精确的音频控制能力。
核心对象
| 对象 | 作用 | 类比 |
|---|---|---|
AudioContext |
音频处理的入口和时钟 | 音频引擎 |
AudioBuffer |
内存中的音频数据 | 音频文件 |
AudioNode |
处理单元 | 效果器/调音台 |
AudioParam |
可动画的参数 | 音量旋钮 |
创建 AudioContext
const ctx = new AudioContext();
// 浏览器策略:需要用户交互后才能启动
button.addEventListener('click', () => ctx.resume());
音频剪辑实现
工具库 音频剪辑工具 的处理流程:
async function trimAudio(file: File, startSec: number, endSec: number) {
const arrayBuffer = await file.arrayBuffer();
const audioBuffer = await ctx.decodeAudioData(arrayBuffer);
const duration = endSec - startSec;
const sampleRate = audioBuffer.sampleRate;
const startSample = Math.floor(startSec * sampleRate);
const endSample = Math.floor(endSec * sampleRate);
const length = endSample - startSample;
// 创建裁剪后的 buffer
const trimmed = ctx.createBuffer(
audioBuffer.numberOfChannels, length, sampleRate
);
for (let ch = 0; ch < audioBuffer.numberOfChannels; ch++) {
const sourceData = audioBuffer.getChannelData(ch);
const destData = trimmed.getChannelData(ch);
destData.set(sourceData.subarray(startSample, endSample));
}
return trimmed;
}
波形可视化
AnalyserNode 提供实时频域/时域数据:
const analyser = ctx.createAnalyser();
analyser.fftSize = 2048;
source.connect(analyser);
analyser.connect(ctx.destination);
const dataArray = new Uint8Array(analyser.frequencyBinCount);
function drawWaveform() {
analyser.getByteTimeDomainData(dataArray);
// 在 Canvas 上绘制波形
requestAnimationFrame(drawWaveform);
}
音频格式与编码
| 格式 | 浏览器解码 | 浏览器编码 | 质量 |
|---|---|---|---|
| WAV | ✅ | ✅ (AudioContext) | 无损 |
| MP3 | ✅ | ❌ | 有损 |
| OGG | ✅ | ❌ | 有损 |
| AAC | ✅ (Safari) | ❌ | 有损 |
| WebM/Opus | ✅ | ✅ (MediaRecorder) | 有损 |
浏览器端编码能力有限。工具库音频工具主要处理 WAV 格式,视频工具的 音频提取 则借助 ffmpeg.wasm 支持 MP3/OGG 输出。
性能注意事项
- AudioContext 是单例:一个页面只需一个 AudioContext
- 大文件分块解码:超过 100MB 的音频先分块再 decodeAudioData
- 及时 disconnect:不用的节点调用
node.disconnect()释放资源 - OfflineAudioContext:离线渲染不需要实时播放,性能更好
总结
Web Audio API 让浏览器具备了专业级音频处理能力。AudioContext 音频图、AudioBuffer 精确裁剪、AnalyserNode 实时分析——这些原语组合起来,可以实现从简单剪辑到复杂 DSP 的全谱系音频工具。
本站提供浏览器本地工具,免注册即可试用 →
#Web Audio API#音频处理#AudioContext#DSP#浏览器