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

fab*_*gua 2 video mpeg ffmpeg frame ffprobe

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

ffmpeg -debug mb_type -i input.mp4 out.mp4 2> macroblocks.txt
Run Code Online (Sandbox Code Playgroud)

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

看到很多无趣的文字后,开始了一组以

“新框架,类型:[框架类型]”

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

新框架,类型:B [h264 @ 000001c0241c1cc0] d < X- < I > > > X ddddd < < d < d > < dd > d < ddd < > < d < > X < dd > d X d < > d X d > > d d+ d

从理论上我知道有内部或预测的宏块,但我不明白如何从“新帧”块中解析这些信息。

  • i、I、A、<、>、X、|等是什么意思?

也经常有这样的句子

nal_unit_type:1(非 IDR 图片的编码切片),nal_ref_idc:2

或者

cur_dts 无效(如果它在每个流开始时发生一次,则无害)

我真的不明白......我也找不到文档......任何人都可以帮助我吗?

mic*_*137 5

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

每个宏块由 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
    • 空间: IS_INTRA || IS_16X16
    • ?: 除此以外
  3. 交错

    • =: IS_INTERLACED
    • 空间:不隔行

在这方面同样有趣的是ffmpeg 本身内置宏块类型可视化

对于 NAL 单元类型,请参见此处的表 7-1