FLAC 格式与无损压缩

从元数据块、音频帧到为什么 FLAC 适合存档

Posted by Yvain Zhang on July 14, 2021 主题:技术

提到无损音频,很多人第一个想到的就是 FLAC。它的地位并不只是“音质好”,而是它在开放性、可校验性、解码成本和生态支持之间找到了一个很稳的平衡。

这篇主要看三件事:

  1. FLAC 为什么适合长期保存音频
  2. 它的文件结构是怎么组织的
  3. 编解码主线大概在做什么

1. FLAC 和 MP3 的根本区别

最核心的区别只有一句话:

  • MP3 是有损压缩
  • FLAC 是无损压缩

无损的意思不是“听起来更像原音”,而是解码后的 PCM 和编码前输入的数据可以逐字节对应地还原。

这让 FLAC 很适合下面几类场景:

  • 音乐归档
  • 音频处理中间格式
  • 对完整性要求高的收藏或备份

2. 为什么 FLAC 在工程上很受欢迎

FLAC 被长期使用,不只是因为“无损”,还因为它在工程上比较顺手。

开放

格式公开、实现公开、专利负担也相对轻,这对长期可维护性很重要。

解码快

FLAC 的设计明显更偏向于让解码稳定且成本低。也就是说,它宁愿在编码阶段多花点力气,也希望播放和读取阶段尽量轻量。

可校验

它的元数据和帧结构里都内置了校验思路,比如:

  • 帧级 CRC
  • 原始音频的 MD5

这让“文件有没有坏”和“解码输出是否可信”更容易确认。

元数据能力强

它不只是存音频,还能比较规整地存:

  • 标签
  • 定位表
  • cue 信息
  • 图片

3. FLAC 文件大体长什么样

可以先把 FLAC 看成三段:

  1. 文件起始标记 fLaC
  2. 一组 metadata block
  3. 一串 audio frame

也就是说,FLAC 不是单纯“头 + 数据”,它前面有一套清晰的元数据块机制。

4. STREAMINFO 为什么必须先出现

FLAC 的 metadata block 里,最关键的是 STREAMINFO,而且它必须是第一个。

它通常给出这些基础信息:

  • 采样率
  • 声道数
  • 位深
  • 总采样数
  • 最小 / 最大块大小
  • MD5

解码器拿到这块,才知道后面的音频流大体长什么样。所以它相当于整个流的“总说明书”。

5. 其他 metadata block 有什么用

除了 STREAMINFO,常见的还有:

  • PADDING
  • SEEKTABLE
  • VORBIS_COMMENT
  • CUESHEET
  • PICTURE

它们里最实用的几个是:

SEEKTABLE

用来支持更快的定位。对长音频文件来说,这能减少拖动和跳转时的成本。

VORBIS_COMMENT

相当于标签区,常见的标题、专辑、作者等信息通常放这里。

PICTURE

用来放封面图。很多播放器能直接显示专辑封面,靠的就是这个块。

6. 音频帧在 FLAC 里怎么组织

metadata block 之后就是音频帧。FLAC 的音频帧设计有几个很实用的特点:

  • 每帧都能相对独立解码
  • 有同步信息
  • 有 CRC 校验

这意味着:

  • 定位和恢复都更容易
  • 流式处理更自然
  • 某一帧损坏时,影响范围通常不会扩散得特别夸张

7. FLAC 是怎么压缩的

FLAC 的压缩逻辑,不是“神秘黑箱”,而是几步比较清楚的组合。

分块

先把原始 PCM 按 block 切开。块太小会增加头部和管理开销,块太大又不利于建模,所以要取一个平衡。

声道相关性处理

立体声左右声道通常有相关性,所以 FLAC 会考虑:

  • 独立编码
  • left-side
  • right-side
  • mid-side

这一步的目的,是减少重复信息。

预测建模

FLAC 会尝试用更小的模型去逼近原始样本,比如:

  • 固定预测
  • 线性预测(LPC)

如果预测得好,真正需要编码的残差就更小。

残差编码

最后把预测剩下的误差再编码保存。

所以整条主线可以简化成:

PCM -> 分块 -> 声道处理 -> 预测 -> 残差编码

8. 为什么说 FLAC 更适合存档

从长期使用角度看,FLAC 比很多格式更适合做保存底稿,原因主要是:

  • 无损
  • 开放
  • 可校验
  • 元数据能力完整
  • 后续转码空间大

如果以后你要再转成 AAC、MP3、Opus 之类,拿 FLAC 做源往往更合适,而不是拿已经有损过一次的文件继续二次压缩。

9. 工程上排查 FLAC 问题时看什么

播放器能读标签但播不出来

先分两层看:

  • metadata block 是否正常
  • 音频帧是否损坏或参数异常

文件能播但定位不准

重点看:

  • SEEKTABLE 是否存在
  • 总采样数和帧信息是否一致

怀疑文件损坏

这时候 FLAC 自带的校验能力就很有价值,可以优先核对:

  • 帧级 CRC
  • 整体 MD5

10. 总结

如果把 FLAC 只看成“更大的音频文件”,其实低估了它。

更准确一点,它是一种很适合长期使用的无损音频容器 / 编码体系,优点集中在:

  • 数据可还原
  • 结构清楚
  • 元数据能力完整
  • 解码成本可控

所以它在“归档、收藏、音频处理中间格式”这些场景里一直都很稳。