Rufen Sie die Liste der I-Frames in einem Video in FFMPEG / Python ab

910
Tina J

Ich versuche, 10 Bilder aus einem bestimmten Video auszuwählen, möglicherweise mit größter Vielfalt und Szenen. Ich würde gerne mit verschiedenen Auswahlszenarien experimentieren, aber das Gute ist, dass der Begriff " I-frameinhärent" Szenenwechsel bedeutet! Ich möchte also die I-Frames bekommen. Aber vielleicht gibt es viele I-Frames, also muss ich sie wahrscheinlich probieren.

Wie kann ich in FFMpeg oder Python die Liste aller Frame-Nummern aller I-Frames in einem Video abrufen? Ich möchte mit der Liste nur 10 davon auswählen und als PNG / JPEG speichern.

0

3 Antworten auf die Frage

1
iangetz

Dadurch werden alle i-Frames als PNG-Bilder ausgegeben.

ffmpeg -i 2.flv -vf "select=eq(pict_type\,I)" -vsync vfr frame-%02d.png 

Dank zu diesem Kommentar eine ähnliche superuser.com-Frage. Wie extrahiere ich alle Keyframes aus einem Videoclip?

Hoffentlich hilft das. Prost.

Ian

Danke, aber das weiß ich. Was ich gefragt habe, ist das Array der I-Frame-Indizes im Code! Tina J vor 6 Jahren 0
1
LordNeckbeard

Dies scheint ein X / Y-Problem zu sein, daher werde ich verschiedene Befehle vorschlagen:

Liste der Zeitstempel

Wenn Sie eine Liste von Zeitstempeln für jedes Keyframe ausgeben möchten:

ffprobe -v error -skip_frame nokey -show_entries frame=pkt_pts_time -select_streams v -of csv=p=0 input 0.000000 2.502000 3.795000 6.131000 10.344000 12.554000 

Beachten Sie die -skip_frame nokey.

Filter auswählen

Eine andere Methode ist die Verwendung des Auswahlfilters mit der sceneOption zur Ausgabe Ihrer Miniaturbilder:

ffmpeg -i input -vf "select=gt'(scene,0.4)',scale=160:-1" -vsync vfr %04d.png 
0
Tina J

Ich erhielt Einblicke von hier aus und konnte es mit 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()