第四章:音频格式与编解码 —— 听懂格式背后的取舍逻辑

你有没有想过,为什么同一首歌要准备 MP3、AAC、OGG 三个版本?为什么同样是"高质量",有人说 320kbps MP3 够了,有人说必须用 FLAC?这些问题的答案,藏在音频编解码的底层原理里。本章从原理到实践,帮你彻底搞清楚 Web 音频格式的选择逻辑。


一、音频数字化的基础:从声波到比特

在讲格式之前,必须先理解音频是怎么变成数字数据的。这是所有编解码知识的地基。

采样率(Sample Rate)

声音是连续的模拟波形,要存进计算机,必须每隔一段时间"采一个样",记录当前振幅值。每秒采样的次数就是采样率,单位是 Hz(赫兹)。

根据奈奎斯特定理,要完整还原一个频率为 $f$ 的信号,采样率必须至少达到 $2f$。人耳能听到的频率上限约为 20000 Hz,所以 CD 音质采用 44100 Hz 的采样率(略高于 40000 Hz,留有余量)。

常见采样率对比:

采样率典型用途
8000 Hz电话语音(只需覆盖人声频率 300~3400 Hz)
22050 Hz低质量音乐、旧游戏音效
44100 HzCD 标准,绝大多数音乐
48000 Hz专业视频/广播标准
96000 Hz高解析度音频(Hi-Res)

位深度(Bit Depth)

每个采样点用多少个二进制位来表示其振幅,就是位深度。位深度决定了动态范围(最大音量与最小可分辨音量之间的差距)。

$$\text{动态范围(dB)} \approx 6.02 \times \text{位深度}$$

  • 16-bit:动态范围约 96 dB,CD 标准,足够日常听音
  • 24-bit:动态范围约 144 dB,录音棚标准,保留更多后期处理空间
  • 32-bit float:音频处理中间格式,Web Audio API 内部使用

声道数(Channels)

  • 单声道(Mono):1 个声道,语音通话、播客常用
  • 立体声(Stereo):2 个声道(左右),绝大多数音乐
  • 环绕声(Surround):5.1、7.1 等多声道,影院/游戏音效

未压缩 PCM 的体积计算

$$\text{文件大小(字节)} = \frac{\text{采样率} \times \text{位深度} \times \text{声道数} \times \text{时长(秒)}}{8}$$

以一首 4 分钟的 CD 质量立体声音乐为例:

$$\frac{44100 \times 16 \times 2 \times 240}{8} = 42{,}336{,}000 \text{ 字节} \approx 40 \text{ MB}$$

40 MB 只是 4 分钟!这就是为什么需要压缩编码。


二、有损压缩 vs 无损压缩:核心原理

所有音频压缩技术都围绕一个核心问题:哪些信息可以扔掉?

有损压缩:利用听觉心理学

有损编码的核心是感知音频编码(Perceptual Audio Coding),利用人耳的以下特性来丢弃"听不出来的数据":

掩蔽效应(Masking):一个强烈的声音会"掩盖"同时出现的较弱声音,被掩盖的部分可以用更少的比特表示甚至直接丢弃。掩蔽分两种:

  • 频率掩蔽:强音频会掩盖同一时刻附近频率的弱音
  • 时间掩蔽:强音之后约 200ms 内,人耳对弱音不敏感

听觉临界频带(Critical Bands):人耳对不同频段的分辨率不同,高频区域分辨率低,可以用更粗糙的方式编码。

MP3、AAC、OGG Vorbis、Opus 都基于这套原理,只是具体算法实现不同。

无损压缩:只做统计冗余去除

无损编码不丢弃任何信息,只利用数据中的统计冗余进行压缩(类似 ZIP 压缩文本文件),解码后能完美还原原始 PCM 数据。代表格式:FLAC、ALAC、WAV(不压缩)。


三、主流 Web 音频格式深度解析

3.1 MP3(MPEG-1 Audio Layer III)

