使用ffprobe / ffmpeg以编码顺序提取单个帧和类型

时间:2018-01-24 09:14:44

标签: python ffmpeg keyframe ffprobe

我可以使用ffmpeg提取关键帧。像我一直在使用的东西:

ffmpeg -i input.mp4 -vf "select='eq(pict_type\,I)" -vsync vfr -qscale:v 2 I-thumbnails-%02d.png -vf "select='eq(pict_type\,B)" -vsync vfr -qscale:v 2 B-thumbnails-%02d.png -vf "select='eq(pict_type\,P)" -vsync vfr -qscale:v 2 P-thumbnails-%02d.png

现在的问题是,我希望这些提取的帧按编码顺序排列,如果可能的话,它们的提取方式应该有时间戳或任何方式来知道它们以某个顺序开始,例如,从开始到结束:

  

IBBBIPPB ...... BI

但是我可以在编码序列中对帧进行排序。

我想用它来加载python来提取运动矢量,但它们都应该遵循编码序列。有什么帮助吗?

修改 将播放更改为编码序列(或顺序)。

1 个答案:

答案 0 :(得分:2)

使用最新版本的ffmpeg,您可以运行

await

图像序列号将对应于视频中的索引位置(显示方式),后缀将指示帧类型。

要按编码/解码顺序获取帧,请运行

ffmpeg -i input.mp4
  -vf "select='eq(pict_type\,I)" -vsync 0 -frame_pts 1 thumbnails-%02d-I.png
  -vf "select='eq(pict_type\,B)" -vsync 0 -frame_pts 1 thumbnails-%02d-B.png
  -vf "select='eq(pict_type\,P)" -vsync 0 -frame_pts 1 thumbnails-%02d-P.png

您应该按字母/词汇顺序对输出图像列表进行排序 - 即按编码/解码顺序排列的图像。如果需要,您可以将9位字段批量重命名为简单的串行索引。

ffmpeg -i input.mp4 -vf "setpts=POS,select='eq(pict_type\,I)" -vsync 0 -frame_pts 1 thumbnails-%09d-I.png -vf "setpts=POS,select='eq(pict_type\,B)" -vsync 0 -frame_pts 1 thumbnails-%09d-B.png -vf "setpts=POS,select='eq(pict_type\,P)" -vsync 0 -frame_pts 1 thumbnails-%09d-P.png 将帧的时间戳设置为文件中的字节偏移量,这将跟踪编码/解码顺序。