2010-05-13 17:58:09 +0000 2010-05-13 17:58:09 +0000
89
89

Wie kann man mit FFmpeg ein Video aus Bildern erstellen?

Ist es möglich, mit ffmpeg ein Video aus einer Reihe von Sequenzen zu erstellen, bei denen die Nummer nicht bei Null beginnt?

Ich habe zum Beispiel einige Bilder [test_100.jpg, test_101.jpg, test_102.jpg, …, test_200.jpg] und möchte sie in ein Video konvertieren. Ich habe den folgenden Befehl ausprobiert, aber er hat nicht funktioniert (es scheint, dass die Zahl bei Null beginnen sollte):

ffmpeg -i test_%d.jpg -vcodec mpeg4 test.avi

Irgendwelche Tipps?

Antworten (10)

84
84
84
2012-08-28 13:19:14 +0000

Es ist nicht notwendig, Dateien umzubenennen, wenn Sie den Schalter -start_number wie folgt verwenden:

ffmpeg -start_number n -i test_%d.jpg -vcodec mpeg4 test.avi

wobei n der Beginn der Sequenz von Standbildern ist.

Hinweis: Dies funktioniert, solange die Sequenz nicht unterbrochen ist, sobald sie beginnt. Wenn es Lücken gibt und Sie möchten, dass alle Standbilder enthalten sind, kann eine Neunummerierung erforderlich sein, um die Lücken zu füllen.

Es gibt einige andere Schalter, die Sie vielleicht nützlich finden.

Ich verwende den folgenden Einzeiler, um eine langsamere Bildrate zu erhalten und um die Bilder zu komprimieren und ein kleineres resultierendes Video zu haben:

ffmpeg.exe -f image2 -framerate 25 -pattern_type sequence -start_number 1234 -r 3 -i Imgp%04d.jpg -s 720x480 test.avi

Die Option -r 3 setzt die Framerate des resultierenden Videos auf 3 Bilder pro Sekunde, so dass ich jedes Standbild für eine kurze Zeitspanne sehen kann. Die Option -s skaliert die Bilder auf die gewünschte Auflösung, um die Größe des resultierenden Videos zu verwalten.

