Wie erstelle ich mit FFmpeg ein Video aus Bildern?

188
ffmpeg -r 1/5 -start_number 2 -i img%03d.png -c:v libx264 -r 30 -pix_fmt yuv420p out.mp4

Diese Zeile hat gut funktioniert, aber ich möchte eine Videodatei aus Bildern in einem anderen Ordner erstellen. Bildnamen in meinem Ordner sind:

img001.jpg
img002.jpg
img003.jpg
...

Wie kann ich Bilddateien aus einem anderen Ordner eingeben? Beispiel:C:\mypics

Ich habe diesen Befehl ausprobiert, aber nur ffmpegmit dem ersten Bild (img001.jpg) ein Video generiert.

ffmpeg -r 1/5 -start_number 0 -i C:\myimages\img%03d.png -c:v libx264 -r 30 -pix_fmt yuv420p out.mp4
user3877422
quelle
Verwandte Videos aus Einzelbildern stackoverflow.com/questions/25891342/…
Barlop

Antworten:

194

Siehe die Diashow Video aus Bildern erstellen - FFmpeg

Wenn in Ihrem Video die Bilder nicht korrekt angezeigt werden Wenn Probleme auftreten, z. B. wenn das erste Bild übersprungen wird oder nur für ein Bild angezeigt wird, verwenden Sie für die Ausgabe-Framerate den fps-Videofilter anstelle von -r

ffmpeg -r 1/5 -i img%03d.png -c:v libx264 -vf fps=25 -pix_fmt yuv420p out.mp4

Alternativ kann der Formatvideofilter zur Filterkette hinzugefügt werden, um -pix_fmt yuv420p wie "fps = 25, format = yuv420p" zu ersetzen . Der Vorteil dieser Methode ist, dass Sie steuern können, welcher Filter zuerst verwendet wird

ffmpeg -r 1/5 -i img%03d.png -c:v libx264 -vf "fps=25,format=yuv420p" out.mp4

Ich habe die folgenden Parameter getestet, es hat bei mir funktioniert

"e:\ffmpeg\ffmpeg.exe" -r 1/5 -start_number 0 -i "E:\images\01\padlock%3d.png" -c:v libx264 -vf "fps=25,format=yuv420p" e:\out.mp4

Die folgenden Parameter funktionierten ebenfalls, überspringen jedoch immer das erste Bild

"e:\ffmpeg\ffmpeg.exe" -r 1/5 -start_number 0 -i "E:\images\01\padlock%3d.png" -c:v libx264 -r 30 -pix_fmt yuv420p e:\out.mp4

Erstellen eines Videos aus Bildern in verschiedenen Ordnern

Fügen Sie zunächst wie unten beschrieben Bildpfade zu imagepaths.txt hinzu .

# this is a comment details https://trac.ffmpeg.org/wiki/Concatenate

file 'E:\images\png\images__%3d.jpg'
file 'E:\images\jpg\images__%3d.jpg'

Beispielnutzung wie folgt;

"h:\ffmpeg\ffmpeg.exe" -y -r 1/5 -f concat -safe 0 -i "E:\images\imagepaths.txt" -c:v libx264 -vf "fps=25,format=yuv420p" "e:\out.mp4"

-safe 0 Parameter verhindert Unsichere Dateinamen Fehler

Ähnliche Links

FFmpeg erstellt ein Video aus Bildern, die in verschiedenen Ordnern abgelegt sind

FFMPEG Eine Zwischenführung / Bildsequenz

Verketten - FFmpeg