MP3 是互联网音频的"历史遗产",1993 年发布,2017 年专利到期后完全免费。

编码原理:将音频分成 576 个采样点的帧,对每帧做改进型离散余弦变换(MDCT),结合心理声学模型决定每个频带的量化精度,再用霍夫曼编码压缩。

比特率与音质关系

比特率文件大小(4分钟)音质感知
128 kbps~3.7 MB可接受,高频有明显损失
192 kbps~5.5 MB较好,多数人听不出问题
256 kbps~7.3 MB接近透明,难以与原始区分
320 kbps~9.2 MBMP3 最高质量,实际上限

MP3 的缺陷

  • 编码延迟(encoder delay)导致开头和结尾有静默帧,循环播放时会有"咔哒"声
  • 低比特率下高频"金属感"明显(俗称"蚊鸣")
  • 算法相对老旧,同等比特率下质量不如 AAC 和 Opus

浏览器支持:全平台全浏览器支持,是兼容性最好的格式。


3.2 AAC(Advanced Audio Coding)

AAC 是 MP3 的正统继承者,1997 年由 Fraunhofer、Dolby、Sony 等联合制定,是 iTunes、YouTube、流媒体的主流格式。

相比 MP3 的改进

  • 更宽的频带(最高 96 kHz 采样率)
  • 更好的立体声编码(M/S 立体声、强度立体声)
  • 更精细的量化噪声控制
  • 同等比特率下音质优于 MP3,或同等音质下体积更小

AAC 的几个子规格

规格全称特点
AAC-LCLow Complexity最常用,音乐播放主流
HE-AAC v1High Efficiency加入 SBR 频带复制,低比特率下表现优秀
HE-AAC v2在 v1 基础上加入 PS 参数立体声,极低比特率下仍可用
AAC-LD/ELDLow Delay低延迟变体,用于实时通话

MIME 类型audio/aacaudio/mp4; codecs="mp4a.40.2"

浏览器支持:Chrome、Safari、Edge、Firefox(部分平台需要系统解码器)全面支持。iOS/macOS 上是首选格式。


3.3 OGG Vorbis

Vorbis 是 Xiph.Org 基金会开发的完全开源免专利的有损编码格式,容器格式为 OGG。

技术特点

  • 使用 MDCT + 心理声学模型,算法与 MP3/AAC 类似但实现更现代
  • 支持可变比特率(VBR),默认就是 VBR 模式
  • 质量参数 -q 从 -1 到 10,q5(约 160 kbps)是常用的高质量设置
  • 没有专利顾虑,完全免费

局限性:Safari 长期不支持(直到 macOS Ventura 才部分支持),iOS 至今支持有限,这是它没有成为 Web 主流的主要原因。

MIME 类型audio/ogg; codecs="vorbis"


3.4 Opus

Opus 是目前技术上最先进的有损编码格式,2012 年由 IETF 标准化,融合了 Skype 的 SILK(语音编码)和 Xiph 的 CELT(音乐编码)技术。

核心优势

  • 极宽的比特率范围:6 kbps(语音)~ 510 kbps(高质量音乐),一个编码器覆盖所有场景
  • 超低延迟:最低 2.5ms 帧长,适合实时通话(WebRTC 默认使用 Opus)
  • 同等比特率下音质最优:在 64 kbps 以上时,Opus 的音质优于同比特率的 MP3 和 AAC

实测对比(主观音质,相同比特率 128 kbps):

$$\text{Opus} > \text{AAC-LC} > \text{Vorbis} \approx \text{MP3}$$

浏览器支持:Chrome、Firefox、Edge 全面支持;Safari 从 macOS Catalina(2019)开始支持,iOS 从 iOS 16 开始支持。

MIME 类型audio/ogg; codecs="opus"audio/webm; codecs="opus"


3.5 FLAC(Free Lossless Audio Codec)

