Méthode FOSDEM 2009

La méthode que nous détaillerons ici a pour objectifs :

  • d'acquérir un flux vidéo directement sur un disque dur;
  • d'automatiser un tant soit peu certaines étapes de montage;
  • encoder toutes les pistes vidéos obtenues dans un format permettant une mise en ligne;

Capture de la vidéo en temps réel sur un disque dur

Une journée d'enregistrement correspond à environ 8 à 10h de vidéos. Pour le WE complet, ayant 3 salles à prendre en charge, cela correspond donc à presque 60 heures de vidéo. Si vous vous contentez d'uiliser des K7 mini DV c'est autant de temps perdu à capturer la vidéo sur disque dur avant de pouvoir la compresser pour la mettre en ligne. Nous détaillerons donc ici une méthode qui permet de capturer le flux vidéo original (en DV donc) directement de la caméra au disque dur.

Montage matériel

Montage caméra-PC-disque durLa caméra est connectée en Firewire à un ordinateur portable, qui tourne bien évidemment sous Linux, et qui est lui même connecté en USB2 à un disque dur externe. Le disque dur externe doit avoir pour caractéristique de devoir tourner en 7200 rpm.

Logiciels et bibliothèques nécessaires

  • libquicktime: librairie pour lire et écrire des fichiers vidéos quicktime/avi/mp4.
  • libiec61883: librairie nécessaire pour activer la connectique Firewire.
  • libavc1394: librairie nécessaire pour activer la connectique Firewire.
  • libraw1394: librairie nécessaire pour activer la connectique Firewire.
  • dvgrab : petit utilitaire pour capturer un signal vidéo AVI-2 émis par une caméra DV en utilisant le bus IEEE-1394, mieux connus sou le nom FireWire.

Au niveau de votre Kernel Linux vous devez activer le support FireWire :
-> Device Drivers
   -> IEEE 1394 (FireWire) support

Script de capture en temps réel

