une vidéo à partir d’une image… (update)
J’ai déjà présenté il y a quelques temps un script permettant de générer une vidéo de 10 secondes à partir d’une image. En voici une amélioration.
Jusqu’ici pour générer mes vidéos je devais préparer mes fichiers images au format 1920*1080 comportant la jaquette du DVD et la mention « Disponible en DVD », Comme celle-ci :
Cette nouvelle version va permettre de générer la vidéo directement à partir de la jaquette du DVD quelque soit sa taille. Le tout en utilisant imagemagick, le logiciel de traitement d’images en ligne de commande.
Je commence par limiter la taille de la jaquette, 1000 pixels de hauteur au maximum (le ratio pour une jaquette donne quelque chose comme 700 pixels de largeur).
1 | convert cover.jpg -resize 750x1000 cover.jpg |
Je crée ensuite une image de base de 1920*1080 pixels et un fond noir.
1 | convert -size 1920x1080 xc:black canvas.jpg |
Il suffit ensuite d’insérer la jaquette sur le fond noir en la positionnant sur la gauche :
1 | composite -compose Over -geometry +150+10 -gravity West cover.jpg canvas.jpg finale.jpg |
Enfin j’ajoute le texte sur la droite ( et sur deux lignes parce que j’en ai envie 😀 ) :
1 2 | convert finale.jpg -pointsize 150 -draw "gravity East fill white text 160,-90 'Disponible'" finale.jpg convert finale.jpg -pointsize 150 -draw "gravity East fill white text 240,90 'en DVD'" finale.jpg |
Et voilà mon image est générée, il ne reste plus qu’à insérer tout ça dans le script que j’avais créé précédemment pour générer les vidéos. J’en ai d’ailleurs profité pour remplacer le bête copier-coller 9 fois de la même image par une boucle histoire de faire plus propre.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | #!/bin/bash # # Ce script génère une vidéo de 10 secondes à partir de chaque image contenue dans le répertoire source usage() { echo "usage : $(basename ${0}) src" echo "" echo "src: répertoire source" } if [[ $# != 1 ]] then usage else src=${1} set `ls ${src}` # Liste tous les fichiers du répertoire while [[ $# != 0 ]] # Boucler tant qu'il y a des fichiers dans le répertoire do if [[ ${1} != *.jpg ]] # On vérifie s'il s'agit d'un fichier jpg ou non then echo skipping ${src}/$1 else convert ${src}/$1 -resize 750x1000 ${src}/$1 # Resize covers mkdir `basename ${1} .jpg` # On crée un répertoire temporaire au nom du fichier # On génère l'image à partir de la jaquette du DVD convert -size 1920x1080 xc:black canvas.jpg # On crée un fond noir au format HD composite -compose Over -geometry +150+10 -gravity West ${src}/$1 canvas.jpg `basename ${1} .jpg`/finale.jpg # On insère la jaquette convert `basename ${1} .jpg`/finale.jpg -pointsize 150 -draw "gravity East fill white text 160,-90 'Disponible'" `basename ${1} .jpg`/finale.jpg # On insère la première ligne de texte... convert `basename ${1} .jpg`/finale.jpg -pointsize 150 -draw "gravity East fill white text 240,90 'en DVD'" `basename ${1} .jpg`/finale.jpg # ...puis la seconde rm canvas.jpg # On supprime l'image de fond cd `basename ${1} .jpg`/ # On crée 9 images supplémentaires pour 10 secondes de vidéo for i in {1..9} do cp 'finale.jpg' $i'.jpg' done # On encode la vidéo à une image par seconde (fps 1) mencoder mf://*.jpg -fps 1 -ovc lavc -lavcopts vcodec=mpeg4 -o clip.avi # On déplace et renomme la vidéo dans le répertoire d'éxecution mv clip.avi ../`basename ${1} .jpg`.avi cd .. # On supprime le répertoire temporaire et son contenu rm `basename ${1} .jpg`/* rmdir `basename ${1} .jpg` fi shift done fi |