首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用Python获取视频中的I帧列表

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

Stack Overflow用户
提问于 2018-08-03 04:41:39
回答 2查看 1.7K关注 0票数 2

我正在尝试在Python中获取视频中所有I帧的索引列表(稍后将其中的一部分保存为

)。现在,我可以使用以下命令遍历所有帧

在terminal中,查看哪个是I-frame:

代码语言:javascript
复制
ffprobe -select_streams v -show_frames -show_entries frame=pict_type -of csv 18s.mp4

这给了我一些类似的东西:

代码语言:javascript
复制
frame,I
frame,B
frame,P
frame,B
frame,P
frame,B

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

EN

回答 2

Stack Overflow用户

发布于 2018-08-03 07:42:40

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

这将把所有的I帧输出为JPG图像。

代码语言:javascript
复制
ffmpeg -i 2.flv -vf "select=eq(pict_type\,I)" -vsync vfr frame-%02d.jpg

这是一个类似的superuser.com问题。

https://superuser.com/questions/669716/how-to-extract-all-key-frames-from-a-video-clip#comment1184347

_

669733

希望这能有所帮助。干杯。

伊恩

票数 1
EN

Stack Overflow用户

发布于 2018-08-03 23:21:58

这里

,我能够做到这一点

代码语言:javascript
复制
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()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51661864

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档