2010-04-27 10:05:36 +0000 2010-04-27 10:05:36 +0000
72
72

Wie extrahiere ich ein Bild aus einem Video alle N Sekunden in ein Bild?

Wie kann ich eine Videodatei in eine Bildfolge konvertieren, z. B. ein Bild alle N Sekunden. Kann mplayer oder ffmpeg dies tun? Ich habe MPlayer verwendet, um Screenshots manuell zu erstellen, aber ich würde dies gerne für ein langes Video automatisieren.

Antworten (8)

73
73
73
2014-03-15 09:47:20 +0000

Es ist sehr einfach mit ffmpeg, und es kann ein Bild alle N Sekunden ausgeben, ohne extra Skripting. Um als Bildsequenz zu exportieren, verwenden Sie einfach myimage_%04d.png oder ähnliches als Ausgabe. Das %0xd-Bit wird in eine mit Nullen aufgefüllte Ganzzahl von x Stellen Länge umgewandelt - das Beispiel, das ich gegeben habe, wird als

  • myimage_0000.png,
  • myimage_0001.png,
  • myimage_0002.png

ausgegeben. Sie können viele Standbildformate verwenden, png, jpeg, tga, was auch immer (siehe ffmpeg -formats für eine vollständige Liste).

Ok, jetzt wissen wir also, wie man den Film als eine Sequenz von Bildern exportiert, aber sagen wir, wir wollen nicht jedes einzelne Bild exportieren?

Der Trick ist, einfach die Bildrate der Ausgabe auf das zu ändern, was wir wollen, indem wir die Option -r n verwenden, wobei n die Anzahl der Bilder pro Sekunde ist. 1 Bild pro Sekunde wäre -r 1, ein Bild alle vier Sekunden wäre -r 0.25, ein Bild alle zehn Sekunden wäre -r 0.1 und so weiter.

Um alles zusammenzufassen, würde es also so aussehen, dass ein Frame von input.mov alle vier Sekunden zu output_0000.png, output_0001.png usw. wird:

ffmpeg -i input.mov -r 0.25 output_%04d.png

Beachten Sie, dass die Option -r 0.25 nach dem Teil -i input.mov kommt, da sie die Framerate der Ausgabe steuert. Wenn Sie sie vor die Eingabe setzen, würde sie die Eingabedatei so behandeln, als hätte sie die angegebene Framerate.

Ändern Sie das %xd in so viele Ziffern, wie Sie benötigen, z. B. wenn der Befehl mehr als 10.000 Frames erzeugen würde, ändern Sie das %04d in %05d. Dies funktioniert auch für Eingabedateien, die eine Bildsequenz sind. Lesen Sie mehr hier .

Windows-Benutzer : In der Befehlszeile verwenden Sie %

Beispiel: ffmpeg -i inputFile.mp4 -r 1 outputFile_%02d.png

In CMD- und BAT-Skripten verwenden Sie %%

Beispiel: ffmpeg -i inputFile.mp4 -r 1 outputFile %%02d.png

Also doppeltes %% in Skripten und einfaches % in der interaktiven Befehlszeile. Wenn Sie sich in einer der beiden Situationen vertun, wird ein Fehler erzeugt.

28
28
28
2010-04-28 10:08:07 +0000
mplayer -vo jpeg -sstep 5 file.avi

speichert alle 5 Sekunden ein Bild als jpeg-Datei.

hört jedoch nicht am Ende der Datei auf, sondern erstellt weiterhin Kopien des letzten Frames. Um dies zu vermeiden, ermitteln Sie die Dauer des Videos in Sekunden mit einem anderen Player oder mit mplayer:

mplayer -vo null -ao null -frames 0 -identify file.avi

und suchen Sie nach einer Zeile wie “ID_LENGTH=147.00”.

Subtrahieren Sie 2 von der Länge, und verwenden Sie diesen Wert für die Option -endpos. Zum Beispiel für ein 147-Sekunden-Video:

mplayer -vo jpeg -sstep 5 -endpos 145 file.avi
11
11
11
2010-04-27 11:41:07 +0000

Mit ffmpeg können Sie Folgendes tun:

ffmpeg -ss 4 -i input.avi -s 320x240 -frames:v 1 output.jpg

Dieser Befehl erzeugt ein 320×240 großes JPG-Thumbnail an der 4. Sekunde im Video. Fügen Sie dies in ein Skript ein, das die Zeit und den Dateinamen ändert, und Sie sind fertig.

Mehr Infos: Erstellen eines Miniaturbildes alle X Sekunden des Videos

8
8
8
2013-06-04 08:15:55 +0000

Wenn Sie eine Art Kontaktbogen suchen und mit einem Unix-ähnlichen Betriebssystem arbeiten, können Sie dieses aufwendige Skript verwenden, das auf den Punkt Video Contact Sheet *NIX , kurz vcs heißt.

Im Hintergrund verwendet es auch ffmpeg (standardmäßig) oder mplayer, kann also mit vielen Videoformaten umgehen. Es automatisiert den Prozess der Aufnahme von Standbildern aus dem Film und setzt diese zu einem Bild mit einigen Kopf- und Fußzeilen zusammen. Sie können z. B. wählen, wie viele Aufnahmen Sie haben möchten oder alternativ die Zeitabstände zwischen den Aufnahmen.

Für ein Intervall von 10 Minuten sieht der Aufruf so aus:

vcs -i 10m input.avi

Schauen Sie sich die vollständige Liste der Kommandozeilenoptionen für einige andere Einstellungen an.

Hier ist ein Beispiel-Kontaktblatt, von der Homepage :

7
7
7
2012-09-11 03:17:14 +0000

Mit VLC 1.1.0 und höher können Sie den Szene-Videofilter verwenden:

vlc C:\video\to\process.mp4 --rate=1 --video-filter=scene --vout=dummy --start-time=10 --stop-time=11 --scene-format=png --scene-ratio=24 --scene-prefix=snap --scene-path=C:\path\for\snapshots\ vlc://quit

Das obige speichert 1 von 24 Bildern (–scene-ratio=24), beginnend bei 00:00:10 und endend bei 00:00:11.

Gerade getestet und bestätigt, dass dies mit VLC 2.0.3 auf einer frischen Windows 8 Installation funktioniert (ich habe keine zusätzlichen Video-Plugins oder Software).

Vollständige Dokumentation: http://wiki.videolan.org/How

2
2
2
2010-04-27 10:13:07 +0000

VirtualDub kann dies für Sie tun

File -> Export -> Image sequence

1
1
1
2010-04-27 16:22:46 +0000

Sie könnten auch dies

von der VLC-Befehlszeile aus versuchen…

vlc “C:\YOUR\file.avi” -V image –image-out-prefix=capname –image-out-ratio=60

file. avi ist das Video, von dem Sie aufnehmen wollen, capname ist das Präfix der gespeicherten Bilder, Sie können mit dem Verhältnis herumspielen (60 bedeutet, dass 1 von 60 Bildern aufgenommen wird) Sie können weitere Befehle hinzufügen, z. B. –image-out-format jpeg speichert Ihre Caps als jpegs anstelle von pngs, –snapshot-path lässt Sie wählen, wo Sie Ihre Caps speichern wollen. Quelle von oben

1
1
1
2011-11-30 22:06:24 +0000

Sie können Bilder in VirtualDub überspringen. Verwenden Sie einfach die Option “Dezimieren um”, die sich im Menü Video -> Bildrate befindet. Wenn Sie z. B. “Dezimieren um 100” einstellen und dann “Datei -> Exportieren -> Bildsequenz” verwenden, wird nur jedes 100ste Bild gespeichert.