Créer une planche-contact d’une vidéo sous Windows

Divulgâchage : Parce qu’il n’y a pas que Linux dans la vie, et que des fois, les outils sont multiplateforme, voilà comment vous y prendre pour générer des planches contacts si vous êtes sous Windows. On va retrouver les outils ffprobe, ffmpeg, convert et montage (issus de imagemagick), mais au lieu de scripter en bash, nous allons devoir passer par powershell.

Il y a quelques jours, nous vous avons expliqué comment générer une planche contact d’une vidéo en utilisant Linux.

Le truc bien, c’est que les outils que nous avons utilisé existent aussi pour Windows. Il est donc possible d’utiliser exactement la même technique, en adaptant quelques peu les scripts pour utiliser PowerShell au lieu de Bash.

Benjamin Balázs @ flickr

Installation des outils

Nous allons utiliser les outils suivants :

ffprobe et ffmpeg font partie de l’ensemble d’outils de ffmpeg, dont on trouve une version compilée pour Windows sur le site Codex FFmpeg. Il s’agit d’une simple archive, dans laquelle on se trouve un répertoire bin/ contenant les exécutables.

convert et montage font quant à eux partie de l’ensemble d’outils de imagemagick, qu’il est possible d’installer via un installeur disponible sur le site web de imagemagick.

Lors de l’installation de imagemagick, on vous demandera si vous souhaitez installer ffmpeg. Vous pouvez le faire, mais cela n’installera pas ffprobe, vous êtes donc quand même obligé de télécharger les binaires de ffmpeg.

Le chemin vers les exécutables de imagemagick se trouvent dans le PATH de Windows et peuvent être lancés en ligne de commande. Ce qui n’est pas le cas des exécutables de ffmpeg.

Pour les utiliser, vous avez alors le choix :

J’ai personnellement opté pour la troisième solution. Après avoir installé imagemagick et lui avoir laissé installé ffmpeg pour moi, j’ai simplement copié ffprobe.exe dans le répertoire C:\Program Files\ImageMagick-7.0.11-Q16-HDRI.

Fréquence d’échantillonnage

Comme nous l’avions expliqué dans notre précédent article, il n’est pas possible de dire directement à ffmpeg de faire un nombre défini de captures d’une vidéo. Par contre, il est possible de modifier sa fréquence d’échantillonnage, c’est à dire le nombre d’images par secondes de la vidéo.

Nous allons donc nous débrouiller pour rééchantillonner la vidéo afin qu’elle ne comporte plus que le nombre voulu d’images. A partir de là, faire le bon nombre de captures sera facile.

Dans la suite, on utilisera la vidéo Cosmos Laundromat, cinquième court métrage libre de la fondation Blender sous licence Creative Commons Attribution 4.0.

Durée de la vidéo

Afin de calculer la fréquence d’échantillonnage, il nous faut connaitre la durée de la vidéo. Nous allons récupérer celle-ci en ligne de commande, grâce à PowerShell.

Il est possible de le faire en utilisant l’invite de commande, mais par la suite, nous allons utiliser PowerShell pour effectuer des calculs, donc autant l’utiliser dès maintenant.

On va utiliser ffprobe, avec les options suivantes :

ffprobe `
    -show_entries format=duration `
    -v quiet                      `
    -of csv="p=0"                 `
    -i cosmos-laundromat.mp4