Khan
quelle
"Wenn Ihr Video die Bilder nicht richtig anzeigt Wenn Sie auf Probleme stoßen, z. B. wenn das erste Bild übersprungen wird oder nur für ein Bild angezeigt wird, verwenden Sie stattdessen den fps-Videofilter." Entschuldigung, aber können Sie bitte erklären, was Sie unter "fps" verstehen Videofilter "genau?
Arnuschky
4
Soweit ich weiß, ist der Parameter –r eine variable Bildrate. Dies bedeutet, dass FFMPEG möglicherweise Bilder löscht oder dupliziert, um die gewünschte Ausgabebildrate zu erzielen. Mit dem fps-Filter "-vf fps = value" wird FFMPEG gezwungen, eine konstante Bildrate zu erzeugen. Siehe Erstellen einer Video-Diashow aus Bildern - FFmpeg und dies Was ist der (technische) Unterschied zwischen -r und dem fps-Filter? . Also mit -r Überspringen manchmal Parametern couse erstes Bild ..
khan
Der erste Befehl auf dieser Liste ffmpeg -r 1/5 -i img%03d.png -c:v libx264 -vf fps=25 -pix_fmt yuv420p out.mp4schien zu funktionieren, führte jedoch am Ende zu einem Video, das von keinem Spieler (unter Ubuntu) gelesen werden konnte. VNC sagte, "Moov-Atom nicht gefunden". Der Versuch, dies zu beheben, qt-faststarterzeugte den Fehler "Das letzte Atom in der Datei war kein Moov-Atom"
sh37211
Ich habe dieses -i img%05d.pngMuster verwendet, aber es gibt 133 Bilder, von denen nur 10 als Video erstellt wurden. Warum?
Aria
171

-pattern_type glob

Diese großartige Option erleichtert in vielen Fällen die Auswahl der Bilder.

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 etwas Musik hinzu, schneiden Sie ab, wenn das vermutlich längere Audio, wenn die Bilder enden:

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 Theora-Videoformat :

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, normalerweise wie folgt:

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

und so weiter.

Ich würde auch zuerst sicherstellen, dass alle zu verwendenden Bilder das gleiche Seitenverhältnis haben, möglicherweise indem ich sie vorher mit imagemagickoder nomacs beschneide , damit ffmpeg keine schwierigen Entscheidungen treffen muss. Insbesondere muss die Breite durch 2 teilbar sein, andernfalls schlägt die Konvertierung fehl mit: "Breite nicht durch 2 teilbar".

Video mit normaler Geschwindigkeit mit einem Bild pro Bild und 30 FPS

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

So sieht es aus:

GIF generiert mit: /ubuntu/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

Dies sind die Testmedien, die ich verwendet habe: a

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 generiert mit: Wie verwende ich GLUT / OpenGL, um in eine Datei zu rendern?

Es ist cool zu beobachten, wie stark das Video die Bildsequenz viel besser komprimiert als ZIP, da es mit speziellen Algorithmen Frames komprimieren kann:

  • opengl-rotating-triangle.mp4: 340K
  • opengl-rotating-triangle.zip: 7,3 M.

Konvertiere eine Musikdatei in ein Video mit einem festen Bild für den YouTube-Upload

Beantwortet unter: /superuser/700419/how-to-convert-mp3-to-youtube-allowed-video-format/1472572#1472572

Schritt für Schritt vollständige realistische Einrichtung der Diashow-Fallstudie

Das Erstellen von Diashows umfasst etwas mehr als das Ausführen eines einzelnen Befehls ffmpeg. Hier finden Sie ein interessanteres detailliertes Beispiel, das von dieser Zeitleiste inspiriert ist .

Holen Sie sich die Eingabemedien:

mkdir -p orig
cd orig
wget -O 1.png https://upload.wikimedia.org/wikipedia/commons/2/22/Australopithecus_afarensis.png
wget -O 2.jpg https://upload.wikimedia.org/wikipedia/commons/6/61/Homo_habilis-2.JPG
wget -O 3.jpg https://upload.wikimedia.org/wikipedia/commons/c/cb/Homo_erectus_new.JPG
wget -O 4.png https://upload.wikimedia.org/wikipedia/commons/1/1f/Homo_heidelbergensis_-_forensic_facial_reconstruction-crop.png
wget -O 5.jpg https://upload.wikimedia.org/wikipedia/commons/thumb/5/5a/Sabaa_Nissan_Militiaman.jpg/450px-Sabaa_Nissan_Militiaman.jpg
wget -O audio.ogg https://upload.wikimedia.org/wikipedia/commons/7/74/Alnitaque_%26_Moon_Shot_-_EURO_%28Extended_Mix%29.ogg
cd ..

