RSS Feed Twitter

une vidéo à partir d’une image… (update)

8 mai 2012 par David BOZEC Pas de commentaire »

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
 

Les commentaires sont fermés.