Skip to content

浏览器支持

Chrome 35+ · Firefox 25+ · Safari 14.1+ · Edge 79+ 所有现代浏览器均已支持,包括移动端。

概述

浏览器原生支持两种音频 API:Audio 元素(<audio>)适合播放文件,而 Web Audio API 则是一套完整的音频信号处理引擎

Web Audio API 基于"音频节点图"(Audio Node Graph)工作:将音频信号流经一系列处理节点(GainNode 增益、AnalyserNode 分析、BiquadFilterNode 滤波),最后输出到扬声器。这种节点组合的方式让你可以像搭积木一样构建任意复杂的音频处理链路。

简单说:你想做音频可视化、音效处理、合成器、DJ 应用?Web Audio API 就是为此而生。

<audio> 元素的区别

<audio>Web Audio API
控制粒度仅播放/暂停/跳转精确到采样级别的处理
实时处理不支持支持(延迟、混响、滤波实时叠加)
音频分析不支持支持(AnalyserNode 获取频谱)
多轨道混音难实现自然支持(节点图连接)
适用场景背景音乐、视频配音音效处理、音乐制作、语音处理

核心概念

AudioContext

所有音频操作的入口,类似 Canvas 的 getContext('2d')

js
// 创建音频上下文(新浏览器需要用户交互后才能创建)
const ctx = new AudioContext();

用户手势限制

Chrome 浏览器要求 AudioContext 必须在用户交互(如 click)事件回调中创建,否则会被自动暂停。

音频节点(AudioNode)

音频节点是音频处理的基本单元,分为三类:

类型示例作用
音源节点OscillatorNodeAudioBufferSourceNode产生音频信号
处理节点GainNodeBiquadFilterNodeConvolverNode修改信号
输出节点AudioDestinationNode(扬声器)最终输出

音频节点图

[音源] → [处理节点A] → [处理节点B] → ... → [输出]
js
const ctx = new AudioContext();

// 创建节点
const osc = ctx.createOscillator();   // 振荡器(产生声音)
const gain = ctx.createGain();         // 增益(控制音量)

// 连接:osc → gain → 扬声器
osc.connect(gain);
gain.connect(ctx.destination);

osc.start();  // 开始播放
gain.gain.setValueAtTime(0, ctx.currentTime);  // 静音

快速上手

js
// 必须放在用户交互事件中(点击按钮触发)
button.onclick = () => {
  const ctx = new AudioContext();

  // 创建振荡器(方形波,440Hz = A4 音)
  const osc = ctx.createOscillator();
  osc.type = 'square';
  osc.frequency.setValueAtTime(440, ctx.currentTime);

  // 创建增益节点(控制音量)
  const gain = ctx.createGain();
  gain.gain.setValueAtTime(0.3, ctx.currentTime); // 30% 音量

  // 连接并播放
  osc.connect(gain).connect(ctx.destination);
  osc.start();

  // 1 秒后自动停止
  osc.stop(ctx.currentTime + 1);
};

常用节点一览

节点用途
OscillatorNode合成波形(正弦、方波、锯齿、三角)
AudioBufferSourceNode播放已加载的音频文件
GainNode控制音量增益
BiquadFilterNode低通、高通、带通滤波
DelayNode延迟效果
ConvolverNode卷积混响
AnalyserNode频谱/波形分析(可视化用)
MediaStreamSource麦克风输入
MediaRecorder录制音频到文件

注意事项

  • 用户手势限制:AudioContext 在新浏览器中默认暂停,需要在用户点击等交互后调用 ctx.resume()
  • 节点只能连接一次但可断开:同一个 AudioBufferSourceNode 可以同时连接多个目标节点
  • 音频文件需要先解码:用 ctx.decodeAudioData(arrayBuffer) 把 MP3/WAV 转成 AudioBuffer 才能播放
  • 节点不能复用:每个节点创建后不能重置参数重新使用,需要新建节点

基于 VitePress 构建