# Convert all to PNG for consistency.
# /unix/29869/converting-multiple-image-files-from-jpeg-to-pdf-format
# Hardlink the ones that are already PNG.
mkdir -p png
mogrify -format png -path png orig/*.jpg
ln -P orig/*.png png

Jetzt haben wir einen kurzen Blick auf alle Bildgrößen, um das endgültige Seitenverhältnis zu bestimmen:

identify png/*

welche Ausgänge:

png/1.png PNG 557x495 557x495+0+0 8-bit sRGB 653KB 0.000u 0:00.000
png/2.png PNG 664x800 664x800+0+0 8-bit sRGB 853KB 0.000u 0:00.000
png/3.png PNG 544x680 544x680+0+0 8-bit sRGB 442KB 0.000u 0:00.000
png/4.png PNG 207x238 207x238+0+0 8-bit sRGB 76.8KB 0.000u 0:00.000
png/5.png PNG 450x600 450x600+0+0 8-bit sRGB 627KB 0.000u 0:00.000

Daher scheint das klassische Seitenverhältnis von 480p (640 x 480 == 4/3) angemessen zu sein.

Führen Sie eine Konvertierung mit minimaler Größenänderung durch, um die Breite gleichmäßig zu machen (TODO-Automatisierung für jede Breite, hier habe ich nur die identifyAusgabe manuell betrachtet und Breite und Höhe um eins reduziert):

mkdir -p raw
convert png/1.png -resize 556x494 raw/1.png
ln -P png/2.png png/3.png png/4.png png/5.png raw
ffmpeg -framerate 1 -pattern_type glob -i 'raw/*.png' -i orig/audio.ogg -c:v libx264 -c:a copy -shortest -r 30 -pix_fmt yuv420p raw.mp4

Dies erzeugt eine schreckliche Ausgabe, weil von:

ffprobe raw.mp4

ffmpeg nimmt nur die Größe des ersten Bildes (556 x 494) an und konvertiert dann alle anderen Bilder in genau diese Größe, wodurch das Seitenverhältnis unterbrochen wird.

Konvertieren wir nun die Bilder automatisch in das Ziel-Seitenverhältnis von 480p, indem wir sie gemäß ImageMagick zuschneiden : Wie kann ein Bild minimal auf ein bestimmtes Seitenverhältnis zugeschnitten werden?

mkdir -p auto
mogrify -path auto -geometry 640x480^ -gravity center -crop 640x480+0+0 png/*.png
ffmpeg -framerate 1 -pattern_type glob -i 'auto/*.png' -i orig/audio.ogg -c:v libx264 -c:a copy -shortest -r 30 -pix_fmt yuv420p auto.mp4

Das Seitenverhältnis ist also gut, aber es musste zwangsläufig etwas beschnitten werden, wodurch interessante Teile der Bilder zerschnitten wurden.

Die andere Option besteht darin, mit schwarzem Hintergrund aufzufüllen, um das gleiche Seitenverhältnis wie unter gezeigt zu haben: Größe ändern, um in ein Feld zu passen, und Hintergrund auf "leerem" Teil auf Schwarz setzen

mkdir -p black
ffmpeg -framerate 1 -pattern_type glob -i 'black/*.png' -i orig/audio.ogg -c:v libx264 -c:a copy -shortest -r 30 -pix_fmt yuv420p black.mp4

Im Allgemeinen können Sie jedoch idealerweise Bilder mit denselben oder ähnlichen Seitenverhältnissen auswählen, um diese Probleme zu vermeiden.

Informationen zu den CLI-Optionen

Beachten Sie jedoch, dass dies trotz des Namens -globnicht so allgemein ist wie Shell-Glob-Muster, z. B.: Fehlgeschlagen -i '*': https://trac.ffmpeg.org/ticket/3620 (anscheinend, weil der Dateityp von der Erweiterung abgeleitet wird).

-r 30macht das -framerate 1Video 30 FPS, um Fehler in Playern wie VLC für niedrige Frameraten zu überwinden: VLC friert für Videos mit niedrigen 1 FPS ein, die aus Bildern mit ffmpeg erstellt wurden. Daher wird jedes Bild 30 Mal wiederholt, um den gewünschten Effekt von 1 Bild pro Sekunde beizubehalten.

Nächste Schritte

Sie werden auch wollen:

TODO: Lernen Sie, mehrere Audiodateien ohne Zwischendateien in das Video zu schneiden und zu verketten. Ich bin mir ziemlich sicher, dass dies möglich ist:

Getestet am

ffmpeg 3.4.4, vlc 3.0.3, Ubuntu 18.04.

Literaturverzeichnis

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
quelle
Wenn Sie zum Starten von ffmpeg python und subprocess.call verwenden, sollten Sie die einfachen Anführungszeichen 'in den Namen der Eingabe- und Ausgabedateien nicht verwenden. Andernfalls werden die Dateien nicht gefunden.
RunOrVeith
1
Das wäre großartig für mich, aber mein Build aus dem npm-Paket ffmpeg-staticimplementiert glob nicht. ( Pattern type 'glob' was selected but globbing is not supported by this libavformat build)
Sebi
-pix_fmtverursachter Trailing options were found on the commandline.Fehler
Anthony Kong
@AnthonyKong Ich konnte mit ffmpeg -framerate 1 -pattern_type glob -i '*.png' -c:v libx264 -r 30 -pix_fmt yuv420p out.mp4Ubuntun 19.10 ffmpeg 4.1.4 gerade nicht reproduzieren. Was ist Ihre Version und der genaue Befehl?
Ciro Santilli 法轮功 冠状 病 六四 事件 11
Früher -r 15 -f image2 -s 512x512 -i "sequencePath" -vcodec libx264 -crf 25 -pix_fmt yuv420p -y "1.mp4"habe ich Videos aus Sequenzbildern von IM00001.jpg'IM00133.jpg' erstellt, aber nur einige davon sind in Videos wie 15 vorhanden. Wie man dies ändert, um entfernte Duplikate zu ignorieren oder alle Bilder als Videos mit einer bestimmten Framerate zu erstellen, möchte ich nicht ffmpegirgendetwas entfernen, ich will alles?
Aria
22

Einfache Version aus den Dokumenten

Funktioniert besonders gut für Google Earth Studio- Bilder:

ffmpeg -framerate 24 -i Project%03d.png Project.mp4
Joshua Pinter
quelle
1
Diese Ausgabe kann nicht abgespielt werden: [h264 @ 0x7f148cc3cc40] Hardwarebeschleuniger konnte Bild nicht dekodieren
Bram
Hallo, wie kann ich diesen Befehl ausführen? Ich finde nur, dass Sie mir bitte helfen können.
Unschuldiger
@Innocent Von Ihrem Terminal oder Ihrer Konsole aus.
Joshua Pinter
bekam es der Mensch aber 3d.png Projekt% nicht abholen meine alle Bilder in einem Ordner mit dem Namen Project001.png, Project002.png und so auf sie nur noch 2 Bilder , was ich tun sollte alle meine Bilder und wandeln es in Video zu bekommen
Unschuldig
Benutzt du %3doder %03d?
Joshua Pinter
14

cat *.png | ffmpeg -f image2pipe -i - output.mp4

aus dem Wiki

Hunger
quelle