Wie kann FFMPEG dazu gebracht werden, nicht sequentielle Bilddateien zusammenzufügen? (3s überspringen)


27

Ich habe ein paar Bilder, die diesem Muster folgen.

0001.png
0004.png
0007.png
0010.png
0013.png
0016.png
0019.png
...

Sie sind in der richtigen Reihenfolge, aber FFMPEG ignoriert nach der ersten Datei alles, da es keine findet 0002.png. Wie kann ich es schaffen, diese Dateien zusammenzufügen?

Ich habe es versucht

ffmpeg -i %04d.png out.avi

2
Wie wäre es, sie vorübergehend umzubenennen, die AVI-Datei zu erstellen und sie dann wieder in das (3x-2) .png-Schema umzubenennen? Bulk Rename Utility @ bulkrenameutility.co.uk/Main_Intro.php ist ein kostenloser, umm, Bulk Renamer.
Gyan

Antworten:


18

mit ffmpeg 0.11.1 ist es so einfach wie:

ffmpeg -f image2 -i %*.png out.avi

Auf der manSeite in einem Beispiel unter "Konvertierung von Video- und Audiodateiformaten":

-iUnterstützt beim Importieren einer Bildsequenz auch das interne Erweitern von Shell-ähnlichen Platzhaltern (Globbing). Um die Wahrscheinlichkeit zu verringern, dass Ihre tatsächlichen Dateinamen und die Glob-Erweiterung der Shell beeinträchtigt werden, müssen Sie Glob-Meta-Zeichen aktivieren, indem Sie ihnen ein einzelnes %Zeichen voranstellen , z. B. in foo-%*.jpeg, foo-%?%?%?.jpegoder foo-00%[234%]%*.jpeg.

Update per Kommentare: Bei neueren Versionen sollten Sie jetzt die -i '*.png'Syntax verwenden.


3
Dies hat bei mir mit ffmpeg oder avconv in Ubuntu 13.04
hellocatfood

2
Dies scheint keine Option mehr zu sein.
Timmmm

2
Der glob_sequenceMustertyp ist veraltet, der globMustertyp jedoch nicht. Die Antwort von Mulvya und Peter Cordes funktioniert.
dr. Sybren

1
Pattern type 'glob_sequence' is deprecated: use pattern_type 'glob' instead
Serge Stroobandt

1
Nur zur Verdeutlichung, da diese Seite derzeit das beste Ergebnis in Google für diese Warnmeldung ist ( Pattern type 'glob_sequence' is deprecated...): Der von rymo oben angegebene Befehl (insbesondere -i %*.png) wird die Warnung auslösen . Verwenden Sie die leicht abweichende Syntax in Peter Cordes answer ( -i '*.png') , um das Problem zu beheben .
James

19

Neben der Problemumgehung in meinem Kommentar sollten Sie in der Lage sein, diese Syntax aus der ffmpeg- Dokumentation zu verwenden :

ffmpeg -f image2 -pattern_type glob -i '*.png' out.avi

Die Anführungszeichen sind wichtig, Sie brauchen ffmpeg, um das zu sehen *, nicht die Shell, um es zu erweitern.


Funktioniert bei mir nicht, liegt aber wahrscheinlich daran, dass ich einen älteren Build habe. Ich akzeptiere dieses, weil es wahrscheinlich zukünftigen Benutzern helfen wird.
Brigand

Gemäß der ffmpeg-Dokumentation sollten Sie '* .png' anstelle von% 04d.png mit dem Glob-Mustertyp verwenden.
Freund von George

Das würde dann alle im Ordner vorhandenen PNGs außer 00xx.png auswählen, während das OP nur die PNGs von% 04d in die Warteschlange stellen möchte, ohne sich um die fortlaufende Nummerierung zu sorgen.
Gyan

2
Ich bin mir ziemlich sicher, dass Sie *.pngeinfache Anführungszeichen (so '*.png') verwenden müssen, um zu vermeiden, dass es durch Shells im Unix-Stil (so, OSX und Linux usw.) erweitert wird.
Übelsuppe

1
Leider machen die ffmpeg-Entwickler File-Globbing-Unterstützung zu einer Option ! Die Standard-Windows-Builds enthalten es nicht.
Timmmm

9

Von http://www.ffmpeg.org/faq.html : Wenn Sie eine große Anzahl von Bildern umbenennen müssen, können Sie den folgenden Befehl verwenden, um die Belastung zu verringern. Der Befehl verknüpft mit der Bourne-Shell-Syntax symbolisch alle Dateien im aktuellen Verzeichnis, die mit * jpg übereinstimmen, mit dem Verzeichnis '/ tmp' in der Reihenfolge 'img001.jpg', 'img002.jpg' usw.

x=1; for i in *jpg; do counter=$(printf %03d $x); ln -s "$i" /tmp/img"$counter".jpg; x=$(($x+1)); done


Ich habe diese mehrere Sequenzen zu kombinieren seqA-[0001-n].png, seqB-[0001-n].pngetc. Viel einfacher , als mit image2 rumgespielt Globbing und den concat - Filter.
z0r

Für mich ist das nicht funktionierte , bis ich ersetzt for i in *jpgmit for i in /full/path/*jpg, weil alle die Symlinks gebrochen wurden
Jezzamon

4

Ich würde tatsächlich das gleiche vorschlagen, was Mulvya vorgeschlagen hat. Wann immer ich beim Rendern von 3D-Animationen solche Dinge tun musste, habe ich die Dateien umbenannt, um sie sequenziell zu gestalten. Es ist einfach einfacher, auf diese Weise in vielen verschiedenen Programmen zu arbeiten, es sei denn, Sie müssen die Dateinamen aus irgendeinem Grund beibehalten. Total Commander ist auch ein großartiges Tool für das Umbenennen von Dateien.


Am Ende habe ich etwas Ähnliches gemacht (ein Python-Umbenennungsskript).
Brigand

3

Für den fehlenden Sequenzteil habe ich 2 Liner verwendet

CONCAT=$(echo $(ls *.png | sort -n -t _ -k 2) | sed -e "s/ /|/g")
ffmpeg -framerate 25 -i "concat:$CONCAT" -c:v libx264 -profile:v high -pix_fmt yuv420p output.mp4

Hoffe, das wird jemandem in Zukunft helfen

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.