Clarification pour l'option d'entrée ffmpeg avec des fichiers d'image en entrée

34

J'ai quelques images et je voudrais faire un gif animé avec ffmpeg. Les images ont des noms comme:

837_1.png
838_1.png
...

J'essaie de comprendre l' option de ligne de commande -i de ffmpeg mais je me plante contre certains problèmes.

Si je ne précise rien, il me demande de remplacer les fichiers:

ffmpeg -i * -vcodec libx264 out.mp4

ffmpeg version 1.2.1 Copyright (c) 2000-2013 the FFmpeg developers
  built on Jul 26 2013 20:18:03 with Apple LLVM version 4.2 (clang-425.0.28) (based on LLVM 3.2svn)
  configuration: --prefix=/usr/local/Cellar/ffmpeg/1.2.1 --enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-nonfree --enable-hardcoded-tables --enable-avresample --enable-vda --cc=cc --host-cflags= --host-ldflags= --enable-libx264 --enable-libfaac --enable-libmp3lame --enable-libxvid
  libavutil      52. 18.100 / 52. 18.100
  libavcodec     54. 92.100 / 54. 92.100
  libavformat    54. 63.104 / 54. 63.104
  libavdevice    54.  3.103 / 54.  3.103
  libavfilter     3. 42.103 /  3. 42.103
  libswscale      2.  2.100 /  2.  2.100
  libswresample   0. 17.102 /  0. 17.102
  libpostproc    52.  2.100 / 52.  2.100
Input #0, image2, from '358_1.png':
  Duration: 00:00:00.04, start: 0.000000, bitrate: N/A
    Stream #0:0: Video: png, rgb24, 550x550, 25 tbr, 25 tbn, 25 tbc
File '359_1.png' already exists. Overwrite ? [y/N]

Et si j'essaie d'utiliser l'un des formats les plus utilisés (% d) sur Internet .. ffmpeg ne trouve pas les fichiers:

fmpeg -i '%3d_1.png' -vcodec libx264 out.mp4

ffmpeg version 1.2.1 Copyright (c) 2000-2013 the FFmpeg developers
  built on Jul 26 2013 20:18:03 with Apple LLVM version 4.2 (clang-425.0.28) (based on LLVM 3.2svn)
  configuration: --prefix=/usr/local/Cellar/ffmpeg/1.2.1 --enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-nonfree --enable-hardcoded-tables --enable-avresample --enable-vda --cc=cc --host-cflags= --host-ldflags= --enable-libx264 --enable-libfaac --enable-libmp3lame --enable-libxvid
  libavutil      52. 18.100 / 52. 18.100
  libavcodec     54. 92.100 / 54. 92.100
  libavformat    54. 63.104 / 54. 63.104
  libavdevice    54.  3.103 / 54.  3.103
  libavfilter     3. 42.103 /  3. 42.103
  libswscale      2.  2.100 /  2.  2.100
  libswresample   0. 17.102 /  0. 17.102
  libpostproc    52.  2.100 / 52.  2.100
[image2 @ 0x7f963a006600] Could find no file with with path '%3d_1.png' and index in the range 0-4
%3d_1.png: No such file or directory

Alors .. voici la question, comment utiliser l' option de ligne de commande -i avec ffmpg?

Par souci de clarté, je suis sur Mac OSX 10.8, ffmpeg version 1.2.1, zsh 4.3.11

nkint
la source

Réponses:

47