Dans notre cas le fichier est intitulé grab.sh
Au lancement de ce script celui ci nous demande un nom (celui de la conférence qu'on enregistre), et crée un dossier correspondant. Il permet ensuite la capture vidéo/son en direct, en créant des fichiers de maximum 1GB (afin d'éviter d'eventuels problèmes avec des formats de disques ne supportant pas des fichiers trops gros, comme le FAT32 par exemple). La capture est enregistré dans des fichiers .dv.

#!/bin/sh
# Delivered WITHOUT ANY WARRANTY under licence LGPL v3.0. See http://www.gnu.org/licenses/lgpl-3.0.txt
# Vérification de l'existence d'un argument
if [ ! $1 ]; then
  echo "Usage: $0 dirname"
  exit
fi

name=$1
# Création du dossier au nom de l'argument et d'un dossier dv
mkdir -v ${name} || exit
pushd ${name}
mkdir -v dv || exit
pushd dv

# Démarrage de la capture
#--autosplit = Coupure du fichier lors d'un événement
#--size 0 = événement pour la coupure du fichier
#--format dv2 = Sélection du format d'enregistrement
#--opendml = paramètre permettant d'obtenir un avi opendml
#--noavc = désactive les commandes interactives (play, stop, pause, ...)
#--buffers 200 = taille du tampon en frames

dvgrab --autosplit --size 0 --format dv2 --opendml \
       --noavc --buffers 200 ${name}-
popd
popd

Création des images de titre, à insérer au début de chaque conférence

Logiciels et bibliothèques nécessaires

InkScape : logiciel d'édition d'images vectorielles (format SVG).

Méthode

Création d'un fichier titre et enregistrement du fichier en png

Encodage automatique des vidéos

Logiciels et bibliothèques nécessaires

  • ImageMagick: puissant logiciel de manipulation d'images.
  • libquicktime : librairie pour lire et écrire des fichiers vidéos quicktime/avi/mp4.
  • Mjpeg Tools: outils pour enregistrer, éditer, et visionner des vidéos MPEG sous Linux.
  • mplayer: logiciel pour visionner et manipuler des vidéos sous Linux. Est associé à mencoder (en), qui est à la fois un outil de codage (ou transcodage) et de montage audio et vidéo. Ces deux outils sont paramétrables en ligne de commande, ce qui leur confère un grand intérêt dès lors qu'il sagit de les intégrer dans un script automatisé comme celui qui suit.

Script d'encodage automatisé

Le fichier s'intitule encode-xvid-hd.sh
Ce script édite tous les fichiers .dv en leur ajoutant au début et à la fin les images de titres (thème de la conférence et nom de(s) l'orateur(s)), puis encode la vidéo en Xvid et le son en mp3, dans un conteneur avi.

#!/bin/bash
# Delivered WITHOUT ANY WARRANTY under licence LGPL v3.0. See http://www.gnu.org/licenses/lgpl-3.0.txt
# Vérification des arguments.
if [ -z $1 ] || [ -z $2 ]; then
  echo "Usage: $0 path_to_hd_file maximum_size_in_mb"
  exit 1
fi

if [ ! -f $1 ]; then
  echo "File not found: $1"
  exit 1
fi

# Création des constantes
NAME=`basename $1 | cut -f 1 -d "."`
MAXSIZE=$(( $2 * 1024 ))
DIRNAME=`dirname $1`

if [ -f $DIRNAME/start ]; then
  START="-ss `cat $DIRNAME/start`"
fi

if [ -f $DIRNAME/length ]; then
  ENDPOS="-endpos `cat $DIRNAME/length`"
fi

# Conversion et redimenssionement de l'image titre et de l'intro en jpg
convert -resize "!960x!720" $DIRNAME/$NAME.png $NAME.jpg
convert -resize "!960x!720" /mnt/fosdem/intro.png $NAME-intro.jpg

# Génération du fichier vidéo avec le titre
echo "Generating $NAME-title.avi"

#jpeg2yuv
#********
# -n 125= nombre de frame
# -f 25 = nombre de frame par seconde
# -I p  = pas d'entrelacement
# -j $NAME.jpg = fichier source

#yuv2lav
#*******
# -v 0 = verbose level
# -o OutputName = spécification du fichier de sortie
jpeg2yuv -v 0 -n 125 -f 25 -I p -j $NAME.jpg | yuv2lav -v 0 -o $NAME-title-nosound.avi || exit 1

#Création du fichier son vide
#mplayer
#*******
# -ao = spécification de la sortie son
# -endpos = position de fin d'encodage
# -frames = nombre de frames
mplayer /mnt/fosdem/white_noise.wav -ao pcm:waveheader:file=$NAME-title.wav
-endpos 5 -frames 125 > /dev/null || exit 1

# Fusion de la bande son et du fichier avi
#lavaddwav
#*********
lavaddwav $NAME-title-nosound.avi $NAME-title.wav $NAME-title.avi 2&>
/dev/null || exit 1

# Génération du fichier vidéo d'intro
# Idem précédent
echo "Generating $NAME-intro.avi"
jpeg2yuv -v 0 -n 50 -f 25 -I p -j $NAME-intro.jpg | yuv2lav -v 0 -o $NAME-intro-nosound.avi || exit 1
mplayer /mnt/fosdem/white_noise.wav -ao pcm:waveheader:file=$NAME-intro.wav -endpos 2 -frames 50 > /dev/null || exit 1
lavaddwav $NAME-intro-nosound.avi $NAME-intro.wav $NAME-intro.avi 2&> /dev/null || exit

# Génération du fichier vidéo d'outro
# Idem précédent
echo "Generating $NAME-outro.avi"
jpeg2yuv -v 0 -n 125 -f 25 -I p -j $NAME-intro.jpg | yuv2lav -v 0 -o $NAME-outro-nosound.avi || exit 1
mplayer /mnt/fosdem/white_noise.wav -ao pcm:waveheader:file=$NAME-outro.wav -endpos 5 -frames 125 > /dev/null || exit 1
lavaddwav $NAME-outro-nosound.avi $NAME-outro.wav $NAME-outro.avi 2&> /dev/null || exit 1

# Suppression des fichiers jpg et wav
rm $NAME.jpg $NAME-*.jpg $NAME-*.wav || exit 1

# Création du fichier vidéo et encodage
# Pass 1
#mencoder
#********
# -passlogfile $NAME-divx2pass.log = fichier log de la première passe
# -info = définition de l'en-tête du fichier
# -force-avi-aspect 1.78 = permet de modifier la largeur et hauteur.
# -ovc xvid = spécification du codec d'encodage vidéo
# -oac mp3lame = spécification du codec d'encodage audio
# -lameopts vbr=3:br=96:mode=1 = ajout d'option pour l'encodage audio
# -af channels=2:2:1:1:1:0 = filtre audio
# -vf pp=ac,harddup,dsize=16/9 $NAME-title.avi = filtre vidéo
# -frames X = conversion des X premières frames
mencoder -passlogfile $NAME-divx2pass.log -info artist="NamurLUG (www.namurlug.org)":name="Fosdem 2009":copyright="Creative Commons Attribution-NonCommercial-ShareAlike 2.5":comment="February 2009 ULB, Brussels,  Belgium" -force-avi-aspect 1.78 -ovc xvid -xvidencopts pass=1:vhq=4:threads=1:max_key_interval=250:aspect=16/9 -oac mp3lame -lameopts vbr=3:br=96:mode=1 -af channels=2:2:1:1:1:0 -vf pp=ac,harddup,dsize=16/9 $NAME-title.avi -frames 125 $NAME-intro.avi -frames 50 $1 -vf pp=fd,hqdn3d,scale=960:720 $START $ENDPOS $NAME-outro.avi -frames 125 -o ./$NAME.xvid.avi || exit 1

# Pass 2
# mencoder
#*********
# Idem Pass 1
mencoder -passlogfile $NAME-divx2pass.log -info artist="NamurLUG (www.namurlug.org)":name="Fosdem 2009":copyright="Creative Commons Attribution-NonCommercial-ShareAlike 2.5":comment="February 2009 ULB, Brussels,  Belgium" -force-avi-aspect 1.78 -ovc xvid -xvidencopts pass=2:vhq=4:bitrate=-$MAXSIZE:threads=1:max_key_interval=250:aspect=16/9 -oac mp3lame -lameopts vbr=3:br=96:mode=1 -af channels=2:2:1:1:1:0 -vf pp=ac,harddup,dsize=16/9 $NAME-title.avi -frames 125 $NAME-intro.avi -frames 50 $1 -vf pp=fd,hqdn3d,scale=960:720 $START $ENDPOS $NAME-outro.avi -frames 125 -o ./$NAME.xvid.avi || exit 1


# Suppression des fichiers temporaires
rm $NAME-divx2pass.log $NAME-intro*.avi $NAME-title*.avi $NAME-outro*.avi || exit 1