有没有办法从 FFMPEG 或类似程序中提取帧内帧并按原样保存它们?我知道您可以使用将帧提取到 JPEG 图像序列中-f image2
。但那些是每个帧的完整图像。我只想导出运动变化的图像,所以我会让 P 帧和 B 帧仅显示运动变化,排除或屏蔽图像的未变化区域。
这可能吗?
我正在使用的基本帧导出命令。这将以指定的 FPS 为我提供每帧的完整图像。
ffmpeg -i input.mp4 -r 12 -an -b 1024k -y -f image2 frame%4d.jpg
我希望导出这些帧,这样我就有了一个帧文件夹,其中第一帧是完整图像,下一帧只是需要重新绘制图像的图像数据。暴露两帧之间的时间冗余(这难道不是 I、P、B 帧的作用吗?)
答案1
要提取特定类型的框架,请使用select
筛选:
select=eq(pict_type\,<x>)
其中是<x>
下列之一:pict_type (video only) the type of the filtered frame, can assume one of the following values: I, P, B, S, SI, SP, BI
例如:
ffmpeg -i <inputfile> -vf '[in]select=eq(pict_type\,B)[out]' b.frames.mp4
要了解有关输出的更多信息,请添加showinfo
筛选:
ffmpeg -i <inputfile> -vf '[in]select=eq(pict_type\,B),showinfo[out]' b.frames.mp4
答案2
P 帧和 B 帧通常不包含每个已更改区域的新图像数据。相反,图片被分解为不同类型的宏块。某些类型的宏块包含新图像数据,但大多数宏块根据其他参考图片和运动矢量计算内容。
这并不完全是您想要的,但是这将使用颜色来显示每个宏块的类型:
ffmpeg -debug vis_mb_type -i input.mp4 output.mp4
或者
ffplay -debug vis_mb_type input.mp4
这还将向您显示运动矢量:
ffplay -debug vis_mb_type -vismv 7 input.mp4
有关每个 MB 颜色的更多信息,请参阅链接: