跳转至

2.音频编码

差不多可以这样理解,但要仔细区分 packed(交错/交错样本 interleaved)planar(分通道 planar),以及 FFmpeg 解码器 vs 编码器 的行为:


1. FFmpeg 解码器(AVCodec 解码)行为

  • 大部分音频解码器输出都是 planar

  • 对于像 AAC、AC3、MP3、Opus 等,内部解码器通常会输出 planar 数据AV_SAMPLE_FMT_FLTPAV_SAMPLE_FMT_DBLP 等)。

  • 原因:planar 结构在多声道处理和 SIMD 优化上更高效。

  • 少数老旧或低级 PCM 解码器可能输出 packed

  • 例如 AV_SAMPLE_FMT_S16(packed)有些解码器直接输出。

  • 但是大部分现代编解码器(AAC、Opus、FLAC)默认是 planar。

  • 总结

解码器输出通常是 planar,而不是 packed。反而是 编码器对大部分格式更倾向于要求 packed


2. FFmpeg 编码器行为

  • 很多音频编码器(AAC、MP3、AC3 等)只接受 packed

  • 如果你传 planar,需要在编码前用 swr_convert() 转为 packed。

  • 这是你常看到的 “FFmpeg 编码器只支持 packed,解码器输出 planar” 的情况。

  • AVSampleFormat API

  • av_get_packed_sample_fmt(fmt) → 获取对应 packed fmt

  • av_get_planar_sample_fmt(fmt) → 获取对应 planar fmt
  • av_sample_fmt_is_planar(fmt) → 判断是否 planar

3. 总结逻辑

方向 输出/输入 数据布局
解码 绝大部分现代音频解码器 planar(多声道分开)
编码 绝大部分现代音频编码器 packed(声道交错)

所以你的结论:

“FFmpeg 大部分音频解码器只支持 packed 数据”

实际上是反过来的:解码器通常输出 planar;编码器通常只支持 packed,需要你手动转换。


如果你需要,我可以帮你列一张 FFmpeg 主流音频编解码器支持的 planar/packed 格式表,方便在 pipeline 中直接判断是否需要 SwrContext 转换。

你想要我列吗?