FLAC 是最流行的无损压缩格式,压缩率约为原始 PCM 的 50~60%,完全开源免费。

适用场景

  • 音乐收藏、归档
  • 需要后期处理的原始素材
  • Hi-Fi 发烧友场景

浏览器支持:Chrome 56+、Firefox、Edge 支持;Safari 11+ 支持。

MIME 类型audio/flac

体积参考(4分钟 CD 质量立体声):

$$\text{WAV(无压缩)} \approx 40\text{ MB} \quad \text{FLAC} \approx 20\text{ MB} \quad \text{MP3 320kbps} \approx 9\text{ MB}$$


3.6 WAV(Waveform Audio File Format)

WAV 是微软和 IBM 联合制定的容器格式,通常存储未压缩的 PCM 数据。

特点

  • 无压缩,体积最大,音质无损
  • 格式极简单,兼容性最好(几乎所有软件都支持)
  • 适合游戏音效(需要极低延迟、随机访问)
  • 不适合 Web 传输(体积太大)

MIME 类型audio/wavaudio/x-wav


3.7 WebM(with Opus/Vorbis)

WebM 是 Google 主导的开放容器格式,音频部分通常使用 Opus 或 Vorbis 编码。

特点

  • 专为 Web 设计,流式传输友好
  • 配合 Opus 编码,是 Web 实时音频的最佳组合
  • Chrome 和 Firefox 原生支持,Safari 支持较晚

MIME 类型audio/webm; codecs="opus"


四、浏览器格式支持矩阵

// 用代码检测浏览器支持情况
function checkFormatSupport() {
  const audio = new Audio();
  const formats = {
    'MP3':        audio.canPlayType('audio/mpeg'),
    'AAC':        audio.canPlayType('audio/aac'),
    'OGG Vorbis': audio.canPlayType('audio/ogg; codecs="vorbis"'),
    'OGG Opus':   audio.canPlayType('audio/ogg; codecs="opus"'),
    'WebM Opus':  audio.canPlayType('audio/webm; codecs="opus"'),
    'FLAC':       audio.canPlayType('audio/flac'),
    'WAV':        audio.canPlayType('audio/wav'),
  };
  console.table(formats);
  return formats;
}

各主流浏览器支持情况(2025 年):

格式ChromeFirefoxSafariEdgeiOS Safari
MP3
AAC✅*
OGG Vorbis⚠️
OGG Opus⚠️
WebM Opus⚠️
FLAC
WAV

✅ 完全支持 ⚠️ 部分版本支持 ❌ 不支持 * Firefox 的 AAC 支持依赖操作系统解码器


五、实战:Web 音频格式最优策略

5.1 生产环境多格式方案

根据上面的支持矩阵,生产环境推荐的格式策略是:

<audio controls>
  <!-- 优先:WebM Opus,现代浏览器最优选择 -->
  <source src="music.webm" type='audio/webm; codecs="opus"' />
  <!-- 备选:AAC,覆盖 Safari 和 iOS -->
  <source src="music.aac" type="audio/aac" />
  <!-- 兜底:MP3,覆盖所有浏览器 -->
  <source src="music.mp3" type="audio/mpeg" />
</audio>

5.2 用 JavaScript 动态选择最优格式

function selectBestFormat() {
  const audio = new Audio();
 
  // 按优先级排列,返回第一个支持的格式
  const candidates = [
    { src: 'music.webm', type: 'audio/webm; codecs="opus"' },
    { src: 'music.ogg',  type: 'audio/ogg; codecs="opus"' },
    { src: 'music.aac',  type: 'audio/aac' },
    { src: 'music.mp3',  type: 'audio/mpeg' },
  ];
 
  for (const candidate of candidates) {
    const support = audio.canPlayType(candidate.type);
    if (support === 'probably' || support === 'maybe') {
      return candidate.src;
    }
  }
 
  return null; // 没有支持的格式
}
 
