Я пытаюсь получить список индексов для всех I-кадров в видео на Python (и позже сохранить часть из них в JPEG
). Прямо сейчас, я могу пересекать все кадры с помощью FFProbe
в терминале и видеть, какой из них I-кадр:
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 для запуска этой команды.
Это приведет к выходу всех кадров я в виде изображений в формате JPG.
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
Надеюсь, это поможет. Приветствия.
Ян
Получив представление отсюда, я смог сделать это с помощью 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()