Wie extrahiere ich die Zeitstempel, die mit Frames verknüpft sind, die ffmpeg mit der Option -r aus einem Video extrahiert?

12
ffmpeg -i myvid.mp4  -r  25  -t  100  image-%d.jpeg 

Ist der Befehl, den ich zum Extrahieren von Frames verwende und der genau so funktioniert, wie ich es erwartet habe. Ich möchte mir aber auch die Zeitstempel der Frames ansehen. Mit welcher Präzision auch immer. 100 Millisekunden sind gut genug für mich. Kann ffmpeg das?

Bereitstellung zusätzlicher Details,

Wenn ich den obigen Befehl ausführe, erhalte ich ungefähr 100 JPEGs. Ich denke, es gibt eine 1 zu 1 (oder viele zu 1) Entsprechung zwischen diesen JPEGs und den Bildern des Videos. Ich möchte den Zeitstempel des Frames kennen, der als JPEG-Bild 'i' ausgegeben wurde.

Zusätzlich habe ich ffprobe ausprobiert, aber ich finde, dass es sogar die Videodauer ungenau meldet :(

Srini
quelle
Als was? AFAIK JPEG hat keine solchen Metadaten. Der EXIF-Zeitstempel ist für die captureZeit.
Rajib
Sicher, das JPEG hat nicht die Metadaten, aber das mp4 könnte. Kann ich ffmpeg anweisen, es zusammen mit den Frames zu ziehen, die es später als JPEGS codiert, und die Zeitstempel in einer Datei zu speichern?
Srini
Bitte geben Sie die vollständige ffmpegKonsolenausgabe Ihres Befehls an.
Llogan
ffprobe kann Ihnen die Zeitstempelinformationen aus dem mp4-Videostream geben. Fragen Sie sich, ob Frames möglicherweise dupliziert oder gelöscht werden? Wie ist dann die Entsprechung zu den ursprünglichen mp4-Zeitstempeln? In diesem Fall würde ich untersuchen, die Ausführlichkeitseinstellungen zu erhöhen, um zu sehen, ob Sie das Bild für Bild während der Ausführung erhalten können. Könnten Sie erweitern, was Sie unter "mit Frames verknüpften Zeitstempeln" verstehen?
dstob
@dstob Die mit Frames verknüpften Zeitstempel sind die Präsentationszeitstempel des Eingangsvideos, dh wann jeder Frame relativ zum Start des Videos angezeigt werden soll.
Slhck

Antworten:

13

Sie können den Bildschreibvorgang "simulieren", indem Sie mit dem fpsFilter filtern und dann ffprobedie Zeitstempel der generierten Frames anzeigen. Dies bedeutet, dass das 50. Bild (wie Ihr 50. Bild) bei 25 fps eine PTS von 2,00 Sekunden hat.

Du machst es so:

ffprobe -f lavfi -i "movie=input.mp4,fps=fps=25[out0]" -show_frames -show_entries frame=pkt_pts_time -of csv=p=0

Wird ausgegeben:

0
0.04
0.08
0.12
0.16
...

Dies sind die Zeitstempel für jedes Ausgabebild. Sie können die Liste der Frames und die Zeitstempel tatsächlich kombinieren:

ls -1 image - *. jpeg> images.txt
ffprobe -f lavfi -i "movie = input.mp4, fps = fps = 25 [out0]" -show_frames -show_entries frame = pkt_pts_time -of csv = p = 0> frame.txt
Einfügen von images.txt frame.txt> kombiniert.txt

Erstellt eine Datei mit:

image-0001.jpeg 0
image-0002.jpeg 0.04
image-0003.jpeg 0.08
image-0004.jpeg 0.12

Beachten Sie, dass dies zu überflüssigen Zeilen führen kann, wenn zu viele Frames oder zu viele Zeilen mit Informationen ausgegeben werden. Es scheint dort ein wenig ungenau.

slhck
quelle
Ist dies der Zeitstempel in Bezug auf eine konstante Framerate am Ausgang oder die Entsprechung der ausgegebenen JPEGs zu den ursprünglichen mp4-Zeitstempeln, die eine beliebige Framerate haben und Zeitstempelwerte haben können?
dstob
Dieser Zeitstempel basiert auf der angeforderten Ausgabe-Framerate. Es bezieht sich sowohl auf die Ausgabebilder als auch auf die ursprünglichen Eingabevideobilder, aus denen diese Bilder stammen - es gibt nur eine Zeitbasis. Dies funktioniert, weil ffmpeg beim Ändern der Framerate (natürlich) das Video nicht schneller wiedergibt, sondern die Präsentationszeit jedes Frames "verlängert" und nicht benötigte Frames löscht.
Slhck
Warum muss es nur eine Zeitbasis geben, wenn Sie die Ausgabezeitbasis manuell erstellen? Dies wird natürlich nicht immer der Fall sein, aber bei dem ersten 60-fps-Video, das ich darauf geworfen habe, hat ffmpeg gerade eine eigene Zeitbasis erstellt, wobei die Zeitstempel der Eingabe ignoriert wurden.
dstob
Ich bin mir nicht sicher, was genau du vorhast. ffmpeg wählt als Eingabezeitbasis alles aus, was als Zeitbasis der ersten Eingabedatei analysiert wird . Sie können ffmpeg natürlich auch anweisen, die Eingabezeitstempel mit wegzuwerfen -vsync drop, aber das geschieht nach dem Filtern von IIRC.
Slhck