Sans aucune autre option, le image2démultiplexeur de ffmpeg recherchera une séquence commençant par 0. Il vérifiera également cet index, avec une plage par défaut de 5 (c'est pourquoi il se plaindra de l'absence d'index dans la plage 0–4). Selon la documentation , vous devez définir le numéro de début si vous souhaitez commencer à un index arbitraire, comme 837.

ffmpeg -start_number 837 -i '%3d_1.png' -c:v libx264 out.mp4

Espace colorimétrique dans la conversion PNG en H.264

Étant donné que les fichiers PNG utilisent l'espace colorimétrique RVB pour représenter les pixels, la conversion en H.264 finirait par être YUV 4: 4: 4 ( non sous-échantillonné ). La vidéo résultante peut ne pas être jouable sur tous les joueurs, notamment sur tout ce qui n'est pas basé sur FFmpeg. Votre joueur n'afficherait que des cadres noirs, ou pourrait planter. Pour résoudre ce problème, changez le format de pixel en YUV 4: 2: 0:

ffmpeg -start_number 837 -i '%3d_1.png' -c:v libx264 -pix_fmt yuv420p out.mp4

Afin de contrôler la qualité, utilisez l' -crfoption. Voir le guide d'encodage x264 pour plus d'informations.

Pourquoi le *glob ne fonctionne pas

N'utilisez pas l' *option comme entrée. Le shell le développera dans tous les fichiers du répertoire courant avant de le ffmpegvoir, donc la commande se développera ffmpeg -i file1 file2 … filen. Étant donné que tous les fichiers d'entrée ont ffmpegbesoin de l' -ioption, cela prendra file2 … filenà la place des fichiers de sortie et les écrasera. Pas bon.

slhck
la source
réponse très complète! et avez-vous également des conseils sur le gif animé?
nkint
Pour les GIF animés, vous souhaitez effectuer une mise à jour vers ffmpeg version 2.0 et supérieure, car ils ont considérablement amélioré la qualité visuelle. La page de téléchargement contient des liens vers des versions statiques pour OS X. Pour les anciens ffmpeg, voir: ffmpeg convertit la vidéo .flv en .gif avec une qualité horrible
slhck
En fait, il vérifie non seulement + 0..4 mais aussi 8,16,32,64 etc. Ceci est perceptible lors de l'utilisation d'URL HTTP. Cependant, image2ne parvient pas à reconnaître que 200 OKc'est l'équivalent de «fichier trouvé», il n'arrête donc pas la recherche.
MSalters
1
J'obtiens la même chose même après avoir essayé de mettre en œuvre vos suggestions. Mes fichiers sont nommés DSCxxxxx.jpgxxxxxest un nombre à 5 chiffres commençant par zéro (notez que je n'ai pas de soulignement). Pourtant, après avoir couru, ffmpeg -r 30 -start_number 04606 -i DSC%d.jpg out.mp4j'obtiens la même erreur que dans le message d'origine ci
Anonyme
@jphollowed Avez-vous mis le modèle de nom de fichier entre guillemets?
slhck
29

La globalisation peut être activée en spécifiant l' -pattern_type globoption:

ffmpeg -pattern_type glob -i '*.png' -vcodec libx264 out.mp4
yohanson
la source
2
Bien meilleure façon :)
Gustav
3
Seulement cela a fonctionné pour moi. Pas moyen d'obtenir ce xxx%d.png, xxx%3d.png, 'xxx%d.png'ou 'xxx%3d.png'travail chose
yPhil
J'obtiens la même erreur après avoir essayé ceci:[image2 @ 0x2552560] Could find no file with path '*.jpg' and index in the range 0-4 *.jpg: No such file or directory
Anonyme
Le type de motif 'glob' a été sélectionné mais la globalisation n'est pas prise en charge par cette construction libavformat [en utilisant Windows ffmpeg] [oof, aurait dû faire défiler vers le bas une réponse]
Katastic Voyage
7

Remarque: la globalisation de modèle ne fonctionne pas sous Windows (et peut-être jamais en raison du manque de prise en charge de la globalisation dans libavfilter sous Windows.) Donc, si vous le faites sous Windows, vous devrez renommer les fichiers afin qu'ils soient numérotés séquentiellement et sans lacunes.

Vous pouvez les renommer avec une simple ligne de commande Powershell:

dir *.jpg | %{$x=0} {Rename-Item $_ -NewName “Base$x”; $x++ }
Bill Westrup
la source
Cela retournera file1.jpg file2.jpg... file10.jpgqui si vous triez par ordre alphabétique se retrouverait file1.jpg, file10.jpg...file2.jpg
stib
Cela ne devrait-il pas être Base $ x.jpg? En l'état, le vôtre a renommé tous les miens et a tué les extensions de fichiers.
Katastic Voyage
5

meilleure façon de renommer avec PowerShell (conserver l'ordre):

dir *.jpg | %{$x=0} {Rename-Item $_ -NewName "Base$($x.tostring('000000')).jpg"; $x++ }
pBac
la source
Ne dirretourne toujours les fichiers par ordre alphabétique? Serait-il plus sûr d'ajouter un sort-objectdans le mélange?
stib