Die Aufgabe und warum sie umständlicher ist, als sie aussieht
„Gib mir ein Bild pro Sekunde von diesem Clip“ ist eine der häufigsten Videoaufgaben, die es gibt. Ein QA-Tester benötigt gleichmäßig verteilte Screenshots, die er einem Fehlerbericht anhängen kann. Ein Forscher benötigt eine abgetastete Bildsequenz, um sie in ein Anmerkungstool einzuspeisen. Ein Social-Redakteur benötigt zwanzig Standbilder von Kandidaten aus einem zweiminütigen Schnitt, ohne die Timeline manuell zu schrubben.
Die Aufgabe selbst ist einfach. Was es fummelig macht, ist, dass „ein Bild pro Sekunde“ beim genauen Hinsehen mehrdeutig ist. Meinen Sie ein Bild für jede Sekunde Wiedergabezeit oder jede NFrame des codierten Streams? Das sind verschiedene Dinge: Ein 24-fps-Clip und ein 60-fps-Clip erzeugen bei der ersten Lesung die gleiche Zählung und bei der zweiten völlig unterschiedliche Zählungen. Wählen Sie die falsche aus, und Sie erhalten entweder einen Ordner mit Beinahe-Duplikaten oder eine Sequenz, die zu spärlich ist, um nützlich zu sein.
Beide unten aufgeführten Ansätze erzeugen identische Pixel. Sie unterscheiden sich darin, wie Sie ausdrücken, was Sie wollen, und wie schnell Sie feststellen, dass Sie es falsch ausgedrückt haben.
Methode 1: FFmpeg, Parameter für Parameter
Der kanonische Befehl ist kurz:
ffmpeg -i input.mp4 -vf fps=1 -q:v 2 frame_%04d.jpg
Jedes Teil davon ist wichtig:
-i input.mp4– die Quelldatei. FFmpeg liest es einmal, von Anfang bis Ende; Es wird nicht versucht, jeden Zeitstempel einzeln zu stempeln.-vf fps=1– der Videofilter, der die eigentliche Arbeit erledigt.fps=1bedeutet ein Ausgabebild pro Sekunde Wiedergabezeit, unabhängig von der Bildrate der Quelle. Benutzenfps=1/5für ein Bild alle fünf Sekunden oderfps=2für zwei pro Sekunde. Dies ist die Abspielzeit.-q:v 2– JPEG-Qualität, auf einer umgekehrten Skala, wobei 2 nahezu verlustfrei und 31 stark komprimiert ist. Wenn Sie es weglassen, erhalten Sie die Standardeinstellung von FFmpeg, die deutlich weicher ist, als die meisten Leute erwarten. Wenn Sie eine verlustfreie Ausgabe wünschen, schreiben Sie:frame_%04d.pngstattdessen und lassen Sie diese Flagge vollständig fallen.frame_%04d.jpg– das Ausgabemuster.%04dfüllt den Zähler mit Nullen auf vier Ziffern auf:frame_0001.jpg,frame_0002.jpg. Die Polsterung ist nicht kosmetisch; siehe das Nummerierungsproblem unten.
Wenn Sie die andere Lektüre wünschen – alle Nencodierten Frame und nicht jeden N Sekunden – der Filter ändert sich:
ffmpeg -i input.mp4 -vf "select=not(mod(n\,10))" -vsync vfr frame_%04d.png
Dadurch bleiben die Frames dort, wo der Frame-Index angezeigt wird. n ist durch 10 teilbar und -vsync vfr verhindert, dass FFmpeg Frames dupliziert, um eine konstante Ausgaberate zu gewährleisten. Wenn Sie diese Option deaktivieren, erhalten Sie weitaus mehr Dateien, als Sie angefordert haben, was ein häufiges und verwirrendes erstes Ergebnis ist.
Um die Arbeit auf ein Segment zu beschränken, setzen -ss vor -i Daher sucht FFmpeg vor der Dekodierung, anstatt zu dekodieren und zu verwerfen:
ffmpeg -ss 00:01:30 -to 00:02:15 -i input.mp4 -vf fps=1 frame_%04d.png
Methode 2: Derselbe Job in einem Browser
Die Frame-Extraktor auf dieser Website wird auf dieselben beiden Messwerte abgebildet, wobei die Mehrdeutigkeit in der Schnittstelle explizit gemacht wird und nicht in einer Filterzeichenfolge ausgeblendet wird.
- Legen Sie die Datei ab. Es wird direkt von der Festplatte in den Browserspeicher gelesen – es erfolgt kein Upload, sodass eine 3-GB-Quelle sofort mit der Verarbeitung beginnt und nicht nach einer Übertragung.
- Wählen Sie die Extraktionsmethode. „Zeitintervall“ ist das Äquivalent von
fps=1/N– Sie erreichen die Lücke in Sekundenschnelle. „Bildrate (FPS)“ ist das Äquivalent vonselect/modFilter – Sie geben ein N jeden behalten NRahmen. - Lesen Sie vor dem Extrahieren den Hinweis zur Bildanzahl. Das ist der Teil, der am meisten Zeit spart. Die Benutzeroberfläche zeigt an, wie viele Bilder Ihre aktuellen Einstellungen erzeugen werden. vor Alles läuft, also Ein Fehler mit 4.000 Dateien wird zu einer Zahl, die Sie sehen, und nicht zu einem Ordner, den Sie entdecken.
- Format und Qualität festlegen. PNG für verlustfrei, JPG oder WebP mit dem 10–100 %-Schieberegler, wenn es auf die Größe ankommt. Die Schiebereglerposition entspricht dem,
-q:vSteuerelemente drückten die Art und Weise aus, wie die meisten Leute darüber denken. - Kürzung des Bereichs bei Bedarf. Der Dual-Griff-Schieberegler ist der
-ss/-toäquivalent, wobei die Zeitstempel beim Ziehen angezeigt werden. - Exportieren. Frames werden in einem Vorschauraster angezeigt; Klicken Sie auf eines, um es einzeln zu speichern, oder nehmen Sie den gesamten Satz als einzelnes ZIP.
Faustregel für die Auswahl eines Intervalls: für eine Talking-Head- oder Bildschirmaufzeichnung wird alle 2–5 Sekunden 1 Frame erfasst sinnvolle Zustandsänderung. Für Sport oder alles mit schneller Bewegung, 2–5 Bilder pro Sekunde. Reservieren Sie „jedes Bild“ für eine wirklich bildgenaue Analyse – eine Minute mit 60 Bildern pro Sekunde umfasst 3.600 Bilder und mehrere Gigabyte PNG.
Drei Probleme, die Menschen tatsächlich Zeit kosten
1. Die Ausgabe besteht aus Tausenden nahezu identischer Frames
Fast immer eine Einheitenverwechslung: Sie meinten „jeden 10. Frame“ und schrieben fps=10, was zehn Frames bedeutet pro Sekunde – bei einer 30-fps-Quelle sind das dreimal mehr Bilder als die naive Erwartung, nicht dreimal weniger.
Bevor Sie etwas ausführen, führen Sie die Arithmetik durch. Wiedergabezeitmodus: duration ÷ interval. Frame-Index-Modus: duration × source_fps ÷ N. Ein 10-minütiger 30-fps-Clip bei „jedem 10. Bild“ beträgt 600 × 30 ÷ 10 = 1.800 Bilder. Wenn Sie diese Zahl überrascht, passen Sie sie lieber vor dem Start an als danach. Im Browser-Tool erscheint automatisch dieselbe Zahl unter dem Intervallfeld.
2. Die Extraktion bleibt mitten in einem langen Video stehen
Unterschiedliche Ursachen auf jeder Seite, daher ist auch die Lösung unterschiedlich.
Bei FFmpeg hängt ein Stillstand normalerweise mit der Festplatte zusammen – Tausende von PNGs landen in einem Verzeichnis und das Dateisystem, nicht der Decoder, wird zum Flaschenhals. Schreiben Sie in ein neues, leeres Verzeichnis, bevorzugen Sie JPG, wenn Sie kein verlustfreies Verfahren benötigen, und teilen Sie sehr lange Quellen in Segmente mit -ss/-to.
Im Browser ist die Grenze RAM: Jeder extrahierte Frame wird im Speicher gehalten, bis Sie ZIP herunterladen. Ein paar hundert 4K PNGs sind mehrere Gigabyte und ein Tab kann dafür getötet werden. Das zuverlässige Muster besteht darin, in Blöcken zu arbeiten – verwenden Sie den Zeitbereichsschieberegler, um 0:00–2:00 zu wählen, laden Sie ZIP herunter und verschieben Sie dann den Bereich auf 2:00–4:00. Das Schließen anderer Tabs vor einem großen Auftrag hilft wirklich, und JPG reduziert bei einer Qualität von 85–90 % den Speicherdruck um ein Vielfaches, ohne dass bei den meisten Anwendungen ein Unterschied sichtbar ist.
3. Die Nummerierung der Frames unterbricht die Importreihenfolge
Dieses Bild sieht nach dem Export gut aus. Tools, die Dateinamen als Text sortieren – und die meisten tun das auch –, sortieren frame_10.png vor frame_2.png, weil „1“ zeichenweise vor „2“ sortiert wird. Ihre Sequenz wird verschlüsselt abgespielt und es ist nicht ersichtlich, warum.
Der Fix ist eine Nullauffüllung, breit genug für die größte Anzahl, die Sie jemals haben werden produzieren. Das ist es, was %04d ist für; verwenden %05d wenn Sie 9.999 Bilder überschreiten könnten. Das Browser-Tool füllt sich automatisch auf, was der Hauptgrund dafür ist, dass seine Ausgabe ohne Umbenennung direkt in einen Bildsequenz-Importer gelangt.
Wenn FFmpeg immer noch der richtige Anruf ist
In den meisten Fällen. Dies ist kein Fall, in dem der Browser auf ganzer Linie gewinnt:
- Alles, was per Skript geschrieben oder geplant ist. Ein Cron-Job, ein CI-Schritt, eine serverseitige Pipeline – ein Browser kann daran überhaupt nicht teilnehmen.
- Stapel über viele Dateien hinweg. Eine Shell-Schleife über 200 Clips ist in FFmpeg trivial und überall sonst mühsam.
- Codecs, die der Browser nicht dekodiert. ProRes, DNxHD, Raw Kameraformate, ungewöhnliche Container. Wenn der Browser es nicht abspielen kann, kann er nicht daraus extrahieren. FFmpeg verarbeitet fast alles.
- Filtern während der Extraktion. Deinterlacing, Skalierung, Farbraumkonvertierung, Zuschneiden, Erkennung von Szenenwechseln – alles als Filter im selben Durchgang verfügbar.
- Reproduzierbarkeit. Ein Befehl in einer README-Datei ist genau. „Stellen Sie den Schieberegler auf etwa hier“ ist nicht der Fall.
Das Browser-Tool eignet sich besser für einmalige Aufgaben, für alle, die keine Toolchain für eine gelegentliche Aufgabe installieren und verwalten möchten, wenn die Quelle vertraulich genug ist, dass nur die lokale Verarbeitung wichtig ist, und wenn Sie sich die Frames ansehen möchten, bevor Sie sich zum Export verpflichten. Dabei handelt es sich um wirklich unterschiedliche Situationen, nicht um eine Rangfolge.
Kurzreferenz
| Was Sie wollen | FFmpeg | Browser-Tool |
|---|---|---|
| Ein Frame pro Sekunde | -vf fps=1 |
Zeitintervall = 1 |
| Ein Bild alle 5 Sekunden | -vf fps=1/5 |
Zeit Intervall = 5 |
| Jeder 10. codierte Frame | -vf "select=not(mod(n\,10))" -vsync vfr |
Frame-Rate-Modus, N = 10 |
| Nur 1:30 bis 2:15 | -ss 00:01:30 -to 00:02:15 |
Schieberegler für den Zeitbereich |
| Verlustfreie Ausgabe | .png Ausgabemuster |
Format = PNG |
| Kleinere Dateien | -q:v 5 mit .jpg |
JPG + Qualitätsschieberegler |
| Sehen Sie sich die Anzahl vor der Ausführung an | Manuell berechnen | Wird unter dem Intervallfeld angezeigt |
| Vorschau vor dem Speichern | Öffnen Sie den Ausgabeordner | Integriertes Vorschauraster |
| Automatisierung / Batch | Shell-Schleife, Cron, CI | Nicht möglich |
| ProRes, DNxHD, Raw | Unterstützte | Nur das, was der Browser dekodiert |
Welche Route Sie auch wählen, die Intervallentscheidung steht an erster Stelle und das Tool an zweiter Stelle. Berechnen Sie, wie viele Frames Sie tatsächlich benötigen, bestätigen Sie die Anzahl, bevor Sie beginnen, und der Rest ist mechanisch.