-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 imagemagick
oder 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 identify
Ausgabe 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 -glob
nicht 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 30
macht das -framerate 1
Video 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