114 votes

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

Est-il possible d'utiliser ffmpeg pour créer une vidéo à partir d'un ensemble de séquences, où le numéro ne commence pas à zéro ?

Par exemple, j'ai quelques images [test_100.jpg, test_101.jpg, test_102.jpg, ..., test_200.jpg], et je veux les convertir en vidéo. J'ai essayé la commande suivante, mais cela n'a pas fonctionné (il semble que le numéro devrait commencer à zéro) :

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

Des conseils ?

0 votes

Il s'est écoulé un certain temps depuis que vous avez posé cette question, mais si vous êtes toujours intéressé par la question, la réponse est OUI - j'ai posté les détails et un exemple ci-dessous: stackoverflow.com/a/12160155/181638

0 votes

@casperOne ce serait utile d'avoir une idée de pourquoi cela est hors sujet. Il semble s'agir d'un problème de programmation spécifique. La balise FFmpeg compte 3,7k abonnés, et avec 27k vues, il est clair que les gens le trouvent utile.

2 votes

@geotheory Les statistiques de balises sont sans importance. ffmpeg est un programme à l'image de WinRar. Bien que vous puissiez programmer contre les bibliothèques dans ffmpeg, cette question ne concerne pas cela. L'utilisation de ffmpeg en ligne de commande doit être posée sur Super User, là où c'est pertinent.

10voto

-pattern_type glob exemples concrets avec audio

Cette option a été mentionnée à : https://superuser.com/a/782520/128124 mais voici quelques exemples concrets de son utilisation, notamment pour ajouter du son à la vidéo de sortie.

Diaporama vidéo avec une image par seconde

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

Ajoutez de la musique, coupez le son à la fin des images :

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émonstrations sur YouTube :

Soyez un hippie et utilisez le format vidéo Theora non breveté :

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 classées par ordre alphabétique, généralement comme suit :

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

et ainsi de suite.

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

Vidéo à vitesse normale avec une image par trame à 30 FPS

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

Voilà à quoi ça ressemble :

GIF généré avec : https://askubuntu.com/questions/648603/how-to-create-an-animated-gif-from-mp4-video-via-command-line/837574#837574

Ajoutez-y du son :

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

Convertir un fichier musical en une vidéo avec une image fixe pour le téléchargement sur YouTube

Répondu à : Comment convertir un MP3 en format vidéo autorisé par Youtube ?

Obtenir quelques images d'entrée de test synthétiques

Ce sont les images de test que j'ai utilisées dans cette réponse :

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 : https://stackoverflow.com/questions/3191978/how-to-use-glut-opengl-to-render-to-a-file/14324292#14324292

Il est intéressant d'observer à quel point la vidéo compresse la séquence d'images bien mieux que le ZIP, car elle est capable de comprimer plusieurs images grâce à des algorithmes spécialisés :

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

À propos des options de l'interface CLI

Notez cependant que malgré le nom, -glob ce n'est pas aussi général que les patrons 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 fait le -framerate 1 vidéo 30 FPS pour surmonter les bugs des lecteurs comme VLC pour les framerates bas : https://stackoverflow.com/questions/19267443/playback-issues-in-vlc-with-low-fps-video-from-images-using-ffmpeg/41797724#41797724 Il répète donc chaque image 30 fois pour conserver l'effet souhaité d'une image par seconde.

Prochaines étapes

Vous voudrez aussi :

TODO : apprendre à couper et concaténer plusieurs fichiers audio dans la vidéo à partir de la ligne de commande :

Testé sur

ffmpeg 3.4.4, vlc 3.0.3, Ubuntu 18.04.

Bibliographie

1 votes

C'est le seul qui a fonctionné pour moi sur macOS Mojave en utilisant des pngs.

1 votes

C'est la seule réponse qui a fonctionné pour moi. Merci beaucoup pour ton aide, mon ami.

5voto

Jason B Points 151

Je suis d'accord avec Francisco, mais en attendant, vous pourriez simplement écrire un petit script pour déplacer ou créer des liens symboliques vers les fichiers avec les numéros de séquence dont ffmpeg a besoin. Le script pourrait ensuite appeler ffmpeg et ensuite supprimer les liens ou déplacer les fichiers vers leurs emplacements d'origine.

3voto

David Bobb Points 31

Je sais que c'est une vieille question mais je suis tombé dessus sur Google en cherchant la même réponse. Aucune des réponses ici ne m'a complètement satisfait, alors j'ai continué à chercher et à lire et voici la commande que j'ai trouvée pour mon propre problème.

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

La raison pour laquelle j'utiliserais une commande comme celle-ci est...

  1. Cat et -f image2pipe vous donnent un contrôle plus fin sur les images que vous utilisez. Par exemple, cela vous permet d'utiliser des fonctionnalités bash comme l'expansion des crochets et d'autres commandes comme grep pour affiner vos résultats si vous le souhaitez.
  2. Moins de commutateurs à mémoriser.
  3. Je recommande de NE PAS utiliser -r, et simplement d'utiliser -framerate à la place. Dans mon expérience, -r a tendance à sauter plus souvent des images.
  4. Moins complexe, pas de commutateurs inutiles en cours d'utilisation et cela fonctionnera tel quel. Vous pouvez ajouter plus de complexité (par exemple, spécifier l'encodeur) et ajuster finement pour répondre à vos besoins.

0 votes

Pour la question de l'OP, -start_number est tout ce dont on a besoin.

2voto

Chercher

x=1; pour i in *jpg; faire counter=$(printf %03d $x); ln "$i"
/tmp/img"$counter".jpg; x=$(($x+1)); fait

0voto

J'ai utilisé l'encodeur flv puisque ma vidéo était destinée à être lue dans un lecteur flash (Jwplayer)

ffmpeg -i %d.jpg -vcodec flv test.flv

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X