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.
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 installerffmpeg
. Vous pouvez le faire, mais cela n’installera pasffprobe
, vous êtes donc quand même obligé de télécharger les binaires deffmpeg
.
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épertoireC:\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 filtresdrawtext="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 `
-%03d.png capture
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)
{
$file -resize 160x120 resized-$file
magick convert }
Sous Windows, tous les outils d’
imagemagick
se lancent grâce à la commandemagick <outil>
. Ainsi,convert
se lance viamagick convert
. Il est possible que cela soit pour éviter la confusion avec la commande Windowsconvert
, 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 `
-capture-0*.png `
resized.png output
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*