-pattern_type glob
Cette excellente option facilite la sélection des images dans de nombreux cas.
Vidéo de diaporama avec une image par seconde
ffmpeg -framerate 1 -pattern_type glob -i '*.png' \
-c:v libx264 -r 30 -pix_fmt yuv420p out.mp4
Ajoutez-y de la musique, coupez lorsque l'audio probablement plus long lorsque les images se terminent:
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
Voici deux démos sur YouTube:
Soyez un hippie et utilisez le format vidéo sans brevet 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
Vos images doivent bien sûr être triées par ordre alphabétique, généralement comme suit:
0001-first-thing.jpg
0002-second-thing.jpg
0003-and-third.jpg
etc.
Je voudrais également d'abord m'assurer que toutes les images à utiliser ont le même rapport hauteur / largeur, éventuellement en les recadrant avec imagemagick
ou des nomacs au préalable, afin que ffmpeg n'ait pas à prendre de décisions difficiles. En particulier, la largeur doit être divisible par 2, sinon la conversion échoue avec: "largeur non divisible par 2".
Vidéo à vitesse normale avec une image par image à 30 FPS
ffmpeg -framerate 30 -pattern_type glob -i '*.png' \
-c:v libx264 -pix_fmt yuv420p out.mp4
Voici à quoi cela ressemble:
GIF généré avec: /ubuntu/648603/how-to-create-an-animated-gif-from-mp4-video-via-command-line/837574#837574
Ajoutez-y de l'audio:
ffmpeg -framerate 30 -pattern_type glob -i '*.png' \
-i audio.ogg -c:a copy -shortest -c:v libx264 -pix_fmt yuv420p out.mp4
Résultat: https://www.youtube.com/watch?v=HG7c7lldhM4
Voici les supports de test que j'ai utilisés: 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
Images générées avec: Comment utiliser GLUT / OpenGL pour rendre dans un fichier?
Il est cool d'observer à quel point la vidéo compresse la séquence d'images bien mieux que ZIP car elle est capable de compresser entre les images avec des algorithmes spécialisés:
opengl-rotating-triangle.mp4
: 340 000
opengl-rotating-triangle.zip
: 7,3 M
Convertir un fichier de musique en vidéo avec une image fixe pour le téléchargement sur YouTube
Réponse à l' adresse : /superuser/700419/how-to-convert-mp3-to-youtube-allowed-video-format/1472572#1472572
Configuration de l'étude de cas de diaporama réaliste complète étape par étape
Il y a un peu plus à créer des diaporamas que d'exécuter une seule commande ffmpeg, voici donc un exemple détaillé plus intéressant inspiré de cette chronologie .
Obtenez le support d'entrée:
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
Nous examinons maintenant rapidement toutes les tailles d'image pour décider du rapport hauteur / largeur final:
identify png/*
qui sort:
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
le format d'image classique 480p (640x480 == 4/3) semble donc approprié.
Faites une conversion avec un redimensionnement minimal pour rendre les largeurs égales (TODO automatise pour n'importe quelle largeur, ici j'ai juste regardé manuellement la identify
sortie et réduit la largeur et la hauteur de un):
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
Cela produit un résultat terrible, car vu de:
ffprobe raw.mp4
ffmpeg prend juste la taille de la première image, 556x494, puis convertit toutes les autres à cette taille exacte, cassant leur rapport hauteur / largeur.
Maintenant, convertissons automatiquement les images au rapport hauteur / largeur cible 480p en recadrant selon ImageMagick: comment recadrer au minimum une image à un certain rapport hauteur / largeur?
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
Alors maintenant, le rapport hauteur / largeur est bon, mais inévitablement un recadrage a dû être fait, ce qui a coupé des parties intéressantes des images.
L'autre option est de remplir avec un arrière-plan noir pour avoir le même rapport hauteur / largeur que celui indiqué à: Redimensionner pour tenir dans une boîte et définir l'arrière-plan en noir sur la partie "vide"
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
De manière générale, cependant, vous serez idéalement en mesure de sélectionner des images avec des proportions identiques ou similaires pour éviter ces problèmes en premier lieu.
À propos des options CLI
Notez cependant que malgré le nom, -glob
ce n'est pas aussi général que les modèles de shell Glob, par exemple: -i '*'
échoue: https://trac.ffmpeg.org/ticket/3620 (apparemment parce que le type de fichier est déduit de l'extension).
-r 30
rend la -framerate 1
vidéo 30 FPS pour surmonter les bogues dans les lecteurs comme VLC pour les faibles fréquences d'images: VLC se fige pour une vidéo à 1 FPS faible créée à partir d'images avec ffmpeg Par conséquent, il répète chaque image 30 fois pour conserver l'effet 1 image par seconde souhaité.
Prochaines étapes
Vous voudrez également:
TODO: apprenez à couper et concaténer plusieurs fichiers audio dans la vidéo sans fichiers intermédiaires, je suis presque sûr que c'est possible:
Testé sur
ffmpeg 3.4.4, vlc 3.0.3, Ubuntu 18.04.
Bibliographie