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.

104voto

Nick Points 11

Il n'est pas nécessaire de renommer les fichiers si vous utilisez l'interrupteur -start_number comme suit:

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 est continue une fois qu'elle commence. S'il y a des lacunes et que vous voulez inclure toutes les images fixes, alors il peut être nécessaire de renuméroter pour combler les lacunes.

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

J'utilise la commande suivante pour obtenir une cadence d'images plus lente, compresser les images et obtenir une vidéo de taille réduite:

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 cadence 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. L'option -s redimensionne les images à la résolution souhaitée pour gérer la taille de la vidéo résultante.

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

4 votes

Quelle est la différence entre -r et -framerate?

1 votes

Ils sont les mêmes si je me souviens bien

37 votes

Pas besoin de numéroter les absurdités, tant que vous êtes prêt à accepter l'ordre dans lequel ils apparaissent (par exemple 'ls')... utilisez simplement : ffmpeg -pattern_type glob -i '*.jpg' movie.mp4

41voto

Vous pouvez utiliser ce extrait de code ci-dessous:

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

1 votes

Cela ne fait pas tourner les JPG à la rotation indiquée dans les métadonnées.

1 votes

Comment puis-je changer le taux d'images par seconde dans ceci?

1 votes

@Paddy le paramètre -r 1 détermine le framerate, dans ce cas c'est 1 image par seconde, donc changez-le en -r 30 ou similaire

32voto

Stefan Hendriks Points 1077

De docs de ffmpeg :

Utilisation d'un motif glob

ffmpeg supporte également le globbing de style bash (* représente n'importe quel nombre de caractères).

Ceci est utile si vos images sont séquentielles mais pas nécessairement dans un ordre numériquement 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 de l'interrupteur -pattern_type glob devrait fonctionner pour vous.

0 votes

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.

0 votes

Notez que les guillemets autour du motif sont importants dans le cas où un glob est utilisé.

19voto

gaizka Points 291

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

3.2 Comment puis-je encoder des images individuelles en vidéos ?

Si vous avez un grand nombre d'images à renommer, vous pouvez utiliser la commande suivante pour faciliter la tâche. La commande, utilisant la syntaxe shell bourne, lie de manière symbolique tous les fichiers dans le répertoire actuel qui correspondent à *jpg au répertoire /tmp dans la séquence de img001.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

Ensuite, exécutez :

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

2 votes

Il serait préférable de mettre x=0 pour commencer afin que le nom de l'image commence par img000.jpg, car c'est ce que ffmpeg attend. De plus, la création de liens symboliques n'a pas fonctionné pour moi car ffmpeg ne pouvait pas trouver les fichiers, j'ai donc dû utiliser cp à la place (bien que cela entraîne une perte de vitesse et d'espace évidente, mais je les supprime de toute façon après). mv fonctionnerait également si vous ne vous souciez pas de perdre les originaux.

0 votes

Notez que dans cette réponse, la commande fournie crée des liens physiques, pas des liens symboliques. En ce qui concerne l'utilisation de cp si le lien ne fonctionne pas, si votre système de fichiers le prend en charge, cp --reflink=auto permettra d'obtenir une vitesse/utilisation de l'espace bien meilleure.

11voto

Francisco Soto Points 227

Autant que je sache, vous ne pouvez pas commencer la séquence avec des nombres aléatoires (je ne me souviens pas si vous devez commencer à 0 ou à 1), de plus, elle ne peut pas comporter de lacunes, si c'est le cas, ffmpeg supposera que la séquence est terminée et cessera d'ajouter des images.

Aussi, comme indiqué dans les commentaires de ma réponse, rappelez-vous que vous devez spécifier la largeur de votre indice. Par exemple :

image%03d.jpg

Et si vous utilisez un type d'indice %03d, vous devez compléter vos noms de fichiers avec des 0, comme :

image001.jpg image002.jpg image003.jpg

etc.

1 votes

Si les noms de fichiers image ont des zéros en tête, alors la chaîne de format doit également spécifier la largeur comme "%03d".

1 votes

Si c'est le seul obstacle, vous pourriez simplement écrire un script pour renommer ou créer des liens symboliques vers vos images, afin de les réindexer correctement.

1 votes

Oui, j'ai déjà travaillé avec cela avant, j'ai écrit un wrapper en Ruby il y a quelque temps où vous avez appelé instance.addImage(), puis instance.processVideo() et il créerait un répertoire temporaire, copierait / renommerait les images avec des index appropriés et créerait la vidéo. C'est assez facile.

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