Ich versuche, mit FFmpeg ein Bild pro Sekunde aus jeder Datei in einem Verzeichnis zu extrahieren.
Ich verwende diesen Befehl für einzelne Dateien, kann aber nicht herausfinden, wie ich stattdessen ein Verzeichnis eingeben kann:
ffmpeg -i "C:\input\clip1.mp4" -vf fps=1 -qscale:v 2 "C:\output\clip1\clip1A"%d.jpg
Idealerweise möchte ich die Frames in einem eigenen Ordner speichern, wie unten, aber ichdenkenDas kann ich selbst herausfinden. Es ist in Ordnung, wenn sie alle in denselben Ordner mit demselben Präfix und derselben fortlaufenden Nummerierung ausgegeben werden.
C:\output\clip1\clip1-001.jpg
,clip1-002.jpg
C:\output\clip2\clip2-001.jpg
,clip2-002.jpg
Ich versuche es jetzt schon seit vielen Stunden und bin immer noch völlig ratlos. Ich wäre für jede Hilfe sehr dankbar.
Antwort1
Geschafft! Dieser Code gibt Frames in Ordner mit demselben Namen aus wie das Video, aus dem sie stammen. Den Frames wird der Videoname vorangestellt und sie werden mit fortlaufenden Nummern beginnend bei 001 versehen. Für meine Dateien gibt er also „/clip1/clip1-001.jpg“ usw. aus.
Nur für den Fall, dass Sie wie ich sind und keine Ahnung haben, was Sie tun, fügen Sie den folgenden Code in den Editor ein, speichern Sie ihn als „extractframesorwhatever.bat“ und führen Sie ihn aus dem Verzeichnis aus, in dem sich Ihre Clips befinden.
for %%F in (*.mp4) do (
If not Exist "%%~nF" MkDir "%%~nF"
ffmpeg -i %%F -r 1 -qscale:v 2 %%~nF\%%~nF-%%3d.jpg
)
Wenn Sie die Ordner woanders ausgeben möchten, ändern Sie:
If not Exist "%%~nF" MkDir "%%~nF"
Zu so etwas:
If not Exist "C:\wherever\%%~nF" MkDir "C:\wherever\%%~nF"
Wenn Sie das tun, müssen Sie auch die Ausgabe ändern (in meinem Beispiel):
%%~nF\%%~nF-%%3d.jpg
Zu
C:\wherever\%%~nF\%%~nF-%%3d.jpg
Oder wenn Sie alle Frames in einem Ordner haben möchten. Ersetzen Sie das erste %%~nF der Ausgabe durch Ihr bevorzugtes Verzeichnis. In meinem Beispiel würde es von C:\wherever\%%~nF\%%~nF-%%3d.jpg zu C:\wherever\frames\%%~nF-%%3d.jpg wechseln. Sie sollten außerdem entweder die zweite Zeile bearbeiten, damit sie auf den neuen Speicherort verweist und verhindert, dass eine Menge unnötiger Verzeichnisse erstellt wird, oder die zweite Zeile ganz entfernen. Wenn Sie die zweite Zeile entfernen, müssen Sie diesen Ordner „Frames“ zuerst selbst erstellen.
BEARBEITEN - Möglicherweise müssen Sie alle Leerzeichen aus den Dateinamen entfernen, bevor sie verarbeitet werden können. Das „Dienstprogramm zur Massenumbenennung“ kann Ihnen viel Zeit sparen.
Antwort2
Mir gefällt diese Methode zum Extrahieren von Frames, sie ist sehr praktisch. Aber wenn ich den von Ihnen bereitgestellten Code verwende:
for %%F in (*.mp4) do (
If not Exist "%%~nF" MkDir "%%~nF"
ffmpeg -i %%F -r 1 -qscale:v 2 %%~nF\%%~nF-%%3d.jpg
)
Ich bekomme zwei Ausgabeordner:
Einer mit dem Dateinamen (dort sollen meine Bilder hin) und einem Testordner (dort sollen meine Bilder hin).
Ich weiß, dass der Code so funktionieren soll, aber vielleicht haben die Änderungen in den letzten vier Jahren etwas an der Funktionsweise des Codes geändert. Aber alles in allem ist es wirklich nicht ZU umständlich.
Ich möchte auch hinzufügen, dass diejenigen, die GIFs in höherer Qualität erstellen möchten, einfach .jpg in .png ändern können.
Sie können dies auch mit jedem Videoformat (oder zumindest mehr, da ich dies nicht viel getestet habe) zum Laufen bringen, indem Sie die (.mp4) in (.mkv), von dem ich weiß, dass es funktioniert.
Ich gehe davon aus, dass alle anderen Videoformate auch funktionieren würden, wie zum Beispiel (.avi), (.mpeg), (.ts), (.flv) usw. -obwohl dies nicht getestet wurde.
Aber da es mir wie dem OP geht, dass ich diesen Code nicht verstehe, sondern nur das kopiere/einfüge, was ich online finde, und ein bisschen damit herumspiele, ist es praktisch, einfach die .bat-Dateien bereit zu haben.
Ich würde nur gerne wissen, wie ich das Problem mit der Erstellung des „Test“-Ordners beheben und die Screenshots stattdessen in den Ordner verschieben kann, der bereits mit dem Dateinamen erstellt wird.
Um zu zeigen, wie ich den Code geändert habe, damit er mit anderen Videoformaten funktioniert, füge ich ein paar Beispiele ein:
Das erste Beispiel, von dem ich weiß, dass es funktioniert, ist für .mkv-Dateien statt .mp4, wodurch die Screenshots im PNG-Format angezeigt werden.
for %%F in (*.mkv) do (
If not Exist "%%~nF" MkDir "%%~nF"
ffmpeg -i %%F -r 1 -qscale:v 2 %%~nF\%%~nF-%%3d.png
)
Das letzte Beispiel SOLLTE für .ts-Dateien funktionieren und die Screenshots in .png umwandeln.
for %%F in (*.ts) do (
If not Exist "%%~nF" MkDir "%%~nF"
ffmpeg -i %%F -r 1 -qscale:v 2 %%~nF\%%~nF-%%3d.png
)