首页 > 解决方案 > ffmpeg - 使用 -debug mb_type 命令检索视频宏块信息

问题描述

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

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

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

我看到在写了很多无趣的文章之后,开始了一组以

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

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

新框架,类型: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

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

也经常有这样的句子

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

或者

cur_dts 无效(如果在每个流开始时出现一次,这是无害的)

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

标签: videoffmpegframempegffprobe

解决方案


最好的文档似乎是源代码,目前从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


推荐阅读