2010-05-13 17:58:09 +0000 2010-05-13 17:58:09 +0000
89
89

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

Est-il possible d'utiliser ffmpeg de créer une vidéo à partir d'un ensemble de séquences, où le nombre ne part pas de 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 elle n'a pas fonctionné (il semble que le nombre devrait commencer à zéro) :

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

Des conseils ?

Réponses (10)

84
84
84
2012-08-28 13:19:14 +0000

Il n'est pas nécessaire de renommer les fichiers si vous utilisez le commutateur -start_number comme cela :

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

n est le début de la séquence d'images fixes.

_Note, cela fonctionnera tant que la séquence n'est pas interrompue une fois qu'elle a commencé. S'il y a des lacunes et que vous voulez que toutes les images soient incluses, il peut être nécessaire de renuméroter pour combler les lacunes.

Il y a d'autres interrupteurs que vous pourriez trouver utiles.

J'utilise la ligne suivante pour obtenir une fréquence d'image plus lente et pour compresser les images et avoir une vidéo résultante plus petite :

ffmpeg.exe -f image2 -framerate 25 -pattern_type sequence -start_number 1234 -r 3 -i Imgp%04d.jpg -s 720x480 test.avi

L'option -r 3 règle la fréquence d'images de la vidéo résultante à 3 images par seconde pour que je puisse voir chaque image fixe pendant une courte période de temps. L'option -s redimensionne les images à la résolution souhaitée pour gérer la taille de la vidéo résultante.

(Dans le shell de Windows, remplacez -i Imgp%04d.jpg par -i "Imgp%%04d.jpg". Crédit pour cela à Mike Fitzpatrick https://superuser.com/a/344178/153054 )

17
17
17
2010-07-18 17:02:21 +0000

Vous pouvez trouver un exemple de script dans la documentation ffmpeg documentation :

3.2 Comment puis-je encoder des images individuelles en films?

Si vous avez un grand nombre d'images à renommer, vous pouvez utiliser la commande suivante pour alléger la charge. La commande, utilisant la syntaxe du shell bourne, lie symboliquement tous les fichiers du répertoire courant qui correspondent à *jpg aux /tmp' directory in the sequence ofimg001.jpg’, `img002.jpg’ et ainsi de suite.

x=1; for i in *jpg; do counter=$(printf %03d $x); ln "$i" /tmp/img"$counter".jpg; x=$(($x+1)); done

Puis exécutez :

ffmpeg -f image2 -i /tmp/img%03d.jpg /tmp/a.mpg
14
14
14
2014-07-13 07:11:20 +0000

From ffmpeg’s docs :

L'utilisation d'un motif de globes

ffmpeg supporte également le globbing de style bash (* représente un nombre quelconque de caractères).

Ceci est utile si vos images sont séquentielles mais pas nécessairement dans un ordre numérique séquentiel comme dans les exemples précédents.

ffmpeg -r 1 -pattern_type glob -i 'test_*.jpg' -c:v libx264 out.mp4

Donc, tant que vos fichiers sont triés, l'utilisation du commutateur -pattern_type glob devrait fonctionner pour vous.

11
11
11
2010-05-13 18:15:35 +0000

Pour autant que je sache, vous ne pouvez pas commencer la séquence par des nombres aléatoires (je ne me souviens pas si vous devez la commencer à 0 ou 1), de plus, elle ne peut pas avoir de trous, si elle en a, ffmpeg supposera que la séquence est terminée et arrêtera d'ajouter d'autres images.

De plus, comme indiqué dans les commentaires de ma réponse, n'oubliez pas que vous devez spécifier la largeur de votre index. Comme :

image%03d.jpg

Et si vous utilisez un index de type %03d, vous devez ajouter 0 à vos noms de fichiers, comme :

image001.jpg image002.jpg image003.jpg

etc.

5
5
5
2010-05-13 18:23:37 +0000

Je suis d'accord avec Francisco, mais comme solution de contournement, vous pourriez simplement écrire un script rapide 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 alors appeler ffmpeg et ensuite supprimer les liens ou replacer les fichiers à leur emplacement d'origine.

2
2
2
2016-08-03 23:44:55 +0000

Je sais que c'est une vieille question, mais je l'ai trouvée dans Google en cherchant la même réponse. Aucune des réponses ne me satisfaisait complètement, alors j'ai fait plus de recherche et de lecture et c'est une 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'ai utilisé 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, ils vous permettent d'utiliser des fonctions de bash comme l'expansion des crochets et d'autres commandes comme grep pour affiner vos résultats si vous le souhaitez.
  2. Moins d'interrupteurs à mémoriser.
  3. Je recommande de ne pas utiliser -r, et d'utiliser -framerate à la place. D'après mon expérience, -r a tendance à faire tomber les images plus souvent.
  4. Moins complexe, pas d'interrupteurs inutiles en cours d'utilisation et il fonctionnera tel quel. Vous pouvez ajouter plus de complexité (par exemple, en spécifiant l'encodeur) et affiner le réglage en fonction de vos besoins.
0
0
0
2019-08-22 09:59:39 +0000

-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, y compris l'ajout d'audio à la vidéo de sortie.

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

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 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 : https://askubuntu.com/questions/648603/how-to-create-an-animated-gif-from-mp4-video-via-command-line/837574#837574

Ajoutez 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

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

Réponse à Comment convertir un fichier MP3 au 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 compresser à travers les images avec des algorithmes spécialisés :

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

A propos des options CLI

Notez cependant que malgré le nom, -glob ce n'est pas aussi général que les patters 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 basses fréquences : 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é de 1 image par seconde.

Prochaines étapes

Vous le 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

0
0
0
2017-10-30 18:28:51 +0000

Dans mon cas, c'était un peu plus compliqué à cause des chiffres des dossiers. Voici à quoi ressemblent mes images :

$ ls | head -5
2014_aq_unprocessed 001.jpg
2014_aq_unprocessed 002.jpg
2014_aq_unprocessed 003.jpg
2014_aq_unprocessed 004.jpg
2014_aq_unprocessed 005.jpg

et voici la commande que j'ai utilisée :

ffmpeg -i 2014_aq_unprocessed\ %3d.jpg -vcodec mpeg4 test.avi
0
0
0
2016-01-29 12:05:41 +0000

D'après la documentation , il semble que vous puissiez simplement utiliser *

For example, for creating a video from filenames matching the glob pattern foo-*.jpeg:

ffmpeg -f image2 -pattern_type glob -framerate 12 -i 'foo-*.jpeg' -s WxH foo.avi

Comme remarque, pour améliorer la qualité, le taux/fps peut être important (par exemple, en spécifiant d'abord un taux d'images par seconde très bas/élevé puis en passant d'un second filtre qui rendra la vidéo au ralenti normale ?)

0
0
0
2016-01-14 23:22:34 +0000

Vous pouvez le faire avec convert -morph :

convert *.jpg -delay 10 -morph 10 %05d.jpg

Si vous voulez utiliser ffmpeg, j'ai utilisé

ffmpeg -pattern_type glob -i '*.jpg' -vf "setpts=10*PTS" movie.mp4

où le 10*PTS dit à ffmpeg de le ralentir 10 fois. Vous pouvez également y avoir des fractions pour l'accélérer.