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?
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
où 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 )
vous pouvez utiliser l'extrait de code ci-dessous:
cat *.jpg | ffmpeg -f image2pipe -r 1 -vcodec mjpeg -i - -vcodec libx264 out.mp4
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 of
img001.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
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.
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.
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.
chercher
x=1; for i in *jpg; do counter=$(printf %03d $x); ln "$i"
/tmp/img"$counter".jpg; x=$(($x+1)); done
À 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?)
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 ...
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
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ù 10*PTS
indique à ffmpeg de le ralentir 10 fois. Vous pouvez également avoir des fractions pour accélérer le processus.
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