Wie kann ich in Xubuntu 16.04 ein Bild aus einer bestimmten Zeit eines Videos extrahieren?

8

Ich suche nach einer Befehlszeilenoption.

Wenn ich beispielsweise das Video habe sample-video.mp4und sample-image.jpgum 00:00:26 Uhr eine Bilddatei aus dem Video generieren möchte, welchen Befehl soll ich geben?

Es wäre auch sehr hilfreich, wenn Sie detailliert erklären könnten, welche Funktion jedes Argument des Befehls hat.

Sonevol
quelle
2
Nach dieser Frage und ihren Antworten ffmpegscheinen Dateinamen für die Ausgabe zu unterstützen.
IQV

Antworten:

8

Sie können Folgendes verwenden mplayer(aus dem Paket mplayer, nicht standardmäßig installiert):

mplayer -vo jpeg -ss 00:00:26 -frames 1 sample-video.mp4

Dadurch wird die Datei erstellt, 00000001.jpgsodass Sie sie umbenennen müssen. Soweit ich weiß, gibt es keine Möglichkeit, einen Dateinamen anzugeben.

-vo jpegbedeutet, dass Sie eine JPEG-Ausgabe wünschen, -ss 00:00:26an die angegebene Position -frames 1suchen, einen Frame verarbeiten und dann beenden möchten .

Florian Diesch
quelle
Was ist der Vorteil von mehr als 1 Frames? Werden das Kopien sein oder wird sich jeder Frame um eine Sekunde unterscheiden?
Sonevol
Bilder, die aus mehr Frames erstellt wurden, unterscheiden sich in Sekundenbruchteilen. Der genaue Wert hängt vom Video ab.
Florian Diesch
5
@Sonevol Der Frame genau um 0:00:26 ist möglicherweise nicht genau das , was Sie wollen. Möglicherweise möchten Sie die ~ 50 Frames zwischen 0:00:25 und 0:00:27 (oder sogar nur 3-4 Frames um die 0:00:26-Marke) aufnehmen und sie dann durchsuchen, um die beste auszuwählen.
xDaizu
1
@FlorianDiesch Kann auch mit folgenden Elementen auf PNG ausgegeben werden: -vo png:z=9Die Einstellung -z gibt die Komprimierungsstufe an. Für JPEG können Sie auch eine Qualitätseinstellung hinzufügen : -vo jpeg:quality=100. Aber Ihre Antwort ist großartig, wie es bereits ist :)
andrew.46
13

Sie können ffmpeg verwenden

ffmpeg -loglevel quiet -ss 26 -i sample-video.mp4  -t 1 -f image2 anyfilename.jpeg
  • -loglevel setzt die Logout-Ausgabe auf leise, da ffmpeg sehr gesprächig ist
  • -ss ist Suchen (in Sekunden, dh wo Sie den Schnappschuss machen möchten)
  • -i Eingabevideodatei
  • -t Zeitrahmen des Schnappschusses (in Sekunden)
  • -f Dateityp

Sie können auch mit den Optionen herumspielen, z. B. der Steuerungsqualität der JPEG-Ausgabe -q:v <linear integer 1-10>oder der Auflösung -s 480x300.

Noch ein paar Ideen hier


VLC-Methode

cvlc sample-video.mp4 --start-time=26 --run-time=1 --rate=1 --video-filter=scene --vout=dummy --aout=dummy  --scene-ratio=24 --scene-prefix=sample-image --scene-replace vlc://quit
  • cvlc - weil seine Kommandozeile und wir nicht wollen, dass sich Fenster öffnen. Dies bedeutet auch, dass wir es ohne X11 ausführen können.

  • --start-time = 26 - ist die genaue Position des Schnappschusses in Sekunden

  • --run-time = 1 - wie lange das Video in Sekunden " abgespielt " wird. Wir spielen es eine Sekunde lang, um einen Screenshot dieser Sekunde zu machen
  • --rate = 1 wann der Screenshot aufgenommen werden soll. Dies bedeutet im Grunde "jede Sekunde" und ist nützlich, wenn Sie längere Dateien haben, alle 60 Sekunden oder alle 5 Minuten einen Screenshot zu machen
  • --video-filter = scene teilt VLC mit, dass wir Screenshots machen möchten
  • --vout = Dummy Keine Ausgabe für Video auf X11, wir brauchen es nicht
  • --aout = Dummy keine Ausgabe für Audio, wir brauchen es nicht
  • --scene-ratio = 24 Wir teilen VLC mit, dass es ungefähr 24 Bilder pro Sekunde gibt
  • --scene-prefix = Beispielbild der Dateiname Ihres Screenshots
  • --scene-replace Ersetzen Sie alle Dateien, die wie Ihr Screenshot aufgerufen werden, sample-image.pngdurch Ihren aktuellen Screenshot. Wenn Sie dies weglassen, beginnt VLC mit der Nummerierung der Screenshots
  • vlc: // beende vlc zu beenden , sobald wir fertig sind

Vollständige Dokumentation hier

Robert Riedl
quelle
Was meinst du mit gesprächig? Und ich möchte einen Schnappschuss in der 26. Sekunde. Warum also den Zeitrahmen mit -t angeben? Ich mache ein Bild, kein Video.
Sonevol
3
"Chatty", weil ffmpeg mit diesem Befehl über 40 Zeilen Protokollausgabe druckt, wie die aktuelle Version, den Setup-Typ und Informationen zur Eingabe-Videodatei - was für Sie uninteressant ist. Für Ihren Zweck können Sie wahrscheinlich "-t 1" weglassen. Die Standardeinstellung scheint eine Sekunde oder ein Bruchteil davon zu sein, was für den Screenshot in Ordnung ist. Der schöne Unterschied ist die Möglichkeit, den Ausgabedateinamen zu definieren und Qualität / Auflösung usw. zu optimieren
Robert Riedl