音频格式、码率,以及为什么这一首听起来更响

如何在 MP3、AAC、Opus、WAV 和 FLAC 之间取舍,采样率和位深度真正改变的是什么,以及为什么按峰值做归一化会让一段安静的录音依旧安静。

母版要保持无损,制作过程中用 WAV,存档用 FLAC。当你清楚文件会在什么设备上播放时,交付 AAC 或 Opus;不清楚时交付 MP3。语音内容以单声道、低码率输出。用 LUFS 而不是峰值来定电平,并在满刻度之下留出一分贝的余量。

这就是结论。下面解释为什么。

每种格式各自的用途

格式类型适用场景每分钟体积支持情况
WAV原始 PCM母版10.6 MB通用
FLAC无损存档5 到 7 MB广泛
MP3有损未知的播放器1.4 MB(192 kbps)到处都能播
AAC有损应用、视频0.9 MB(128 kbps)通用
Vorbis (OGG)有损游戏0.9 MB(128 kbps)桌面端
Opus有损语音、网页0.7 MB(96 kbps)较新的软件

无损意味着解码出来的采样与输入的完全一致;FLAC 节省空间的办法是根据前面的采样预测下一个采样,只存储预测误差。有损格式则依据一个“耳朵察觉不到什么”的模型,永久性地丢弃信息。

uncompressed   44100 x 16 x 2 / 8 = 176400 B/s = 10.6 MB per minute
lossy          192000 / 8 x 60    = 1.44 MB per minute

采样率与位深度

采样率是对波形测量的频次。奈奎斯特极限指出,采样信号只能携带不超过采样率一半的频率,再高就没有了,所以 44.1 kHz 覆盖 22.05 kHz 以下的一切,而人耳的听力上限在 20 kHz 附近,随年龄增长还会更低。配合视频时用 48 kHz;更高的采样率只在制作阶段有帮助。

位深度决定的是动态范围,不是细节。每一位大约值 6 dB,所以 16 位把本底噪声压在满刻度以下约 96 dB 处,24 位约 144 dB,其中转换器实际能兑现的大概是 120 dB。这些位是录音时的余量:录制时把电平留得保守一些,事后再抬起来,而不会同时抬起可闻的嘶声。已经完成并调好电平的文件不需要它们。

上采样什么也得不到:把 44.1 kHz 插值到 96 kHz 只会让文件翻倍,却没有增加任何信息,而补到 24 位也会把原来的本底噪声一起带上。每一次重采样都要跑一遍滤波器,所以往 48 kHz 走一趟再回来,是白白付出的一点点损失。

码率,以及再往上加就不再有用的位置

素材MP3AACOpus
语音,单声道644824 到 32
口语内容,立体声1288048
音乐,日常够用19212896
音乐,挑不出毛病256 到 320192128 到 160

数字的单位是 kbps。MP3 在两头都显出了年纪:低于大约 96 kbps 时会出现能听见的涂抹感,而高于大约 192 kbps 之后改善就很难听出来了,所以 320 kbps 买到的是心安而不是音质。AAC 只需要大约三分之二的码率就能达到同样的效果。Opus 又更进一步,而且码率越低它的领先幅度越大,因为在低带宽下它会切换到一种围绕语音产生方式设计的模式,于是用 MP3 需要 64 kbps 的人声,在它这里用一半的码率就够了。

把一个有损文件转成另一个有损文件时提高码率,什么也恢复不了。一个 128 kbps 的 MP3 用 320 kbps 重新编码,只会把小文件里的编码瑕疵忠实地保存进一个大文件,而第二个编码器还要花比特把这些瑕疵当成真实的音频来处理。请从无损母版开始做。

单声道、立体声与下混

在同等音质下,立体声的开销大约是单声道的两倍。一个人对着一支麦克风说话,本来就不产生立体声信息,所以一份立体声的口语文件其实是两条几乎相同的声道,转成单声道能把体积减半而没有任何损失。音乐和空间录音则保持立体声。

