当我使用最新版本的 FFMPEG 以最大压缩级别 (12) 压缩我的所有 FLAC 文件时,发现其中一些文件后来变得更大了。
这怎么可能呢?即使使用非 FFMPEG 软件对 FLAC 进行编码,而且它们比 FFMPEG“效率更高”,但它仍然是 FLAC(无损声音)文件。它们怎么能都生成有效的 FLAC,遵循相同的标准,但大小却不同呢?
其中一些 FLAC 是 2007 年的,使用了 libFLAC 之类的东西。2007 年的工具怎么会比 2022 年的 FFMPEG 压缩效果更好?如果是相同的数据,两者都是无损的,并且都使用 FLAC 文件格式/标准,它们的大小怎么可能不同?
这确实让我困惑不已。
答案1
FLAC 使用的概念非常简单:将输入音频分成多个块,每个通道用一个(简单)数学模型来近似该块中的音频。这个模型称为预测器。由于这种近似并不精确,因此也会存储差异(所谓的残差),这使得 FLAC 成为无损的。
当预测器(数学模型)与音频数据拟合得很好时,残差占用的空间比原始音频数据少得多。在这种情况下,预测器会从信号中消除冗余。但是,如果选择的预测器与音频数据拟合得不好,残差占用的空间会比原始音频数据多得多。因此,也可以“膨胀”数据而不是压缩数据!
然而,找到导致最小残差的预测器并非易事。有几种不同的方法可以找到合适的预测器,但没有一种方法是“最好的”。预测器不是 FLAC 保持无损的最佳方法并不重要:只要残差信号对于该特定预测器来说是正确的,数据就可以无损存储。
这意味着旧的 FLAC 压缩器可能使用的方法优于新的 FLAC 压缩器(本例中为 ffmpeg)。也许会发现新方法对于 95% 的输入会生成较小的文件,但对于 5% 的输入会生成较大的文件。
此外,ffmpeg 和 FLAC 都有压缩级别。较低的压缩级别要么限制预测器的复杂性(例如,为了加快解码速度),要么限制编码器搜索最佳预测器的方式。较低的压缩级别通常只选择一个预测器并使用该预测器进行压缩,而较高的压缩级别通常会尝试几个(或多个)不同的预测器来找到最佳预测器。对于一个简短的音频文件来说,尝试所有可能的预测器将需要数百年的时间。