ffmpeg - 使用-debug mb_type命令

时间:2018-06-14 18:34:47

标签: video ffmpeg frame mpeg ffprobe

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

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

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

我看到在许多不感兴趣的着作之后,从

开始一组块
  

"新框架,键入:[框架类型]"

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

  

新帧,类型:B [h264 @ 000001c0241c1cc0] d< X-<我> > > >   X 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

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

  • 我,我,A,<,>,X,|等是什么意思?

通常还会有像

这样的句子
  

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

  

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

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

1 个答案:

答案 0 :(得分:2)

最好的文档似乎是源代码,目前从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
    • 空间:IS_INTRA || IS_16X16
    • ?:否则
  3. 隔行扫描

    • =:IS_INTERLACED
    • space:not interlaced
  4. 此问题的另一个有趣之处是macro block type visualization built into ffmpeg itself

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