En PowerShell, utiliser ` permet de fractionner une commande sur plusieurs lignes

Fréquence d’échantillonnage

Nous avons maintenant besoin de la fréquence d’échantillonnage, que l’on va calculer en divisant le nombre d’images que l’on souhaite par la durée de la vidéo.

C’est ici que nous avons besoin de PowerShell. L’invite de commande Windows ne gère pas les divisions avec des nombres flottants, PowerShell, si.

Si $length est la durée de la vidéo fournie par la commande précédente, et $nb le nombre d’images, la fréquence d’échantillonnage se calcule sous PowerShell avec la ligne de commande suivante :

$freq=$nb/$length

La partie entière et la partie décimale sera alors séparée par une virgule, chose qui n’est pas comprise par ffmpeg, qui attends un point. On doit donc y remédier avant de pouvoir s’en servir.

$freq=$freq -split ',' -join '.'

Les captures

Échantillonner

On va maintenant demander à ffmpeg de convertir la vidéo en png. Puisque c’est un format d’image, ffmpeg va convertir la vidéo en autant d’images qu’il y a de frames. C’est pour cela que l’on modifie la fréquence d’échantillonnage pour faire correspondre le nombre de frame de la vidéo au nombre d’images voulues sur notre planche contact. On en profitera également pour ajouter un horodatage sur la vidéo.

Pour cela, on utilise les options suivante :

Ainsi que le patron pour construire les noms des fichiers capture-%03d.png (%03d sera remplacé par un numéro sur trois chiffres qui s’incrémente à chaque image).

ffmpeg applique ses filtres les uns après les autres, dans l’ordre où vous les lui fournissez. Si vous mettez ce filtre après la fréquence, le timestamp sera calculé après échantillonnage et vous n’obtiendrez pas les horodatages que vous attendiez.

ffmpeg `
    -i cosmos-laundromat.mp4 `
    -vf drawtext="text='timestamp: %{pts \: hms}':x=(w-text_w)/2:y=h-th-10:box=1:fontcolor=black:boxcolor=white@0.5:fontsize=(h/5)",fps=$freq `
    -vcodec png `
    capture-%03d.png

Redimensionner

Afin de ne pas avoir des images inutilement trop grandes dans la planche contact, on va les redimensionner. Nous avons ici choisi une résolution 160x120. imagemagick se débrouillera pour conserver le ratio.

 foreach($file in Get-ChildItem ./ -Filter capture*.png)
{ 
    magick convert $file -resize 160x120 resized-$file
}

Sous Windows, tous les outils d’imagemagick se lancent grâce à la commande magick <outil>. Ainsi, convert se lance via magick convert. Il est possible que cela soit pour éviter la confusion avec la commande Windows convert, utilisée pour la conversion de systèmes de fichiers.

Créer la planche contact

Finalement, en utilisant montage, il est possible de combiner les images en une seule planche. On va l’utiliser avec les options suivantes:

Ainsi que les fichiers à partir desquels il doit générer la planche et le nom du fichier en sortie.

magick montage `
    -title "CosmoLaundromat" `
    -tile 3x3 `
    -geometry +4+4 `
    resized-capture-0*.png `
    output.png
Planche contact obtenue

Et après ?

Quant les outils sont disponibles sous Windows et sous Linux, c’est agréable. Quelques adaptations de scripts sont nécessaires, mais la méthode reste la même.

Contrairement à Linux où chacun peut exécuter un script bash, dans le monde de Windows, vous ne pourrez pas lancer un script à partir d’un fichier si vous n’êtes pas administrateur ou si celui-ci ne vous a pas donné les droits adéquats. Par contre, il est possible de lancer une à une chaque ligne de commande.

Donc, si vous préférez ne rien modifier des options de sécurité de Windows, il vous faudra copier coller une ligne de commande récapitulant toutes la suite de commandes permettant de faire la planche contact.

La ligne de commande ci-dessous vous permettra d’obtenir une planche contact de 4x4 dont output.png. Vous aurez juste à modifier le nom de la vidéo source (ici cosmos-laundromat.mp4).

$fichier="cosmos-laundromat.mp4" ; $length=ffprobe -i $fichier -show_entries format=duration -v quiet -of csv="p=0" ; $freq=16/$length ; ffmpeg -i $fichier -vf drawtext="text='timestamp: %{pts \: hms}':x=(w-text_w)/2:y=h-th-10:box=1:fontcolor=black:boxcolor=white@0.5:fontsize=(h/5)",fps=$freq -vcodec png capture-%03d.png ; foreach($file in Get-ChildItem ./ -Filter capture*.png) {     magick convert $file -resize 160x120 resized-$file } ; magick montage -title $fichier -tile 4x4 -geometry +4+4  resized-*.png output.png ; rm  *capture*