Séquence d'images FFMPEG avec différentes durées

16

Disons que j'ai un fichier mp3 d'une durée d'une minute. Et j'ai 20 images png. Je veux combiner ces images et un audio dans un fichier vidéo, mais je ne veux pas que chaque image dure 3 secondes à l'écran, je veux que certaines images durent 5 secondes, d'autres 1 seconde etc.

La seule façon dont je peux penser est simplement de copier les images qui devraient durer plus longtemps, par exemple pour que image1, image2, image3 soient exactement les mêmes, cela me donne 3 fois plus de temps en vidéo.

Cependant, cela prend beaucoup de temps et d'espace. Existe-t-il un commutateur / paramètre dans ffmpeg qui me permette de le faire?

Flot2011
la source
Comme vous l'avez découvert, ffmpeg devrait afficher chaque image pour la même longueur. Si vous souhaitez varier la durée, vous devrez dupliquer les images au préalable ou créer des vidéos distinctes de chaque durée souhaitée, puis les concaténer. Peut-être que d'autres utilisateurs ont de meilleures idées, mais ce type de tâche pourrait être plus facile avec un éditeur tel que Kdenlive, etc.
llogan
Je le fais à partir du script php, donc l'éditeur n'est pas ce que je recherche.
Flot2011

Réponses:

21

En utilisant ffmpeg 2.0, il existe deux façons de procéder:

  1. Une méthode consiste à utiliser les temps de modification des fichiers. Réglez d'abord l'heure de modification des fichiers image afin que chaque fichier image ait une heure de modification supérieure à celle qui le précède; la différence de temps est la durée de l'image précédente (avec une résolution de 1 seconde). Utilisez ensuite l'option démultiplexeur image2 -ts_from_file 1. Par exemple:

    touch -t 01010000.00 image01.png
    touch -t 01010000.03 image02.png
    touch -t 01010000.08 image03.png
    ...
    ffmpeg -ts_from_file 1 -i image%2d.png -i audio.mp3 -c:a copy -vf fps=25 out.avi
    
  2. Une autre méthode consiste à utiliser le concatdémultiplexeur , qui prend une liste de fichiers à concaténer, avec des durées facultatives. Créez d'abord un fichier répertoriant vos images et durées qui ressemble à ceci:

    ffconcat version 1.0
    file image01.png
    duration 3
    file image02.png
    duration 5
    file image03.png
    

    Fournissez ensuite ce fichier en entrée à ffmpeg. Par exemple:

    ffmpeg -i in.ffconcat -i audio.mp3 -c:a copy -vf fps=25 out.avi
    

Vous devrez peut-être dupliquer le dernier fichier après la durée finale. -c:a copycopie l'audio mp3 tel quel; si vous souhaitez le convertir en un autre codec audio, vous pouvez le spécifier au lieu de copy. Vous pouvez également spécifier un codec vidéo différent avec -c:vou un format de pixel différent avec -pix_fmt, comme -c:v libx264 -pix_fmt yuv420p. -vf fps=25fera la cadence de sortie de 25 images par seconde. Si votre audio est plus long et que vous souhaitez le couper après les images, utilisez l' -shortestoption.

mark4o
la source
Aucune idée pourquoi cela ne semble tout simplement pas fonctionner (je veux dire, j'ai suivi la deuxième option (et essayé de commencer) à la lettre, mais cela ne produit qu'une vidéo noire sans images ou les images clignotent simplement pour une image, pas plusieurs secondes comme spécifié dans le fichier ffconcat
sup
@sup: Cela fonctionne toujours pour moi. Si la vidéo est noire, votre lecteur peut ne pas prendre en charge le format vidéo que vous utilisez; essayez -c:v libx264 -profile:v baseline -pix_fmt yuv420p out.mp4au lieu de out.avi, ou essayez un autre lecteur tel que mpv ou ffplay. Assurez-vous également que vous utilisez une version actuelle de FFmpeg et dupliquez le dernier nom du fichier image après la durée finale.
mark4o
Hm, bizarre, U utilise mpv et la construction statique ffmpeg téléchargée depuis ffmpeg.org, et il ignore simplement les durées. Quoi qu'il en soit, j'ai trouvé une autre façon de le faire, donc ce n'est pas si important: ffmpeg.org/pipermail/ffmpeg-user/2015-July/027702.html
sup
1

En supposant ffmpeg -i in.ffconcat -vf fps=25 out.avi

(2018: contenu du fichier in.ffconcat) - cela fonctionne:

ffconcat version 1.0
fichier text.png
durée 30,0
fichier text.png

alors que cela ne le fait pas

ffconcat version 1.0
fichier text.png
durée 30,0

c'est à dire dans le deuxième cas

ffprobe out.avi -show_entries format=duration -v 0

[FORMAT]
durée = 0,040000
[/FORMAT]
Darek Adamkiewicz
la source