ffmpeg 中的 -vismv 和 vis_mb_type 的数字和颜色代表什么?

ffmpeg 中的 -vismv 和 vis_mb_type 的数字和颜色代表什么?

执行完命令后,-vismv我看到给出了许多不同的值。我找不到任何关于这些数字的作用的解释,而且更改它们也看不出有什么区别!

此外,我正在使用命令-debug vis_mb_type,可以直观地看到块类型。红色代表新块,但绿色和无色代表什么?在 I 帧上,我还看到一些文件中有紫色!

MP4 文件上的示例命令:

ffmpeg -debug vis_mb_type -vismv 1 -i inputfile.mp4 -vcodec mjpeg -q:v 0 output.avi

编辑:对此进行进一步挖掘……我相信绿色块是预测出来的,但并未移动,而单色无色块与 I 帧相比没有变化。但仍然无法弄清楚红色/紫色!

答案1

vismv选项

没有数字可以作为-vismv参数传递。仅支持以下数字:

  • pf– P 帧的前向预测 MV
  • bf– B 帧的前向预测 MV
  • bb– B 帧的后向预测 MV

我假设如果您使用整数,它们分别映射到 1、2 和 3。

vis_mb_type

我查看了代码,在 中找到了匹配的部分mpegvideo.c,从第 2029 行开始。它将COLOR(theta, r)值转换为使用以下函数从 YUV 颜色空间获取值:

#define COLOR(theta, r) \
    u = (int)(128 + r * cos(theta * 3.141592 / 180)); \
    v = (int)(128 + r * sin(theta * 3.141592 / 180));

以下是每个宏块类型的颜色值,包括它们的 UV 值和匹配的 RGB 颜色Y = 128


  • COLOR(120, 48), UV(104, 169.57), RGB(184, 107, 86)
    健康)状况:IS_PCM (== MB_TYPE_INTRA_PCM)


  • COLOR(30, 48), UV(169.57, 152), RGB(160, 97, 200)
    健康)状况:IS_INTRA && IS_ACPRED) || IS_INTRA16x16


  • COLOR(90, 48), UV(128, 176), RGB(193, 94, 128)
    健康)状况:IS_INTRA4x4


  • COLOR(150, 48), UV(86.43, 152), RGB(160, 125, 55)
    健康)状况:IS_DIRECT


  • COLOR(170, 48), UV(80.73, 136.34), RGB(139, 138, 46)
    健康)状况:IS_GMC && IS_SKIP


  • COLOR(190, 48), UV(80.73, 119.66), RGB(116, 149, 46)
    健康)状况:IS_GMC


  • COLOR(240, 48), UV(104, 86.43), RGB(71, 165, 86)
    健康)状况:!USES_LIST(mb_type, 1))


  • COLOR(0, 48), UV(176, 128), RGB(128, 111, 211)
    健康)状况:!USES_LIST(mb_type, 0))


  • COLOR(300,48), UV(152, 86.43), RGB(71, 148, 169)
    条件:USES_LIST(mb_type, 0) && USES_LIST(mb_type, 1))——因此,assert当断言失败时,它可能会或可能不会中止程序执行。

我还没有测试过,但我觉得这样就对了。有关调试开关和宏块颜色的信息也FFmpeg wiki 上有解释

相关内容