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.
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.
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.
Installation des outils
Nous allons utiliser les outils suivants :
-
ffprobe
pour déterminer la durée de la vidéo, -
ffmpeg
pour prendre les captures, -
convert
pour réduire la taille des captures, -
montage
pour fabriquer la planche contact.
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 :
- A chaque fois que vous utilisez ces exécutables, vous devez entrer le chemin absolu pour que Windows soit capable de les trouver,
- Ajouter le chemin des exécutables dans le
PATH
, pour cela, il vous faudra modifier les variables d’environnement de Windows et ajouter le chemin vers le répertoire contenant les binaires deffmpeg
. Modifier les variables d’environnement Windows n’est pas l’objet de cet article, si vous voulez le faire, il existe une page de Wikihow qui explique comment faire, - tricher un peu et copier les exécutables dans le répertoire de
imagemagick
:C:\Program Files\ImageMagick-<numero de version>
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 :
- -show_entries format=duration : parmi les informations à montrer, on ne veut que la durée,
- -v quiet : désactive les messages d'informations,
- -of csv="p=0" : indique que nous souhaitons une sortie de type CSV. p=0 indique que l’on souhaite uniquement la valeur,
- -i : pour spécifier le fichier à lire.
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 :
-
-vcodec png
pour la conversion enpng
, -
-vf
pour appliquer des filtres-
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)"
pour ajouter un horodatage à la vidéo, avec quelques options pour tuner la position, la couleur et la taille, -
fps=$freq
pour la modification de la fréquence d’échantillonnage, où$freq
est le résultat de notre calcul précédent,
-
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:
-
-title "Titre" : permet de définir le titre de l'image, qui sera affiché en haut. Reconnaît les caractères spéciaux
\n
et autres\t
. -
-tile lxh : votre image contiendra
l
miniatures de large surh
de haut, -
-geometry +l+h : chaque miniature sera séparée des autres par
l
pixels sur la largeur eth
pixels sur la hauteur
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

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*