Skip to main content

Jours suivants : montage, encodage et mise en ligne

Encodage automatique des vidéos

Correction de certaines pistes sons de vidéos

Logiciel nécessaires

  • audacity: logiciel libre et complet d'édition de données audio numériques. Il n'est normalement pas nécéssaire, mais fut bien utile pour corriger certains parasites sonores dus à des problèmes électriques.
  • mplayer: logiciel pour visionner et manipuler des vidéos sous Linux.

Dans une des salles que nous avions en charge, le système électrique était parasité, et cela a induit des bruits de fond très génants dans les bandes son des vidéos. Nous avons donc du extraire les pistes son, et les éditer avant de pouvoir les ré-synchroniser avec les vidéos.

Extraction des bandes son en .wav

Cette extraction est effectuée en ligne de commande :

$ mplayer fichier.m2t -vc dummy -vo null -ao pcm:file=fichier.wav

Edition des bandes son avec audacity pour supprimer les parasites

Ce fichier WAV est édité en audacity. Dans notre malheur, nous avions quand même eu un peu de chance. Les caméra enregistraient en mono, mais sur deux pistes. Donc la piste droite de la bande son comportait la voix du speaker, parasitée, et la piste gauche, au lieu d'être vide, comportait le parasite seul. Il fut donc relativement facile de "nettoyer" les bandes son. Voici la procédure :

capture d'écran d'audacity

  1. Importer la bande son dans audacity : Fichier > Importer;
  2. Couper la bande son stréréo en deux bandes son mono indépendantes : dans la piste elle même, cliquer sur le nom, et sélectionner "Séparer stéréo vers mono";
  3. Sélectionner la piste contenant le parasite seul, et l'inverser : Effets > Inverser . Ainsi le parasite sur la bande gauche est l'exact inverse de celui de la bande droite. Lors d'une lecture ils s'annuleront.
  4. Ensuite, amplifier le signal inversé pour qu'il soit de même intensité que celui de droite (chez nous il y avait une différence d'amplifcation entre les deux pistes): Effets > Amplification. Tester de 2x en 2x.
  5. Exporter le tout dans un nouveau fichier .wav: Fichier> Exporter. Le fichier produit ne comportera qu'ue seule piste mono, fruit de la fusion des deux pistes précédentes.
  6. Réouvrir cette piste et détecter un endroit ou il y a une seconde de bruit de fond uniquement. Sélectionner cette zone et aller dans Effets>Réduction du bruit>Prendre l'emprunte du bruit. Puis sélectionner toute la piste et Effet>Réduction du bruit> Appliquer. Cela va soustraire ce bruit à l'ensemble de la piste.
  7. Dans notre cas les scripts d'encodage sont prévus pour du son à deux pistes dont une vide. Donc Pistes>Ajouter une nouvelle...> Piste audio. Puis fusionner ces deux pistes mono en une piste stéréo et réexporter le fichier.

Une fois les bandes son épurées, elles sont prettes à être réutilisées pour encoder avec les vidéos.

Transformation des vidéos issues des cartes SD

Une des caméra ne savait enregistrer que sur des cartes SD, en format mp4, tous coupés à 3,5Gb maximum. Voici le script qui a permis de transformer ces fihiers en mpeg, tout en les concaténant.

