音频格式转换不是改个后缀:mp3转wav的采样率与码率实测

0 阅读4分钟

最近给一个语音处理的练手项目准备数据,处理管线只认 wav,手里攒的素材全是 mp3。第一反应是把后缀改了,被同行一句话拦下来:"你改的不是格式,是文件名。"仔细把音频编码这块捋了一遍,顺便实测了一次完整的转换过程,记录下来。

一、mp3 里存的是什么

mp3 是典型的感知编码格式。它的核心思路不是"把声音原样压缩",而是利用人耳的听觉遮蔽效应:强信号会掩盖邻近频段的弱信号,人耳对 16kHz 以上的高频也不太敏感。编码器据此做两件事:

  • 通过心理声学模型计算每个频段的"可感知阈值";
  • 把听不见或几乎听不见的成分直接丢弃或大幅量化,再对剩下的数据做 MDCT 变换和熵编码。

所以 mp3 文件里存的已经是频域数据 + 量化结果,不是波形本身。这也是为什么 128kbps 的 mp3 听起来和原始 PCM 差别不大,但频谱图上看高频是被"削"过——编码的时候就已经丢了。

二、wav 里存的又是什么

wav 大多数情况下是一个 RIFF 容器,里面装着 PCM 裸数据:按固定采样率、固定位深,把每个采样点的振幅值原样排列。44.1kHz、16bit、双声道的 PCM,每秒数据量是 44100 × 2字节 × 2 = 176.4KB,一分钟约 10MB。没有压缩、没有心理声学模型,所见即所得。

一个是"记了重点的频域摘要",一个是"逐点记录的波形账本",两者之间的转换注定不是无损往返。

三、改后缀会发生什么

song.mp3 改成 song.wav,文件系统里只是换了个名字,字节一个没变。播放器靠文件头判断真实格式,改名的文件要么播不出来,要么播放器宽容地按 mp3 解码了——但那个"假装是 wav"的文件交给要求严格格式输入的处理管线时,八成会直接报错。这也是为什么有些工具"改完名能听",进了剪辑软件却不认。

四、真正的转换做了哪几步

一次规范的 mp3 → wav 转换,内部大致是:

  1. 解码:对 mp3 做 MDCT 逆变换、反量化,还原出 PCM 采样点。这一步只能还原出"编码后剩下的信息",丢掉的高频回不来;
  2. 重采样(如果目标采样率不同):用插值滤波器把 44.1kHz 变成 48kHz 之类。重采样本身是数学运算,但抗混叠滤波器的设计会影响高频还原;
  3. 位深调整:16bit 转 24bit 是补零,反过来要加抖动(dither)避免量化失真;
  4. 写容器:按 RIFF 规范写入头信息和 PCM 数据。

注意全程没有任何一步能找回 mp3 编码时丢弃的信息。这就是"有损转无损"的本质:格式是 wav 的,音质还是 mp3 的。

五、实测记录

拿一段 3.13MB 的 mp3(128kbps 档)实测。这次我在浏览器里用工具派的音频格式转换器做的,目标格式选 WAV:

screenshot_01.png

转换是本地完成的,没有上传环节。处理完成后拿到的 wav 文件,体积从 3.13MB 涨了好几倍——符合 PCM 的数据量估算,时长和原文件一致。

screenshot_02.png

两个细节值得记录:

  • 体积涨了不等于音质涨了。wav 的大体积只是"按波形逐点记录"的正常开销,音质上限仍然是那次 mp3 编码决定;
  • 时长严格一致。如果转完发现时长变了,多半是转换过程中采样率处理有误,这类文件进管线会出对齐问题。

screenshot_03.png

六、什么时候转换才真正有损

  • 有损 → 无损(mp3 → wav):不再引入新损失,但 MP3 已有的损失永久保留;
  • 有损 → 有损(mp3 → aac):两次量化叠加,代际损失最伤,尽量避免;
  • 无损 → 有损(wav → mp3):这是唯一"值得纠结码率"的方向,128k 日常够用,存档建议 320k。

所以下次要 wav 的时候,最优先的永远是回头找原始录音,而不是把 mp3 转一遍——转换解决的是"格式不匹配",不是"音质不够"。

项目地址:gjupai.com