(In der Windows-Shell ersetzen Sie -i Imgp%04d.jpg mit -i "Imgp%%04d.jpg". Der Dank hierfür geht an Mike Fitzpatrick https://superuser.com/a/344178/153054 )

17
17
17
2010-07-18 17:02:21 +0000

Ein Beispielskript finden Sie in der ffmpeg-Dokumentation :

3.2 Wie kodiere ich einzelne Bilder in Filme?

Wenn Sie eine große Anzahl von Bildern umbenennen müssen, können Sie den folgenden Befehl verwenden, um sich die Arbeit zu erleichtern. Der Befehl, der die Bourne-Shell-Syntax verwendet, verknüpft symbolisch alle Dateien im aktuellen Verzeichnis, die mit *jpg übereinstimmen, mit dem /tmp' directory in the sequence ofimg001.jpg’, `img002.jpg’ und so weiter.

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

Dann ausführen:

ffmpeg -f image2 -i /tmp/img%03d.jpg /tmp/a.mpg
14
14
14
2014-07-13 07:11:20 +0000

Aus ffmpeg’s docs:

Verwendung eines Glob-Musters

ffmpeg unterstützt auch Globbing im Bash-Stil (* steht für eine beliebige Anzahl von beliebigen Zeichen).

Dies ist nützlich, wenn Ihre Bilder sequentiell sind, aber nicht unbedingt in einer numerisch sequentiellen Reihenfolge wie in den vorherigen Beispielen.

ffmpeg -r 1 -pattern_type glob -i 'test_*.jpg' -c:v libx264 out.mp4

Solange Ihre Dateien also sortiert sind, sollte die Verwendung des Schalters -pattern_type glob für Sie funktionieren.

11
11
11
2010-05-13 18:15:35 +0000

Soweit ich weiß, können Sie die Sequenz nicht mit zufälligen Zahlen beginnen (ich weiß nicht mehr, ob Sie sie bei 0 oder 1 beginnen sollten), außerdem darf sie keine Lücken haben, sonst nimmt ffmpeg an, dass die Sequenz zu Ende ist und hört auf, weitere Bilder hinzuzufügen.

Außerdem, wie in den Kommentaren zu meiner Antwort erwähnt, denken Sie daran, dass Sie die Breite Ihres Indexes angeben müssen. Zum Beispiel:

image%03d.jpg

Und wenn Sie einen %03d-Index-Typ verwenden, müssen Sie Ihre Dateinamen mit 0 auffüllen, wie:

image001.jpg image002.jpg image003.jpg

usw.

5
5
5
2010-05-13 18:23:37 +0000

Ich stimme Francisco zu, aber als Workaround könnten Sie einfach ein schnelles Skript schreiben, um die Dateien mit den Sequenznummern, die ffmpeg benötigt, zu verschieben oder symbolische Links auf sie zu erstellen. Das Skript könnte dann ffmpeg aufrufen und dann die Links entfernen oder die Dateien zurück an ihren ursprünglichen Speicherort verschieben.

2
2
2
2016-08-03 23:44:55 +0000

Ich weiß, dies ist eine alte Frage, aber ich bin bei der Suche nach der gleichen Antwort in Google darauf gestoßen. Keine der Antworten hier befriedigte mich vollständig, also habe ich mehr gesucht und gelesen und dies ist ein Befehl, den ich für mein eigenes Problem gefunden habe.

cat {0032..1501}*.png | ffmpeg -f image2pipe -framerate 5 -i - -s 720x480 test2.avi

Der Grund, warum ich einen Befehl wie diesen verwenden würde, ist…

  1. Cat und -f image2pipe geben Ihnen eine feinere Kontrolle darüber, welche Bilder Sie verwenden. Zum Beispiel erlaubt es Ihnen, Bash-Funktionen wie Klammererweiterung und andere Befehle wie grep zu verwenden, um Ihre Ergebnisse zu verfeinern, wenn Sie wollen.
  2. Weniger Schalter, die man sich merken muss.
  3. Ich empfehle, NICHT -r zu verwenden und stattdessen nur -framerate zu benutzen. Meiner Erfahrung nach neigt -r dazu, Frames häufiger fallen zu lassen.
  4. Weniger komplex, keine unnötigen Schalter in Gebrauch und es wird so funktionieren wie es ist. Sie können mehr Komplexität hinzufügen (z. B. die Angabe des Encoders) und die Feinabstimmung nach Ihren Bedürfnissen vornehmen.
0
0
0
2019-08-22 09:59:39 +0000

-pattern_type glob Konkrete Beispiele mit Audio

Diese Option wurde erwähnt unter: https://superuser.com/a/782520/128124 , aber hier sind ein paar konkrete Beispiele für ihre Verwendung, einschließlich des Hinzufügens von Audio zum Ausgabevideo.

Diashow-Video mit einem Bild pro Sekunde

ffmpeg -framerate 1 -pattern_type glob -i '*.png' \
  -c:v libx264 -r 30 -pix_fmt yuv420p out.mp4

Fügen Sie eine Musik hinzu, die abgeschnitten wird, wenn der Ton am Ende der Bilder endet:

ffmpeg -framerate 1 -pattern_type glob -i '*.png' -i audio.ogg \
  -c:a copy -shortest -c:v libx264 -r 30 -pix_fmt yuv420p out.mp4

Hier sind zwei Demos auf YouTube:

Seien Sie ein Hippie und verwenden Sie das patentfreie Videoformat Theora :

ffmpeg -framerate 1 -pattern_type glob -i '*.png' -i audio.ogg \
  -c:a copy -shortest -c:v libtheora -r 30 -pix_fmt yuv420p out.ogg

Ihre Bilder sollten natürlich alphabetisch sortiert sein, typischerweise als:

0001-first-thing.jpg
0002-second-thing.jpg
0003-and-third.jpg

und so weiter.

Siehe auch: http://unix.stackexchange.com/questions/68770/converting-png-frames-to-video-at-1-fps/339399#339399

Normalgeschwindigkeitsvideo mit einem Bild pro Frame bei 30 FPS

ffmpeg -framerate 30 -pattern_type glob -i '*.png' \
  -c:v libx264 -pix_fmt yuv420p out.mp4

So sieht es aus:

GIF erzeugt mit: https://askubuntu.com/questions/648603/how-to-create-an-animated-gif-from-mp4-video-via-command-line/837574#837574

Fügen Sie etwas Audio hinzu:

ffmpeg -framerate 30 -pattern_type glob -i '*.png' \
  -i audio.ogg -c:a copy -shortest -c:v libx264 -pix_fmt yuv420p out.mp4

Ergebnis: https://www.youtube.com/watch?v=HG7c7lldhM4

Eine Musikdatei in ein Video mit einem festen Bild für den YouTube-Upload konvertieren

Beantwortet bei: How to convert MP3 to Youtube-allowed video format?

Erhalten Sie einige synthetische Test-Eingabebilder

Dies sind die Testbilder, die ich in dieser Antwort verwendet habe:

wget -O opengl-rotating-triangle.zip https://github.com/cirosantilli/media/blob/master/opengl-rotating-triangle.zip?raw=true
unzip opengl-rotating-triangle.zip
cd opengl-rotating-triangle
wget -O audio.ogg https://upload.wikimedia.org/wikipedia/commons/7/74/Alnitaque_%26_Moon_Shot_-_EURO_%28Extended_Mix%29.ogg

Bilder erzeugt mit: https://stackoverflow.com/questions/3191978/how-to-use-glut-opengl-to-render-to-a-file/14324292#14324292

Es ist cool zu beobachten, wie sehr das Video die Bildsequenz viel besser komprimiert als ZIP, da es in der Lage ist, mit speziellen Algorithmen über Frames hinweg zu komprimieren:

  • opengl-rotating-triangle.mp4: 340K
  • opengl-rotating-triangle.zip: 7.3M

Über die CLI-Optionen

Beachten Sie jedoch, dass dies trotz des Namens -glob nicht so allgemein ist wie Shell-Glob-Patterns, z. B.: -i '*' schlägt fehl: https://trac.ffmpeg.org/ticket/3620 (anscheinend, weil der Dateityp aus der Erweiterung abgeleitet wird).

-r 30 macht das -framerate 1-Video zu 30 FPS, um Bugs in Playern wie VLC für niedrige Frameraten zu überwinden: https://stackoverflow.com/questions/19267443/playback-issues-in-vlc-with-low-fps-video-from-images-using-ffmpeg/41797724#41797724 Daher wird jedes Bild 30 Mal wiederholt, um den gewünschten 1-Bild-pro-Sekunde-Effekt zu erhalten.

Nächste Schritte

Sie werden auch wollen:

TODO: lernen Sie, mehrere Audiodateien aus der Kommandozeile zu schneiden und in das Video zu verketten:

Tested on

ffmpeg 3.4.4, vlc 3.0.3, Ubuntu 18.04.

Bibliografie

0
0
0
2017-10-30 18:28:51 +0000

In meinem Fall war es wegen der Zahlen in den Dateien etwas kniffliger. Hier ist, wie meine Bilder aussehen:

$ ls | head -5
2014_aq_unprocessed 001.jpg
2014_aq_unprocessed 002.jpg
2014_aq_unprocessed 003.jpg
2014_aq_unprocessed 004.jpg
2014_aq_unprocessed 005.jpg

und hier ist der Befehl, den ich verwendet habe:

ffmpeg -i 2014_aq_unprocessed\ %3d.jpg -vcodec mpeg4 test.avi
0
0
0
2016-01-29 12:05:41 +0000

Aus der Dokumentation geht hervor, dass Sie einfach *

For example, for creating a video from filenames matching the glob pattern foo-*.jpeg:

ffmpeg -f image2 -pattern_type glob -framerate 12 -i 'foo-*.jpeg' -s WxH foo.avi

Als Hinweis, um die Qualität zu verbessern, könnte die Rate/fps wichtig sein (z. B. zuerst die Angabe einer sehr niedrigen/hohen Bildrate und dann ein zweiter Filter, der das Zeitlupenvideo zu einem normalen macht?)

0
0
0
2016-01-14 23:22:34 +0000

Sie können dies mit convert -morph tun:

convert *.jpg -delay 10 -morph 10 %05d.jpg

Wenn Sie ffmpeg verwenden wollen, habe ich

ffmpeg -pattern_type glob -i '*.jpg' -vf "setpts=10*PTS" movie.mp4

verwendet, wobei das 10*PTS ffmpeg anweist, es 10-fach zu verlangsamen. Sie können dort auch Brüche haben, um es zu beschleunigen.