Graver les noms de fichiers d'images individuelles dans la vidéo de sortie FFmpeg

6

J'utilise FFmpeg pour lire une série d'images individuelles et les sortir sous forme de vidéo.
Le résultat est un timelapse des captures d'écran d'un site Web par intervalles de 1 minute.

Maintenant, j'aimerais graver l'heure de capture d'origine de chaque image dans la vidéo résultante à l'aide de la commande drawtext. L'heure de capture est disponible dans le nom de fichier de chaque image. Mais je ne parviens pas à trouver une option permettant à drawtext d’accéder aux noms de fichiers des images en entrée.

Une alternative serait d’accéder à la date de création de chaque image à partir de drawtext (je ne trouve pas non plus le moyen de le faire). Mais je préférerais définitivement accéder au nom de fichier, car cela me donnerait plus d'options pour formater le texte.

Y a-t-il un moyen de faire cela?
Il serait bon que toute solution proposée fonctionne également sous Windows.

Jpsy
la source

Réponses:

2

Vous ne pourrez pas le faire en une seule ligne, car ffmpegle filtre drawtext n’est pas très avancé.

Vous aurez besoin de pré-traiter les images à l’avance avec des scripts.

Quelque chose comme un script bash simple:

for i in *.png; do 
    time = $(echo $i | cut -d . -f 1)
    ffmpeg -i $i -vf "drawtext=text=$time" mod-$time.png
done

Ensuite, vous pouvez utiliser les fichiers mod * .png pour créer votre vidéo.

Znuff
la source
2

La réponse de Znuff est excellente (acceptée et votée) et a ouvert la voie à ma propre solution. Comme il est spécifique à Unix et que je devais travailler sur Win, voici ma solution pour Windows 7 et versions supérieures:

J'ai utilisé deux fichiers de commandes (Master.cmd et Slave.cmd) pour parcourir toutes les images et y graver les noms de fichiers.

Master.cmd:

forfiles /p "MyImagesSubPath" /m "2014-02-15*.png" /c "cmd /c ..\Slave.cmd @file @fname

Esclave.cmd:

ffmpeg -i "%~1" -vf "crop=1072:1192:24:101, drawtext=text=%~2: fontcolor=white: fontsize=60: box=1: [email protected]: x=50:y=50: fontfile=c\\:\\\\Windows\\\\Fonts\\\\myfont.ttf" "mod_%~1"

Explication:

Il est nécessaire d'utiliser deux lots pour plusieurs raisons:
1. Le paramètre / c de forfiles accepte uniquement une ligne de commande de longueur limitée (253 caractères).
2. L'imbrication de la commande FFmpeg dans le paramètre forfiles / c nécessiterait un niveau de caractère insensé. excuser.

Le filtre de nom de fichier "2014 -.... png" dans Master.cmd est utilisé pour empêcher la boucle de retraiter sa propre sortie (nommée "mod _.... png") dans une boucle sans fin. Vous devez adapter cette chaîne de filtrage à vos images source.

Le lot Esclave est exécuté à partir du sous-répertoire "MyImagesSubPath" situé sous le répertoire du lot (c’est-à-dire où vous devez placer vos images source). Slave.cmd reçoit le nom de fichier avec et sans extension (.png) comme ses deux paramètres.

Le paramètre nom de fichier sans extension est utilisé comme texte à graver dans l'image. Les images résultantes sont stockées avec le préfixe "mod_" dans le même chemin que les images d'origine. Les noms de fichiers peuvent contenir des blancs.

Jpsy
la source