第四章:音频格式与编解码 —— 听懂格式背后的取舍逻辑
你有没有想过,为什么同一首歌要准备 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 Hz | CD 标准,绝大多数音乐 |
| 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 MB | MP3 最高质量,实际上限 |
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-LC | Low Complexity | 最常用,音乐播放主流 |
| HE-AAC v1 | High Efficiency | 加入 SBR 频带复制,低比特率下表现优秀 |
| HE-AAC v2 | — | 在 v1 基础上加入 PS 参数立体声,极低比特率下仍可用 |
| AAC-LD/ELD | Low Delay | 低延迟变体,用于实时通话 |
MIME 类型:audio/aac 或 audio/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/wav 或 audio/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 年):
| 格式 | Chrome | Firefox | Safari | Edge | iOS 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"
done5.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。
七、本章知识图谱
小结
音频格式的选择,本质上是音质、体积、兼容性、延迟四个维度的权衡。没有"最好的格式",只有"最适合场景的格式"。理解了编解码的底层原理,你才能在这四个维度之间做出有依据的决策,而不是人云亦云地"一律用 MP3"。
下一章我们进入流媒体音频协议——当音频文件大到无法一次性下载,或者需要实时推送(直播),就需要 HLS、DASH、WebSocket 这些流媒体协议登场了。协议层的理解,是构建直播和点播系统的必备基础。