AAC 基础与编码工具

理解 profile、容器关系与工程上的实际取舍

Posted by Yvain Zhang on May 9, 2021 主题:技术

AAC 在音视频链路里太常见了,常见到很多人默认知道它,但真问到 profile、封装关系和工具链差别时,往往又说不太清。

1. AAC 为什么重要

如果只从工程角度看,AAC 值得用的原因其实很直接:同样码率下,通常比 MP3 更划算。

它在工程里常见,是因为它同时满足几件事:

  • 压缩效率较高
  • 生态成熟
  • 容器支持广
  • 在视频音轨里很常见

很多 MP4 / M4A 文件里的音频流,实际上就是 AAC。

2. AAC 的基本编码思路

AAC 属于感知编码。它不是简单粗暴地把所有数据都保留下来,而是尽量保留人耳更敏感的信息,压缩掉不那么容易感知的部分。

粗略看,它大概做三件事:

  1. 把时域信号转换到频域
  2. 根据心理声学模型判断哪些频谱成分更重要
  3. 对频谱做量化、编码和比特分配

数学细节可以后看,但目标先要记住:码率有限的时候,尽量别把听感毁得太厉害。

3. AAC profile 不能忽略

很多 AAC 兼容性问题,其实不是 AAC 本身的问题,而是 profile 选错了。

常见 profile 有:

  • AAC-LC
  • HE-AAC
  • HE-AAC v2

先这么记就够了:

  • AAC-LC:最常见、兼容性最好
  • HE-AAC:偏低码率优化
  • HE-AAC v2:更低码率场景下继续优化

如果没有特别明确的低码率目标,工程上通常优先从 AAC-LC 开始,因为它最稳。

4. AAC 和容器的关系

一个非常常见的误区是把 AAC 和 M4A、MP4 混成一回事。实际上:

  • AAC 是编码格式
  • MP4 / M4A 是容器

所以一个 .m4a 文件常常“里面是 AAC”,但两者不是同一个层面的概念。

调试时要分开看:

  • 你在检查的是容器问题
  • 还是音频流本身的编码问题

5. 工程里最常见的使用场景

AAC 经常出现在这些地方:

  • 视频文件的音轨
  • M4A 音频文件
  • HLS / TS 流
  • 移动端媒体内容
  • 直播、点播链路

选择 AAC 往往是因为它在兼容性、质量和体积之间取得了比较平衡的结果。

6. 常见编码工具和实现

工程里常见 AAC 编码来源包括:

  • FFmpeg 自带 AAC 编码器
  • libfdk_aac
  • 平台硬件编解码能力
  • 系统内置多媒体框架

不同实现之间的差异,通常体现在:

  • 编码质量
  • 低码率表现
  • 性能
  • 许可证限制

如果只是通用转码,FFmpeg 往往足够;如果是产品级场景,还要同时评估平台支持和授权问题。

7. 排查 AAC 问题时应该优先看什么

很多 AAC 播放异常或转码异常,优先看下面这些信息:

  • 采样率
  • 声道数
  • 比特率
  • profile
  • 封装格式
  • 头信息是否正确

实际问题里最常见的并不是“算法错了”,而是:

  • profile 和目标设备不兼容
  • 容器与音频流信息不匹配
  • 采样率或声道配置超出预期

8. 总结

看 AAC 时,先把这三件事分开:

  • AAC 是编码格式
  • AAC 有不同 profile
  • AAC 常常装在 MP4 / M4A / TS 等容器里

只要把这三层关系理顺,后续再看转码、封装、播放器兼容性问题,就不会总是把“编码”和“容器”混成一件事。