Logiciels et bibliothèques nécessaires :

  • gpac: framework open source multimedia.
  • mplayer: logiciel pour visionner et manipuler des vidéos sous Linux.
  • twolame: encodeur optiisé pour du MPEG Audio Layer 2 (MP2).
  • ffmpeg: collection de logiciels libres dédiés au traitement de flux audio ou vidéo (enregistrement, lecture ou conversion d'un format à un autre).

Préparation :

Mettre tous les fichiers .mp4 d'une conférence dans un même répertoire, en les nommant avec un préfixe numérique afin de les prendre dans l'ordre. Puis depuis la racine de ce répertoire lancer le script convert-mp4.sh suivant :

#!/bin/sh
# Delivered WITHOUT ANY WARRANTY under licence LGPL v3.0. See http://www.gnu.org/licenses/lgpl-3.0.txt
if [ -z $1 ] || [ -z $2 ]; then
  echo "Usage: $0 directory_to_process output_mpeg_file"
  exit 1
fi

DIRNAME=$1
OUTPUT=$2
CONCAT_VIDEO_CMD="cat"
CONCAT_AUDIO_CMD="cat"

cd $DIRNAME

for i in *MP4 *mp4; do
  MP4Box -raw 1 $i || exit 1
  mplayer -vc dummy -vo null -ao pcm:file=$i.wav $i || exit 1
  twolame $i.wav || exit 1
  rm $i.wav || exit 1

  VIDEONAME=`basename $i | cut -f 1 -d "."`"_track1.m2v"
  CONCAT_VIDEO_CMD+=" $VIDEONAME"
  CONCAT_AUDIO_CMD+=" $i.mp2"
done

$CONCAT_VIDEO_CMD > $DIRNAME.m2v || exit 1
$CONCAT_AUDIO_CMD > $DIRNAME.mp2 || exit 1

ffmpeg -loglevel quiet -i $DIRNAME.m2v -i $DIRNAME.mp2 -vcodec copy -acodec copy $OUTPUT || exit 1

cd ..

rm $DIRNAME/*m2v $DIRNAME/*mp2 || exit 1

avec la commande :

$ ./convert-mp4.sh repertoire /path_to_mpeg

ou repertoire est le nom du répertoire comprenant les fichiers mp4, et /path_to_mpeg le chemin vers le répertoire ou vous voulez que vous fichiers mpeg soient enregistrés, au format mpeg-2.

Script d'encodage automatisé

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.

Le fichier s'intitule encode-hdv.sh :
Ce script édite tous les fichiers m2t ou mpg 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)), teste si un fichier de son externe est présent (les .wav), et si oui les utilise pour remplacer les son originaux, 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

# Teste l'existence des paramètres obligatoires
if [ -z $1 ] || [ -z $2 ]; then
  echo "Usage: $0 path_to_hd_file maximum_size_in_mb"
  exit 1
fi
# Stoppe le script si le fichier passé en argument 1 n'existe pas
if [ ! -f $1 ]; then
  echo "File not found: $1"
  exit 1
fi

# Spécifie le répertoire ou sont les images de référence pour les intros et outros.
SCRIPT_PATH=/media/fosdem/scripts

# Spécifie le nom du fichier, sa taille maximale (sur base de l'argument 2), et son dossier de destination
NAME=`basename $1 | cut -f 1 -d "."`
MAXSIZE=$(( $2 * 1024 ))
DIRNAME=`dirname $1`

# Si un fichier start est défini, le passer en variable (défini le timecode ou commencer l'encodage au cas ou le film comporte une partie inutile en début)
if [ -f $DIRNAME/$NAME.start ]; then
  START="-ss `cat $DIRNAME/$NAME.start`"
fi

# Si un fichier .length est défini, le passer en variable (défini la durée totale de la bande vidéo à considérer pour l'encodage)
if [ -f $DIRNAME/$NAME.length ]; then
  ENDPOS="-endpos `cat $DIRNAME/$NAME.length`"
fi

# Si un fichier .wav est présent, le passer en variable (c'est le cas lorsque le son a du être nettoyé avec audacity)
if [ -f $DIRNAME/$NAME.wav ]; then
  AUDIOFILE="-audiofile $DIRNAME/$NAME.wav"
fi

# Si un fichier .left est défini, copier le canal son de gauche et le mettre à droite. C'est le cas lorsque la bande son mono est à gauche plutôt qu'à droite. Or le script final dédouble la bande droite, donc si celle-ci est vide la vidéo sera sans son.
if [ -f $DIRNAME/$NAME.left ]; then
  AFCHANNELS="-af channels=2:2:0:0:0:1"
else
  AFCHANNELS="-af channels=2:2:1:1:1:0"
fi

# Création des images jpg pour les intro et outro
convert -resize "!960x!720" $DIRNAME/$NAME.png $NAME.jpg
convert -resize "!960x!720" $SCRIPT_PATH/intro.png $NAME-intro.jpg

# Génération du fichier avi de titre
echo "Generating $NAME-title.avi"
jpeg2yuv -v 0 -n 125 -f 25 -I p -j $NAME.jpg | yuv2lav -v 0 -o $NAME-title-nosound.avi || exit 1
mplayer $SCRIPT_PATH/white_noise.wav -ao pcm:waveheader:file=$NAME-title.wav -endpos 5 -frames 125 > /dev/null || exit 1
lavaddwav $NAME-title-nosound.avi $NAME-title.wav $NAME-title.avi 2&> /dev/null || exit 1

# Génération du fichier avi d'intro
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 $SCRIPT_PATH/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 .avi d'outro
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 $SCRIPT_PATH/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

# Supprimer les fichiers devenus inutiles
rm $NAME.jpg $NAME-*.jpg $NAME-*.wav || exit 1

# Encoder le fichier final première passe
mencoder -passlogfile $NAME-divx2pass.log -info artist="NamurLUG  (www.namurlug.org)":name="Fosdem 2010":copyright="Creative Commons Attribution-NonCommercial-ShareAlike 2.5":comment="February 2010 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 $AFCHANNELS -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 $AUDIOFILE $START $ENDPOS $NAME-outro.avi -frames 125 -o ./$NAME.xvid.avi || exit 1

# Encoder le fichier final seconde passe
mencoder -passlogfile $NAME-divx2pass.log -info artist="NamurLUG  (www.namurlug.org)":name="Fosdem 2010":copyright="Creative Commons Attribution-NonCommercial-ShareAlike 2.5":comment="February 2010 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 $AFCHANNELS -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 $AUDIOFILE $START $ENDPOS $NAME-outro.avi -frames 125 -o ./$NAME.xvid.avi || exit 1

# Supprimer les fichiers qui ne sont plus nécéssaires
rm $NAME-divx2pass.log $NAME-intro*.avi $NAME-title*.avi $NAME-outro*.avi || exit 1

Avec path_to_hd_file qui est le chemin vers le répertoire qui contient les fichiers .m2t, et maximum_size_in_mb qui est la taille maximale ciblée pour les vidéos compressées, en méga-bytes. Nous avons utilisé pour ce dernier paramètre les valeurs de 700 pour les conférences d'une heure, et de 240 pour celles de 15 minutes.

Exemple de commande:

$ ./encode-hdv.sh /media/fosdem/2010/ferrer/saturday/07-sat-tinc.m2t 240

 Durant la création des fichiers de titre, intro et outro, il est possible que mplayer affiche des messages d'erreurs :

mplayer: could not connect to socket                                                             
mplayer: No such file or directory                                                               
Failed to open LIRC support. You will not be able to use your remote control. 

ne vous affolez pas, c'est normal. De même, durant l'encodage, il est possible que des notices de duplication de frames apparaissent, pas de panique.

La nouvelle mailling list du lug est disponible chez tuxfamily

Pour s'y inscrire la procédure est disponible ici