Comment obtenir FFMPEG pour joindre des fichiers d'images non séquentiels? (sauter par 3s)

27

J'ai un tas d'images qui suivent ce modèle.

0001.png
0004.png
0007.png
0010.png
0013.png
0016.png
0019.png
...

Ils sont dans le bon ordre, mais FFMPEG ignore tout après le premier fichier, car il ne trouve pas de fichier 0002.png. Comment puis-je le faire joindre ces fichiers?

j'ai essayé

ffmpeg -i %04d.png out.avi
Brigand
la source
2
Que diriez-vous de les renommer temporairement, de créer l'AVI, puis de les renommer à nouveau (3x-2) .png? Bulk Rename Utility @ bulkrenameutility.co.uk/Main_Intro.php est un renamer en vrac gratuit, umm.
Gyan

Réponses:

18

avec ffmpeg 0.11.1 c'est aussi simple que:

ffmpeg -f image2 -i %*.png out.avi

Depuis la manpage, dans un exemple sous "Conversion de format de fichier vidéo et audio":

Lors de l'importation d'une séquence d'images, -iprend également en charge l'expansion interne des modèles de type shell (globbing). Pour réduire le risque d'interférer avec vos noms de fichiers réels et l'expansion de glob du shell, vous devez d'activer les caractères meta glob en les préfixant avec un seul %caractère, comme dans foo-%*.jpeg, foo-%?%?%?.jpegou foo-00%[234%]%*.jpeg.

Mise à jour par commentaires: sur les versions récentes, vous devez maintenant utiliser la -i '*.png'syntaxe.

rymo
la source
3
Cela n'a pas fonctionné pour moi en utilisant ffmpeg ou avconv dans Ubuntu 13.04
hellocatfood
2
Cela ne semble plus être une option.
Timmmm
2
Le glob_sequencetype de modèle est déconseillé, mais pas le globtype de modèle. La réponse de Mulvya et Peter Cordes fonctionne.
dr. Sybren
1
Pattern type 'glob_sequence' is deprecated: use pattern_type 'glob' instead
Serge Stroobandt
1
Juste pour clarifier, puisque cette page est actuellement le meilleur résultat dans Google pour ce message d'avertissement ( Pattern type 'glob_sequence' is deprecated...): la commande donnée par rymo ci-dessus (spécifiquement, -i %*.png) provoquera l'avertissement. Pour l'éliminer, utilisez la syntaxe légèrement différente dans la réponse de Peter Cordes ( -i '*.png').
James
19

Outre la solution de contournement dans mon commentaire, vous devriez pouvoir utiliser cette syntaxe de la documentation ffmpeg :

ffmpeg -f image2 -pattern_type glob -i '*.png' out.avi

Les guillemets sont importants, vous avez besoin de ffmpeg pour voir le *, ne pas avoir le shell le développer.

Gyan
la source
Cela ne fonctionne pas pour moi, mais c'est probablement parce que j'ai une version plus ancienne. J'accepte celui-ci car il est le plus susceptible d'aider les futurs utilisateurs.
Brigand
Selon la documentation de ffmpeg, vous devez utiliser '* .png' au lieu de% 04d.png avec le type de motif glob.
Friend Of George
Cela sélectionnerait alors tous les pngs présents dans le dossier, en plus de 00xx.png, alors que l'OP souhaite mettre en file d'attente uniquement les pngs% 04d sans se soucier de la continuité de la numérotation.
Gyan
2
Je suis à peu près sûr que vous devez mettre *.pngdes guillemets simples (donc '*.png') pour éviter qu'il ne soit étendu par des shells de style Unix (donc, OSX et linux, etc.).
evilsoup
1
Malheureusement, les développeurs de ffmpeg font de la prise en charge de la globalisation de fichiers une option ! Les versions standard de Windows ne l'incluent pas.
Timmmm
9

Depuis http://www.ffmpeg.org/faq.html : Si vous avez un grand nombre d'images à renommer, vous pouvez utiliser la commande suivante pour alléger le fardeau. La commande, en utilisant la syntaxe du bourne shell, lie symboliquement tous les fichiers du répertoire courant qui correspondent à * jpg au répertoire '/ tmp' dans la séquence 'img001.jpg', 'img002.jpg' et ainsi de suite.

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

Nikhil
la source
Je l'ai utilisé pour combiner plusieurs séquences seqA-[0001-n].png, seqB-[0001-n].pngetc. Beaucoup plus facile que de jouer avec le globbing image2 et le filtre de concaténation.
z0r
Pour moi , cela ne fonctionnait pas jusqu'à ce que je l' ai remplacé for i in *jpgavec for i in /full/path/*jpg, parce que tous les liens symboliques ont été brisées
Jezzamon
4

Je suggérerais en fait la même chose que Mulvya a suggéré. Chaque fois que j'ai eu besoin de faire des choses comme celle-ci lors du traitement des rendus d'animation 3D, j'ai renommé les fichiers pour les rendre séquentiels. Il est juste plus facile de travailler de cette façon dans de nombreux logiciels différents, sauf si vous devez conserver les noms de fichiers pour une raison quelconque. Total Commander est également un excellent outil pour le multi-renommage.

AJ Henderson
la source
J'ai fini par faire quelque chose de similaire (un script de changement de nom Python).
Brigand
3

Pour la partie de séquence manquante, j'ai utilisé 2 doublures

CONCAT=$(echo $(ls *.png | sort -n -t _ -k 2) | sed -e "s/ /|/g")
ffmpeg -framerate 25 -i "concat:$CONCAT" -c:v libx264 -profile:v high -pix_fmt yuv420p output.mp4

J'espère que cela aidera quelqu'un à l'avenir

Shakil
la source