2.音频编码
差不多可以这样理解,但要仔细区分 packed(交错/交错样本 interleaved) 和 planar(分通道 planar),以及 FFmpeg 解码器 vs 编码器 的行为:
1. FFmpeg 解码器(AVCodec 解码)行为¶
-
大部分音频解码器输出都是 planar:
-
对于像 AAC、AC3、MP3、Opus 等,内部解码器通常会输出 planar 数据(
AV_SAMPLE_FMT_FLTP、AV_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 fmtav_sample_fmt_is_planar(fmt)→ 判断是否 planar
3. 总结逻辑¶
| 方向 | 输出/输入 | 数据布局 |
|---|---|---|
| 解码 | 绝大部分现代音频解码器 | planar(多声道分开) |
| 编码 | 绝大部分现代音频编码器 | packed(声道交错) |
所以你的结论:
“FFmpeg 大部分音频解码器只支持 packed 数据”
实际上是反过来的:解码器通常输出 planar;编码器通常只支持 packed,需要你手动转换。
如果你需要,我可以帮你列一张 FFmpeg 主流音频编解码器支持的 planar/packed 格式表,方便在 pipeline 中直接判断是否需要 SwrContext 转换。
你想要我列吗?