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

Python 使用ffprobe/ffmpeg按编码顺序提取单个帧和类型,python,ffmpeg,keyframe,ffprobe,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 -qscal

我能够使用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
现在的问题是,我希望这些提取的帧按照编码顺序进行编码,如果可能的话,提取它们的方式应该有一个时间戳,或者以任何方式知道它们以特定的顺序开始,例如从头到尾:

IBBBIPBB……BI

但在某种程度上,我可以对编码序列中的帧进行排序

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

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

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

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
图像序列号将对应于其在视频中的索引位置(显示方向),后缀将指示帧类型


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

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
您应该按字母/词法顺序对输出图像列表进行排序-这是按编码/解码顺序排列的图像。如果需要,可以将9位字段批量重命名为简单的序列索引


setpts=POS
将帧的时间戳设置为文件中的字节偏移量,该偏移量将跟踪编码/解码顺序

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

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
图像序列号将对应于其在视频中的索引位置(显示方向),后缀将指示帧类型


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

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
您应该按字母/词法顺序对输出图像列表进行排序-这是按编码/解码顺序排列的图像。如果需要,可以将9位字段批量重命名为简单的序列索引


setpts=POS
将帧的时间戳设置为文件中的字节偏移量,该偏移量将跟踪编码/解码顺序

我想到的一种方法是,除了上面的代码之外,还要运行:“ffprobe input.mp4-show_frames | grep-E'pict_type | coded_picture_number'>output.txt”,但随后我必须用python单独编程,以使用文本信息与返回的I、p、B帧匹配。除了上面的代码外,我还使用了一种方法来运行:“ffprobe input.mp4-show|u frames | grep-E'pict|u type | coded|u picture_number'>output.txt”,但随后我必须用python单独编程,以使用文本信息来匹配返回的I、P、B帧。如果只使用ffmpeg,有没有其他方法更容易做到这一点?谢谢,但问题是,我希望帧的顺序与视频播放时的顺序相同。如果您看到从“ffprobe input.mp4-show|u frames | grep-E'pict_type | coded_picture_number'>output.txt”返回的结果,“coded_picture_number”从0开始到最后一帧再加上“pict_type”,与我希望从ffmpeg返回的序列相同,但对于*.png文件来说是一样的。有线索吗?那不是播放顺序-那是编码顺序。过滤器按播放顺序处理帧-这是我的命令输出的。谢谢。我使用的是ffmpeg 3.4版,在运行命令时得到“无法识别的选项‘frame_pts’”,但没有输出。有什么线索吗?你需要使用最新的git版本。似乎无法使用更新的git。我使用的是GitVersion2.15.1Thanks,但问题是我希望帧的顺序与视频播放时的顺序相同。如果您看到从“ffprobe input.mp4-show|u frames | grep-E'pict_type | coded_picture_number'>output.txt”返回的结果,“coded_picture_number”从0开始到最后一帧再加上“pict_type”,与我希望从ffmpeg返回的序列相同,但对于*.png文件来说是一样的。有线索吗?那不是播放顺序-那是编码顺序。过滤器按播放顺序处理帧-这是我的命令输出的。谢谢。我使用的是ffmpeg 3.4版,在运行命令时得到“无法识别的选项‘frame_pts’”,但没有输出。有什么线索吗?你需要使用最新的git版本。似乎无法使用更新的git。我使用的是git版本2.15.1