一段素材的旅程往往是这样:手机里存成 M4A,剪辑软件要求 WAV,为了发微信群压成 MP3,上传平台前又被转了一次 AAC。每一步看起来都只是「换个格式」,代码跑完还显示成功。可等你在耳机里把最终文件和最初的录音对比一遍,会发现高频像被蒙了一层纱——不是哪一步明显出错,而是每转一次,声音就离原版远一点。
放大器一:量化噪声只加不减
第一个放大器最直接:每做一次解码再编码,就叠进一层新的量化噪声(quantization noise)。
第一次压缩时,编码器按掩蔽模型丢掉一部分细节,同时也把量化误差藏在被丢掉的频段附近;第二次编码面对的已经不是原始信号,而是「原始信号 + 第一代误差」。它会把这团误差当成有用信号的一部分重新建模,于是误差被二次分配、叠加。转三到四轮之后,安静段里的颗粒感会明显上来,底噪比原文件高出一截。
放大器二:砖墙截断的上限被逐代压下来
第二个放大器作用在频带顶端。低码率有损编码会在高频画一条「砖墙」:超过某个频率的细节直接归零。128kbps 的 MP3 大致把砖墙立在 16kHz 附近,之上基本不存东西。
问题在于,第二代编码器看到的频谱高段已经是「秃的」。它在做掩蔽判断时,不会去还原不存在的细节,只会在现有能量分布上继续做取舍——可丢的范围只会更大。也就是说,第一代丢掉的高频,不仅不会回来,还会让后续每代「更没什么可保」的。MP3→AAC→MP3 走三轮,高频发闷几乎是必然而非巧合。
放大器三:帧与窗的决策被反复放大
第三个放大器藏在编码器内部。有损编码是按帧、按窗逐段分析的:遇到瞬态(鼓点、辅音起音)时用短窗压低预回声(pre-echo),遇到平稳段用长窗保频率分辨率。
这套决策依赖对输入信号的判断。当输入本身就是上一代编码的产物时,前代留下的误差会干扰瞬态检测——该判为瞬态的段落可能被当成平稳段,短窗没开,预回声被放大;而已经存在于信号里的振铃,又会在这一代被当作真实瞬态再处理一次。误差不在同一步累加,却会互相喂大。
省事版方法
真正省事的做法,是把「压一次」当成硬约束写进流程。
第一步,确定母版:所有编辑都在无损文件上做,导出也先留一份无损。第二步,分清「工作格式」和「分发格式」:工作阶段用 WAV 转封装过渡,只有最终交付那一步才做有损编码。第三步,必须级联时,选链路里最高的那个码率,不让任何一代掉到低码率档,避免高频砖墙被逐代压低。第四步,批量转码时把参数固定下来,保证同一批文件走的是同一条链路。
收尾:把「第几代」当成一个指标
级联转码的损耗不是某一环的锅,而是「代」这个维度在悄悄累积。以后再看到格式转换,先问一句:这是第几次有损编码?把代际数压到 1,比事后用均衡器救高频省事得多。