使用Python获取视频中的I帧列表

使用Python获取视频中的I帧列表,python,python-3.x,video,ffmpeg,ffprobe,Python,Python 3.x,Video,Ffmpeg,Ffprobe,我试图用Python获取视频中所有I帧的索引列表(稍后将其中一部分保存为JPEG)。现在,我可以在终端中使用FFProbe遍历所有帧,并查看哪个是I-frame: ffprobe -select_streams v -show_frames -show_entries frame=pict_type -of csv 18s.mp4 这给了我类似的东西: frame,I frame,B frame,P frame,B frame,P frame,B 但是我如何在Python中(我在Window

我试图用Python获取视频中所有I帧的索引列表(稍后将其中一部分保存为
JPEG
)。现在,我可以在终端中使用
FFProbe
遍历所有帧,并查看哪个是I-frame:

ffprobe -select_streams v -show_frames -show_entries frame=pict_type -of csv 18s.mp4
这给了我类似的东西:

frame,I
frame,B
frame,P
frame,B
frame,P
frame,B

但是我如何在Python中(我在Windows中)实现这一点并获得所有索引的列表呢?

您可以让FFmpeg将I帧作为JPG输出。并使用python包装器触发此命令

这将输出所有i帧作为JPG图像

ffmpeg -i 2.flv -vf "select=eq(pict_type\,I)" -vsync vfr frame-%02d.jpg
这一评论也带来了类似的superuser.com问题。

希望有帮助。干杯


伊恩

中获得见解,我能够用
ffprobe

def iframes():
    if not os.path.exists(iframe_path):
        os.mkdir(iframe_path)
    command = 'ffprobe -v error -show_entries frame=pict_type -of default=noprint_wrappers=1'.split()
    out = subprocess.check_output(command + [filename]).decode()
    f_types = out.replace('pict_type=','').split()
    frame_types = zip(range(len(f_types)), f_types)
    i_frames = [x[0] for x in frame_types if x[1]=='I']
    if i_frames:
        cap = cv2.VideoCapture(filename)
        for frame_no in i_frames:
            cap.set(cv2.CAP_PROP_POS_FRAMES, frame_no)
            ret, frame = cap.read()
            outname = iframe_path+'i_frame_'+str(frame_no)+'.jpg'
            cv2.imwrite(outname, frame)
        cap.release()
        print("I-Frame selection Done!!")


if __name__ == '__main__':
    iframes()

python可以“全力以赴”执行ffprobe。也请看,谢谢!但我问的是代码中的I-frame索引数组!