web-dev-qa-db-fra.com

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 dont le nombre ne commence pas à zéro?

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

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

Un conseil?

86
vailen

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

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

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

Remarque, cela fonctionnera tant que la séquence sera intacte une fois qu'elle aura commencé. S'il existe des lacunes et que vous souhaitez que toutes les images soient incluses, il peut s'avérer nécessaire de renuméroter pour combler les lacunes.

Il existe d'autres commutateurs que vous pourriez trouver utiles.

J'utilise la pellicule suivante pour obtenir un taux de trame plus lent, pour compresser les images et obtenir une vidéo 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 définit le nombre d'images par seconde de la vidéo résultante sur 3 images par seconde afin que je puisse les voir toutes pendant une courte période. L'option -s redimensionne les images à la résolution souhaitée pour gérer la taille de la vidéo obtenue.

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

78
Assad Ebrahim

vous pouvez utiliser l'extrait de code ci-dessous:

 cat *.jpg | ffmpeg -f image2pipe -r 1 -vcodec mjpeg -i - -vcodec libx264 out.mp4
37
kuanghaibin

Vous trouverez un exemple de script dans la documentation ffmpeg :

3.2 Comment encoder des images individuelles dans des films?

Si vous devez renommer un grand nombre d'images, vous pouvez utiliser la commande suivante pour alléger le fardeau. La commande, utilisant la syntaxe bourne Shell, lie symboliquement tous les fichiers du répertoire en cours correspondant à * jpg au /tmp' directory in the sequence ofimg001.jpg ', `img002.jpg', etc.

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

Puis lancez:

ffmpeg -f image2 -i /tmp/img%03d.jpg /tmp/a.mpg
17
gaizka

De Les documents de ffmpeg:

Utiliser un motif glob

ffmpeg prend également en charge l’agencement 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 séquentiel numérique 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.

12
Nevin Williams

Autant que je sache, vous ne pouvez pas démarrer la séquence en nombres aléatoires (je ne me souviens pas si vous devriez le commencer à 0 ou 1). De plus, il ne peut pas y avoir de lacunes. arrêtez d'ajouter plus d'images.

En outre, comme indiqué dans les commentaires de ma réponse, rappelez-vous que vous devez spécifier la largeur de votre index. Comme:

image% 03d.jpg

Et si vous utilisez un type d'index% 03d, vous devez ajouter à 0 le nom de fichier, comme suit:

image001.jpg image002.jpg image003.jpg

etc.

11
Francisco Soto

Je suis d'accord avec Francisco, mais comme solution de contournement, vous pouvez simplement écrire un script rapide pour déplacer ou créer des liens symboliques vers les fichiers avec les numéros de séquence nécessaires à ffmpeg. Le script peut ensuite appeler ffmpeg, puis supprimer les liens ou ramener les fichiers à leur emplacement d'origine.

5
Jason B

chercher

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

À partir de 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

Il est à noter que pour améliorer la qualité, le débit en ips pourrait être important (par exemple, spécifier d'abord une fréquence d'images très basse/élevée, puis passer d'un deuxième filtre qui rendra la vidéo au ralenti en vidéo normale?)

0
ntg

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 ici ne me satisfaisait complètement alors j'ai fait plus de recherches et de lectures et c'est une commande que j'ai élaboré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 permettent de mieux contrôler les images que vous utilisez. Par exemple, il vous permet d’utiliser des fonctionnalités bash telles que l’élargissement du support et d’autres commandes telles que grep pour affiner vos résultats si vous le souhaitez.
  2. Moins de commutateurs à retenir.
  3. Je recommande de NE PAS utiliser -r, mais simplement -framerate. Dans mon expérience, -r a tendance à perdre des images plus souvent.
  4. Moins complexe, pas de commutateurs inutiles utilisés et cela fonctionnera tel quel. Vous pouvez ajouter plus de complexité (par exemple, spécifier un encodeur) et ajuster au mieux vos besoins.
0
David Bobb

J'ai utilisé l'encodeur flv car ma vidéo était enregistrée dans un lecteur flash (Jwplayer)

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

0
nick phillips

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

10*PTS indique à ffmpeg de le ralentir 10 fois. Vous pouvez également avoir des fractions pour accélérer le processus.

0
Martin Thoma

Dans mon cas, c'était un peu plus compliqué à cause des chiffres dans les fichiers. 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
Mona Jalal