Comment créer une vidéo à partir d'images avec FFmpeg?

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

Cette ligne a bien fonctionné mais je souhaite créer un fichier vidéo à partir d'images dans un autre dossier. Les noms d'image dans mon dossier sont:

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

Comment puis-je saisir des fichiers images à partir d'un autre dossier? Exemple:C:\mypics

J'ai essayé cette commande mais j'ai ffmpeggénéré une vidéo avec la première image (img001.jpg) uniquement.

ffmpeg -r 1/5 -start_number 0 -i C:\myimages\img%03d.png -c:v libx264 -r 30 -pix_fmt yuv420p out.mp4
user3877422
la source

Réponses:

170

Voir le Créer un diaporama vidéo à partir d'images - FFmpeg

Si votre vidéo n'affiche pas correctement les images Si vous rencontrez des problèmes, tels que la première image est sautée ou ne s'affiche que pour une image, utilisez le filtre vidéo fps au lieu de -r pour la fréquence d'images de sortie

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

Alternativement, le filtre vidéo de format peut être ajouté à la chaîne de filtres pour remplacer -pix_fmt yuv420p comme "fps = 25, format = yuv420p" . L'avantage de cette méthode est que vous pouvez contrôler quel filtre passe en premier

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

J'ai testé ci-dessous les paramètres, cela a fonctionné pour moi

"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

les paramètres ci-dessous ont également fonctionné mais il saute toujours la première image

"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

faire une vidéo à partir d'images placées dans différents dossiers

Tout d'abord, ajoutez des chemins d'image à imagepaths.txt comme ci-dessous.

# 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'

Exemple d'utilisation comme suit;

"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"

Le paramètre -safe 0 empêche l' erreur de nom de fichier non sécurisé

Liens connexes

FFmpeg faisant une vidéo à partir d'images placées dans différents dossiers

FFMPEG Un guide intermédiaire / séquence d'images

Concaténer - FFmpeg

khan
la source
"Si votre vidéo n'affiche pas correctement les images Si vous rencontrez des problèmes, tels que la première image est ignorée ou ne s'affiche que pour une image, utilisez le filtre vidéo fps à la place" Désolé, mais pouvez-vous expliquer ce que vous entendez par "fps filtre vidéo "exactement?
arnuschky
3
Pour autant que je sache, le paramètre -r est une fréquence d'images variable, cela signifie que FFMPEG peut supprimer ou dupliquer des images pour obtenir la fréquence d'images de sortie souhaitée. L'utilisation du filtre fps «-vf fps = valeur» force FFMPEG à produire une fréquence d'images constante. Voir Créer un diaporama vidéo à partir d'images - FFmpeg , et ceci Quelle est la différence (technique) entre -r et le filtre fps? . Donc, en utilisant le paramètre -r parfois couse saute la première image ..
khan
La première commande de cette liste ffmpeg -r 1/5 -i img%03d.png -c:v libx264 -vf fps=25 -pix_fmt yuv420p out.mp4semblait fonctionner mais a finalement abouti à une vidéo illisible par n'importe quel joueur (sur Ubuntu). VNC a dit, "atome moov introuvable". Essayer de remédier à cela avecqt-faststart produisant l'erreur «le dernier atome du fichier n'était pas un atome moov»
sh37211
150

-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 identifysortie 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, -globce 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 30rend la -framerate 1vidé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

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
la source
Si vous utilisez python et subprocess.call pour démarrer ffmpeg, vous ne devez pas utiliser les guillemets simples 'dans les noms de fichiers d'entrée et de sortie. Sinon, il ne trouvera pas les fichiers.
RunOrVeith
Ce serait génial pour moi, mais ma compilation à partir du package npm n'implémente ffmpeg-staticpas glob. ( Pattern type 'glob' was selected but globbing is not supported by this libavformat build)
Sebi
-pix_fmtcausé une Trailing options were found on the commandline.erreur
Anthony Kong le
@AnthonyKong je ne pourrais pas reproduire avec ffmpeg -framerate 1 -pattern_type glob -i '*.png' -c:v libx264 -r 30 -pix_fmt yuv420p out.mp4sur Ubuntun 19.10 ffmpeg 4.1.4 pour le moment, quelle est votre version et commande exacte?
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
21

Version simple de la documentation

Fonctionne particulièrement bien pour les images Google Earth Studio :

ffmpeg -framerate 24 -i Project%03d.png Project.mp4
Joshua Pinter
la source
1
Impossible de lire cette sortie: L'accélérateur matériel [h264 @ 0x7f148cc3cc40] n'a pas réussi à décoder l'image
Bram
salut comment puis-je exécuter cette commande je suis juste en train de trouver que pouvez-vous s'il vous plaît m'aider?
Innocent le
@Innocent Depuis votre terminal ou console.
Joshua Pinter le
je l'ai eu mais le projet% 3d.png n'a pas choisi toutes mes images dans un dossier avec le nom Project001.png, Project002.png et ainsi de suite il n'a obtenu que 2 images que dois-je faire pour obtenir toutes mes images et les convertir en vidéo
Innocent le
Utilisez-vous %3dou %03d?
Joshua Pinter le
10

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

du wiki

Faim
la source