const audioEl = document.getElementById('player');
const bestSrc = selectBestFormat();
if (bestSrc) {
  audioEl.src = bestSrc;
} else {
  showUnsupportedMessage();
}

5.3 用 FFmpeg 批量转码

在服务端准备多格式文件,推荐使用 FFmpeg:

# 原始文件 → WebM Opus(128kbps,Web 最优)
ffmpeg -i input.wav \
  -c:a libopus -b:a 128k \
  output.webm
 
# 原始文件 → AAC(覆盖 Safari/iOS)
ffmpeg -i input.wav \
  -c:a aac -b:a 128k \
  output.aac
 
# 原始文件 → MP3(兜底兼容)
ffmpeg -i input.wav \
  -c:a libmp3lame -b:a 192k -q:a 2 \
  output.mp3
 
# 原始文件 → FLAC(无损归档)
ffmpeg -i input.wav \
  -c:a flac \
  output.flac
 
# 一次性输出所有格式(批处理脚本)
for f in *.wav; do
  base="${f%.wav}"
  ffmpeg -i "$f" -c:a libopus  -b:a 128k "${base}.webm"
  ffmpeg -i "$f" -c:a aac      -b:a 128k "${base}.aac"
  ffmpeg -i "$f" -c:a libmp3lame -b:a 192k "${base}.mp3"
done

5.4 不同场景的格式推荐

音乐流媒体平台(优先音质和兼容性):

主力:AAC-LC 128~256kbps(兼容 iOS)
辅助:WebM Opus 128kbps(现代浏览器)
兜底:MP3 192kbps

播客/有声书(语音内容,优先低体积):

主力:Opus 32~64kbps(语音质量极佳)
备选:AAC-HE 48kbps
兜底:MP3 96kbps

游戏音效(优先低延迟随机访问):

短音效:WAV(无压缩,最低延迟)
背景音乐:OGG Vorbis / WebM Opus

实时通话/直播(优先极低延迟):

WebRTC 默认:Opus(6~510kbps 自适应)

音乐收藏/归档(优先无损):

FLAC(开源无损)
ALAC(Apple 生态无损)

六、比特率、采样率、音质的关系:常见误区澄清

误区一:"采样率越高越好"

对于普通听音场景,44100 Hz 已经足够覆盖人耳听觉范围(20~20000 Hz)。96 kHz 或 192 kHz 的高采样率,更多是为录音后期处理留余量,而非提升听音体验。更高的采样率反而会带来更大的文件体积和更高的 CPU 解码负担。

误区二:"无损就是最好的"

无损格式保留了原始 PCM 的全部信息,但"原始信息"本身可能就是有损压缩的产物(比如从 MP3 转成 FLAC,并不会提升音质,只是体积变大)。无损的价值在于归档和后期处理,而非"听起来更好"。

误区三:"比特率越高音质一定越好"

不同编码格式的比特率不能直接横向比较。Opus 64 kbps 的主观音质通常优于 MP3 128 kbps。选格式时应该先选编码器,再选比特率。

误区四:"VBR 不如 CBR 稳定"

可变比特率(VBR)在简单段落用低比特率,在复杂段落用高比特率,总体上同等平均比特率下音质优于 CBR,且文件体积更小。Web 场景下 VBR 完全可用,只有需要精确文件大小预测的场景才需要 CBR。


七、本章知识图谱

流程图画布 · 115%
Mermaid 流程图加载中...

小结

音频格式的选择,本质上是音质、体积、兼容性、延迟四个维度的权衡。没有"最好的格式",只有"最适合场景的格式"。理解了编解码的底层原理,你才能在这四个维度之间做出有依据的决策,而不是人云亦云地"一律用 MP3"。

下一章我们进入流媒体音频协议——当音频文件大到无法一次性下载,或者需要实时推送(直播),就需要 HLS、DASH、WebSocket 这些流媒体协议登场了。协议层的理解,是构建直播和点播系统的必备基础。