下混并不是免费的。下混会把两个声道做平均,因此左右之间反相的成分会相互抵消:一个加宽效果,或者一条接反了的麦克风线,可能只在单声道下变薄甚至消失。发布之前先检查一遍,并衰减大约 3 dB,因为相加会抬高电平。

峰值、RMS 与 LUFS

峰值是最高的采样值,单位是 dBFS,0 是数字世界不可逾越的天花板。按峰值归一化会缩放整个文件,让其中最响的那个采样正好落在目标值上,所以一段安静的录音里如果有一声关门响,它依旧是安静的:那声关门被顶到了天花板,其余一切几乎没动。RMS 是在一个时间窗内对能量求平均,比峰值更接近人听到的感觉,但它把 60 Hz 和 3 kHz 一视同仁。LUFS 则对测量做了加权以模拟听觉,会把安静段落门限掉,并对整个节目给出一个数字。各个平台测的都是 LUFS。

投放目标常见目标值
Spotify、YouTube、Amazon Music约 -14 LUFS
Apple Music约 -16 LUFS
播客立体声 -16 LUFS,单声道 -19 LUFS
欧洲广播(EBU R 128)-23 LUFS

因为平台会把所有内容都拉向一个目标值,把母带做得更响已经不再等于播得更响了;平台会把音量调下去,听众得到的是被压扁的动态,却没有换来响度。响度战争就是这样结束的:二十年越来越狠的限幅,让母带的峰值和平均电平之间几乎不剩空隙,听上去平板而疲劳。

削波是指本该超过满刻度的采样被截断到最大值,波形顶部被削平,从而产生谐波失真。真峰值更进一步:在采样之间重建出来的波形,可能高于存储下来的最高采样,所以一个测得 -0.1 dBFS 的文件可能达到 +0.5 dBTP,并在输出时削波。把上限留在 -1 dBTP,如果后面还要做有损编码就再低一些。音量工具可以按目标值做归一化,而不是只按固定的分贝数平移。

咔嗒声、拼接与裁剪

在任意一点切开波形,切点通常处在某个周期的中途,取值不为零,于是输出在一个采样之内就掉到了静音。这一步跃变是一个宽带脉冲,听起来就是一声咔嗒。在每个剪辑点加上五到二十毫秒的淡入淡出就能消除它,而这段时间短到听不出来;在拼接处,十到五十毫秒的交叉淡化还要更干净。

拼接需要双方一致。这些文件必须采样率相同,因为把一个 48 kHz 的文件接进 44.1 kHz 的流里,播放速度会慢大约百分之九、音高也随之降低;声道数也必须相同,否则某一段会落到错误的声道上。响度同样要匹配。用音频转换工具重采样,用音量工具调平,然后再做音频合并。刻意的变速交给音频变速工具:重采样会让音高和速度一起移动,而要保持音高就得做时间伸缩,那可能会让瞬态变得涂抹。

裁剪则完全可以跳过重新编码,且不损失任何音质。WAV 能精确到采样,因为裁剪就是字节复制;压缩格式由帧构成,直接复制的切口只能落在帧边界上。

MP3 frame = 1152 samples = 26.12 ms at 44.1 kHz
cut asked for at 12.000 s
nearest boundaries: frame 459 = 11.990 s, frame 460 = 12.016 s

AAC 使用 1024 个采样的帧,在 48 kHz 下约 21 ms,Opus 通常使用 20 ms 的包。MP3 还有一个比特池,允许某一帧向前面的帧借用空间,所以切口之后的第一帧可能缺少数据而出现杂音。如果边界必须精确,就让音频裁剪工具重新编码,并接受这一代的损失。

浏览器能啃下多少

这一切都发生在内存里。文件在能够被测量、淡化、拼接或重新编码之前,都要先解码成原始采样,通常是 32 位浮点:一小时 44.1 kHz 的立体声,按 16 位 PCM 算约 635 MB,解码之后是 1.27 GB。一个标签页的内存上限远低于桌面应用能寻址的范围,所以真正的限制是时长,而不是格式。先裁剪,或者把长录音拆开处理完再合并。