ffmpeg - 使用 -debug mb_type 命令检索视频宏块信息

ffmpeg - Retrieving video macroblock info with -debug mb_type command

我正在尝试获取有关视频帧 (mp4) 中所有 宏块 的信息。 特别是我正在使用 ffmpeg 命令:

ffmpeg -debug mb_type -i input.mp4 out.mp4 2> macroblocks.txt

它似乎工作正常,但是...我不明白如何解析输出

看了很多无趣的写法,开始了一组

开头的block

"New frame, type: [FRAME TYPE]"

所以我假设这些是指包含每个宏块类型的每个帧的块..但是里面的符号是什么意思?

New frame, type: B [h264 @ 000001c0241c1cc0] d < X- < I > > > > X d d d d d < < d < d > < d d > d < d d d < > < d < > X < d d > d X d < > d X d > > d d+ d

从理论上我知道有内部或预测的宏块,但我不明白如何从 "New frame" 块中解析此信息。

也经常有

这样的句子

nal_unit_type: 1(Coded slice of a non-IDR picture), nal_ref_idc: 2

cur_dts is invalid (this is harmless if it occurs once at the start per stream)

我真的不明白... 我找不到 文档.. 谁能帮帮我?

最好的文档似乎是源代码,目前从 line 196 of libavcodec/mpegutils.c 开始。我不会在这里重复所有内容,仅足以理解上面给出的示例行。

每个宏块由 3 个字符描述:

  1. 类型和运动矢量方向

    • d: IS_DIRECT && IS_SKIP
    • <: !USES_LIST(0) - 对未来的引用(列表 1,B 切片)
    • X: USES_LIST(0) && USES_LIST(1) - 参考过去和未来(清单 1 和 2,B 部分)
    • >:!USES_LIST(1) - 参考过去(列表 0、P 或 B 片段)
    • 更多请看代码
  2. 分段

    • +: IS_8X8
    • -: IS_16X8
    • |: IS_8X16
    • space: IS_INTRA || IS_16X16
    • ?: 否则
  3. 隔行扫描

    • =: IS_INTERLACED
    • space: 非交错

在这方面也很有趣的是 macro block type visualization built into ffmpeg itself

对于 NAL 单元类型,请参阅 table 7-1 here