Question Comment créer une vidéo à partir d'images à l'aide de FFmpeg?


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

Par exemple, j'ai des 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 nombre devrait partir de zéro):

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

Un conseil?


80
2018-05-13 17:58


origine


Cela fait un moment que vous avez demandé ceci, 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 - Assad Ebrahim
@casperOne serait utile pour avoir une idée de la raison d'être de ce sujet. Cela semble être un problème de programmation spécifique. Le tag FFmpeg a 3.7k followers, et avec 27k vues, les utilisateurs le trouvent très utile. - geotheory
@geotheory Les statistiques de tag ne sont pas pertinentes. ffmpeg est un programme beaucoup à la manière de dire, WinRar. Alors que vous pouvez programmer contre le bibliothèques dans ffmpeg, cette question ne concerne pas cela. L'utilisation de ffmpeg à partir de la ligne de commande doit être demandée sur Super utilisateur, où il est sur le sujet. - casperOne


Réponses:


Il n'est pas nécessaire de renommer les fichiers si vous utilisez le -start_number passer comme ça:

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

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

Notez que cela fonctionnera tant que la séquence ne sera pas interrompue une fois qu'elle démarrera. S'il y a des lacunes et que vous souhaitez inclure toutes les images fixes, une renumérotation peut être nécessaire pour combler les lacunes.

Vous pouvez trouver d'autres commutateurs utiles.

J'utilise la ligne suivante pour obtenir une fréquence d'images plus lente et 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

le -r 3 l'option définit le framerate de la vidéo résultante à 3 images par seconde pour que je puisse toujours les voir pendant une courte période. le -s L'option permet de redimensionner les images à la résolution souhaitée pour gérer la taille de la vidéo résultante.

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


70
2017-08-28 13:19



Quelle est la différence entre -r et -framerate?
ils sont le même IIRC - rogerdpack
Pas besoin de bêtises de numérotation, du moment que vous êtes heureux d'accepter l'ordre dans lequel ils apparaissent (disons) 'ls' ... utilisez simplement: ffmpeg -pattern_type glob -i '* .jpg' movie.mp4 - Orwellophile
Y at-il un commutateur pour contrôler le temps écart entre les images, disons, je voudrais montrer la première image 13s, le deuxième 15s, 24s pour le troisième, l'intervalle de temps est défini par l'utilisateur, est-ce possible? - zionpi
voir également trac.ffmpeg.org/wiki/ - d3vid


vous pouvez utiliser cet extrait de code ci-dessous:

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

33
2017-11-08 14:33



Cela ne fait pas pivoter les fichiers JPG vers la rotation indiquée dans les métadonnées. - Erik Johansson


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

3.2 Comment encoder des images uniques dans des films?

Si vous devez renommer un grand nombre de photos, vous pouvez utiliser la commande suivante pour alléger le fardeau. La commande, utilisant la syntaxe du shell bourne, relie symboliquement tous les fichiers du répertoire courant correspondant à * jpg au /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 lancez:

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

17
2017-07-18 17:02



Vous feriez mieux de commencer x = 0 pour que le nom de l'image démarre img000.jpg, car c'est ce à quoi s'attendait ffmpeg. Aussi symlinking n'a pas fonctionné pour moi car ffmpeg ne pouvait pas trouver les fichiers, donc j'ai dû utiliser cp à la place (évidements de vitesse et d'espace évidents mais je les rme après tout). mv pourrait aussi fonctionner si cela ne vous dérange pas de perdre les originaux.
Notez que dans cette réponse, la commande fournie crée des liens durs, pas des liens symboliques. En ce qui concerne l'utilisation de cp si la liaison ne fonctionne pas, si votre système de fichiers le supporte cp --reflink=auto permettra d'atteindre une bien meilleure vitesse / utilisation de l'espace. - Félix Saparelli


Pour autant que je sache, vous ne pouvez pas démarrer la séquence dans des nombres aléatoires (je ne me souviens pas si vous devriez le démarrer à 0 ou 1), et en plus, ffmpeg supposera que la séquence est terminée et arrêtez d'ajouter plus d'images.

Aussi, 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 vos noms de fichiers à 0, comme:

image001.jpg image002.jpg image003.jpg

etc.


11
2018-05-13 18:15



Si les noms de fichiers image ont des zéros non significatifs, la chaîne de format doit également spécifier la largeur comme "% 03d".
Si c'est le seul obstacle, vous pouvez simplement écrire un script pour renommer ou relier vos images à un ensemble correctement réindexé. - Cascabel
Oui, j'ai déjà travaillé avec ça auparavant, j'ai écrit un wrapper en Ruby il y a quelque temps où vous avez appelé instance.addImage (), puis instance.processVideo () et créer un répertoire temporel, copier / renommer les images avec des index appropriés et créer la vidéo. C'est assez facile.
@Jefromi J'ai créé un lien symbolique mais comment donner le chemin du fichier de lien symbolique à ffmpeg? Cela suppose simplement que le fichier de lien symbolique est l'image que j'essaie de convertir? Je suis sur win7 btw
La séquence peut commencer entre 0 et 4 inclus. - Assad Ebrahim


De Documents de ffmpeg:

Utiliser un motif de glob

ffmpeg prend également en charge la globalisation 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, en utilisant le -pattern_type glob interrupteur devrait fonctionner pour vous.


9
2017-07-13 07:11



Notez que ce glob est plus limité que les globs shell classiques: trac.ffmpeg.org/ticket/3620 apparemment parce que le type d'image est déduit de l'extension. - Ciro Santilli 新疆改造中心 六四事件 法轮功


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. Le script pourrait alors appeler ffmpeg, puis supprimer les liens ou déplacer les fichiers vers leur emplacement d'origine.


5
2018-05-13 18:23





Chercher

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

1
2017-08-14 21:09





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

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


0
2017-11-11 18:04