Extrahieren Sie das Bild (im Bildformat) in jeder Minute (oder Sekunde) aus einem Video (von ffmpeg).

5094
midnite

Motivation: Ich möchte das Bild suchen und dann qualitativ hochwertige und exakte Screenshots (Bilder) aus einem Video aufnehmen.

Das Video hat eine Länge von 00: 48: 43.71 und 23.98 Bildern pro Sekunde (wir glauben, dass es 24 Bilder pro Sekunde sind, oder?).


Mit Verweis auf dieser Webseite: Erstellen Sie alle X Sekunden des Videos ein Miniaturbild

Ich habe einige Befehle geschrieben, die jede Stunde, jede Minute und jede Sekunde ein Bild aufnehmen.

Nach der Vernichtung der Bilder werden die Screenshots tatsächlich aus einer halben Stunde, einer halben Minute und einer halben Sekunde gemacht. Sie werden in Kürze verstehen.

Der Befehl zum Beispiel, jede Minute ein Bild aufzunehmen, ist es, das Bild in der halben Minute zu extrahieren, was 00:00:30, 00:01:30, 00:02:30 usw. bedeutet. Deshalb benenne ich den Dateinamen wie folgt:

ffmpeg -i "video.mp4" -start_number 0 -vf fps=1/60 "B 00-%02d-30.000.png" 

(Das Hinzufügen des Präfix "B" verhindert das Überschreiben durch verschiedene Befehle.)

Wenn Sie beispielsweise von 00:03:00 bis 00:04:00 jede Sekunde ein Bild aufnehmen möchten, wird Folgendes empfohlen:

ffmpeg -i "video.mp4" -start_number 0 -vf fps=1 -ss 00:03:00 -to 00:04:00 "C 00-03-%02d.500.png" 

Um sie zu überprüfen, können wir alle Frames von 00:03:29 bis 00:03:31 extrahieren:

ffmpeg -copyts -ss 00:03:29 -i "video.mp4" -start_number 0 -to 00:03:31 "D 00-03-29.%03d.png" 

Wir können prüfen, ob die folgenden Bilddateien identisch sind:

D 00:03:29.012.pngist identisch mit C 00:03:29.500.png.

D 00:03:29.024.pngist identisch mit B 00:03:30.000.png.

D 00:03:29.036.pngist identisch mit C 00:03:30.500.png.


Das sind meine Erkenntnisse aus Versuchen und Fehlern heute Morgen. Hier kommt meine Frage:

Nehmen wir als Beispiel "Einen Frame zu jeder Minute extrahieren". Wie können wir erhalten / was ist der Befehl, um die Frames zu erhalten 00: 00: 00.000, 00: 00: 01.000, 00: 00: 02.000 usw.?

Ich habe gerade von ffmpegdiesem Morgen gehört. Ich weiß immer noch nicht, was -copyts(nach dem Lesen der Dokumente ) bedeutet und wann ich sie -ss positionvor -iund wann setzen muss. Korrigieren Sie mich bitte , wenn ich die falschen Befehle verwende.

3

1 Antwort auf die Frage

2
Ely

Der FPS-Filter ist so konzipiert, dass er Frames intelligent löscht / dupliziert, um die Ausgangs-FPS basierend auf den Eingangs-FPS anzupassen. Wenn Sie darum bitten, jede Minute ein Bild auszugeben, wählen Sie ein Bild in der Mitte des Fensters 00: 00-01: 00 aus und lassen Sie alle anderen aus. Deshalb erhalten Sie Bilder um 00:30, 01:30 Uhr. usw..

Haben Sie in Betracht gezogen, ein bat / bash-Skript zu erstellen, das dies tut?

for i in 0..50 ffmpeg -ss %i:oo -i input.mp4 -vframes 1 out-%i.png 

Sie können auch Folgendes tun, wenn Sie um 01:00, 02:00 [..] anstelle von 00:30, 01:30 [..] Screenshots erhalten möchten:

ffmpeg -ss 00:30 -i input.mp4 -start_number 0 -vf fps=1/60 "B 00-%02d-00.000.png" 
Oh, die zweite Methode ist klug. Aber wir haben immer noch Probleme, die erste Hälfte der Minute / Sekunde / etc zu bekommen. Ich frage mich, ob es einen anderen Befehl / Parameter anstelle des FPS-Filters gibt, um die Aufgabe gut zu erledigen? Für die erste Methode, da (denke ich) ffmpeg alle Frames verarbeitet und nur die unerwünschten Frames verwirft, wird der Befehl sehr langsam, wenn ich den letzten Teil des Videos erreicht habe? Wenn es praktisch ist, sag mir bitte auch, was ist -copyts und wo soll -ss abgelegt werden. Oder ich bin in Ordnung, sie in einem anderen Frage-Thread zu fragen :) midnite vor 9 Jahren 0
Ich weiß es nicht wirklich. -ss muss vor einer Eingabe gesetzt werden und ordnet ffmpeg an, diesen Zeitstempel vor der Verarbeitung zu suchen. Es ist eine schnelle Suche, selbst wenn Sie am Ende des Videos stehen, wird es schnell gehen. Ely vor 9 Jahren 2
@Ely Kannst du das in deine Antwort setzen? Ich verbrachte nur eine Stunde damit, herauszufinden, warum es nicht funktionierte, und ich bemerkte diesen Kommentar nicht einmal. Lol (töte mich) Tallboy vor 6 Jahren 0