Ripper et encoder en XviD

Introduction

  Le Xvid est un codec MPEG4 distribué sous licence GPL, ce qui lui permet, contrairement au DivX d'être en constante évolution grâce a une importante communauté de développement.
  De plus, ce codec apporte beaucoup moins de flou que le DivX (c'est le principal défaut du DivX) et la qualité globale me semble meilleure. Mais ceci a un prix : suivant les options utilisées, l'encodage en XviD sera plus long qu'en DivX.

 La méthode présentée ici est celle que j'utilise pour encoder. On obtient un excellent résultat. Un conseil de manière générale : il faut absolument éviter d'utiliser des logiciels comme EasyDivX ou NeoDivX. On obtient jamais un aussi bonne qualité avec ces logiciels tout en un. En utilisant des logiciels spécialisés dans chaque étape, on peut plus facilement contrôler le processus.

Version Linux - Version Windows
 

Logiciels utilisés

Ripp du DVD et identification de la piste contenant le film

Il faut en premier lieu enregistrer le DVD sur le Disque Dur. C'est le but de cette étape. On peut bien entendu travailler directement a partir du DVD, mais cela ne me semble pas une bonne chose : faire tourner le lecteur DVD pendant toute la durée de l'encodage peut provoquer certaines erreurs a l'encodage, oblige a décrypter le DVD 2 fois, etc... Maintenant, les disques durs sont gros, autant en profiter :).
On nommera le répertoire de travail {PATH}.
Le rip complet se fait avec la commande :
dvdbackup -i /dev/dvd -M -o {PATH} -v 1
Le -M est utilisé pour ripper l'intégralité du DVD.
Le -o {PATH} place le RIP dans le répertoire {PATH}.
Le -v 1 active du verbosage.

Nous n'avons maintenant plus besoin du DVD :).

Il faut maintenant identifier quelle est la piste contenant le film sur le DVD. Pour cela, on affiche la table du contenu du DVD avec cette commande :
dvdbackup -i {PATH}/DVDBACKUP -I
La piste qui nous interesse est la plus longue. Son numéro sera maintenant nommé {TITLE}.

Extraction et encodage de l'audio

Nous allons maintenant extraire la (les) bande(s) son qui nous interesse. Chaque bande son est identifiée par son identifiant de langue standardisé : Français = fr, Anglais = en, Allemand = de... On désignera la (les) langues a extraire par {AUDIOLANG}.
Il est aussi possible de repérer la langue avec son identifiant numérique. Pour cela, utiliser la commande :
mplayer -dvd-device {PATH}/DVDBACKUP dvd://{TITLE} -v 2>/dev/null | egrep '^\{open\}'
On obtient quelque chose comme ça :
{open} audio stream: 0 audio format: ac3 (5.1) language: en aid: 128
{open} audio stream: 1 audio format: ac3 (stereo) language: en aid: 129
{open} audio stream: 2 audio format: ac3 (5.1) language: fr aid: 130
{open} audio stream: 3 audio format: ac3 (stereo) language: fr aid: 131
{open} audio stream: 4 audio format: ac3 (stereo) language: en aid: 132
{open} audio stream: 5 audio format: ac3 (stereo) language: en aid: 133

On notera l'identifiant de la langue voulue {AID}. Par exemple ici "130" pour la piste française en son 5.1.
La commande pour l'extraction est (on choisira entre la méthode -alang et -aid, pas les deux !) :
mplayer -dvd-device {PATH}/DVDBACKUP dvd://{TITLE} -vc dummy -vo null -hardframedrop -ao pcm -aofile {WAVEFILE} -channels {2|4|6} <-alang {AUDIOLANG}|-aid {AID}>
-vc dummy -vo null -hardframedrop ignore la partie vidéo du DVD. Elle sera extraite plus tard.
-ao pcm -aofile {WAVEFILE} <-alang {AUDIOLANG}|-aid {AID}> va extraire la bande son de langue {AUDIOLANG} ou {AID} (suivant la méthode choisie !) dans le fichier wave pcm nommé {WAVEFILE}. l'option -channels {2|4|6} indique le nombre de canneaux : 2 pour de la stéréo, 6 pour du 5.1, ou 4 pour de la quadriphonie. Pour un réencodage en mp3, seule la stéréo est supportée. En ogg (ce que je conseille vivement), tout est possible.

La bande son est maintenant extraite, il faut la traiter. Il est peut-être nécessaire de la normaliser :
normalize {WAVEFILE}
Rien de spécial a commenter ici.

Pour l'encodage, je préconise plutôt l'Ogg/Vorbis. D'une part, il permet d'encoder facilement sur plus de 2 voix si désiré, et il permet aussi d'avoir une meilleure qualité à un bitrate plus faible. Pour une bande son standard en stéréo, je préconise ceci :
oggenc -q4 {WAVEFILE}
Le réglage en qualité -q4 est définitivement le meilleur choix. Le facteur de qualité quant a lui est peut-être à ajuster en fonction du nombre de canneaux et de la nature du film.

Extraction du chapitrage du DVD

Il est toujours agréable de pouvoir disposer des chapitrages du DVD sur le fichier encodé. Pratique pour savoir ou on s'est arrêté et reprendre au même endroit, ou sauter une séquence pas trop intéressante, par exemple. Pour cela, on utilise une seule commande :
dvdxchap -t {TITLE} {PATH}/DVDBACKUP > {CHAPTERFILE}
L'index des chapitres est maintenant dans {CHAPTERFILE}, au format désiré par les fichiers Ogg Media (pas la peine de parler d'avi, cela ne marchera pas avec les chapitres).

Extraction de la bande vidéo et encodage

Ici commencent les choses sérieuses. Nous allons commencer par extraire la bande vidéo seule du DVD. Il est possible de faire sans, directement a partir du DVD, mais cela me semble moins clair, et peut amener des problèmes divers et variés, notamment au niveau du bitrate du fichier. Si cela vous tente, il suffit de regarder attentivement les pages man de transcode.
Pour l'extraction, une seule commande suffit :
mplayer -dvd-device {PATH}/DVDBACKUP dvd://{TITLE} -nosound -dumpvideo -dumpfile {VOBFILE}
Cela génère un gros fichier {VOBFILE}, qui peut faire dans les 5 à 7Go en général. Cela ne pose pas de problème sur les FS Linux comme ext3, reiserfs, XFS ou JFS, qui supportent des fichiers bien plus gros. Attention toutefois a ne pas faire cela sur de la fat(16/32) : ce n'est pas du tout possible.

On peut maintenant paramétrer le codec xvid. Pour cela, il existe un petit utilitaire très pratique :
xvid4conf

Il apparaît la boite ci-contre, boite d'options du XviD.

  1. Choisir "Quantization type". Si le film sera beaucoup compressé, mettre h263 (valeur idéale pour les faibles bitrates), sinon mettre MPEG, le film sera plus net.
  2. Placer "Motion search precision" à "6 - Ultra High"
  3. Placer "VHQ mode" à "4 - Wide Search" pour une meilleure qualité. Cependant, cela augmente considérablement le temps d'encodage. (Le temps d'encodage peut varier énormément rien qu'en modifiant ce paramètre). Si vous êtes pressé, baissez cette valeur, tout en étant conscient que vous baissez aussi la qualité.
  4. Cocher "Chroma ME"
  5. Cocher "Quarterpel". Cela ralenti l'encodage, mais augmente la qualité.
  6. Baisser "Max B-Frames" a 1, pour assurer une parfaite compatibilité avec tous les décodeurs MPEG4 autres que xvid, souvent utilisés pour le décodage (ffmpeg, ffdshow, divx, etc...)
  7. Laisser le reste par défaut.
  8. Valider cette fenêtre

 

Dans l'onglet "Quantizers" : il faut régler les quantizers, ie le niveau de compression des frames. Les I-Frames sont les frames clé (frames complètes), et les P-Frames représentent la variation par rapport a l'image précédente, et les B-Frames sont des frames dites bidirectionnelles (comme les P-Frames, mais tenant compte des variations de la frame d'avant, et de la frame d'après).

Paramétrer les options comme sur l'image ci-contre :

  1. Min I-Frame = 1
  2. Max I-Frame = 8
  3. Min P-Frame = 1
  4. Max P-Frame = 15
  5. Min B-Frame = 1
  6. Max B-Frame = 15
Dans le cas de la quantization MPEG, vous pourrez spécifier vos propres matrices ici, mais cela demande de l'expérience. Les réglages par défaut sont très bien pour commencer.

 

Dans l'onglet "Two pass", mettre "Keyframe Boost" a 10. Laisser tout le reste par défaut.
Passer dans l'onglet "Save/Load" et enregistrer la configuration dans le répertoire courant {PATH} (par défaut). Le fichier doit se nommer comme par défaut : xvid4.cfg

 


On peut maintenant passer a l'encodage de la première passe :
transcode -i {VOBFILE} -x vob,null -y xvid4 --config_dir {PATH} -R 1,xvid4.log
Il faudra peut-être insérer des paramètres de désentrelacement, cropping et de redimensionnement a cette commande. Pour cela, je vous dirige vers la page man de transcode : option -I mode pour désentrelacer, -Z widthxheight pour redimensionner, -Y top[,left[,bottom[,right]]] pour le cropping. Au besoin, faire une capture d'ecran du film en visualisant le {VOBFILE} avec mplayer, pour calculer les paramètres adéquats.

Il y en a pour un petit moment. Nous allons donc nous livrer a un petit calcul nécessaire a la deuxième passe. En effet, il nous faut connaître la place disponible pour la vidéo.
Pour un encodage sur 2 CDs, soit 1400Mo, on va soustraire 1.2% du a l'overhead de l'OggMovie : c'est la place pour les headers de l'OGG. il nous reste donc 1384Mo.
On convertit cela en ko, soit 1 417 200 ko (en base 1024, je le rappelle, et avec un léger arrondi).
On retire à cela la taille en ko de toutes les bandes son soit pour l'exemple qui me concerne 170 030 ko. Il nous reste 1 247 170 ko.
Cette valeur multipliée par 8 divisé par la durée du film en secondes nous donne le {bitrate}, la valeur que l'on cherchait. Pour mon exemple, le film fait 3h20, soit 12000 secondes. J'obtiens donc un bitrate de 831kbits/s. On retient cette valeur dans {bitrate}.

Une fois ceci calculé et l'encodage de la première passe finie, passons a la deuxième passe :
transcode -i {VOBFILE} -o {VIDEO} -x vob,null -y xvid4 --config_dir {PATH} -R 2,xvid4.log -w {bitrate}
Si vous aviez des paramètres de désentrelacement, cropping ou redimensionnement, conservez les mêmes. On est parti pour un bon moment. Vous avez maintenant le temps de sortir faire un petit tour pour prendre l'air :). Le temps d'encodage peut varier très fortement en fonction de votre machine et des options choisies. La vidéo encodée se retouvera dans {VIDEO}.

Multiplexage des différents fichiers

Il ne reste plus qu'une seule commande a taper :
ogmmerge -o {FICHIERFINAL}.ogm -c TITLE="Titre du film" -A {VIDEO} -c LANGUAGE="Langue" audio1.ogg -c LANGUAGE="Langue" audio2.ogg ... -c LANGUAGE={Langue} sous-titres.srt {CHAPTERFILE}
Le fichier sera enregistré dans {FICHIERFINAL}.ogm.
-c TITLE="Titre du film" indique le titre du film que vous voulez (pas de formatage particulier).
Pour chaque flux audio/sous-titres, on peut spécifier sa langue, en le faisant précéder dans la ligne de commande par -c LANGUAGE="Langue" où Langue est l'une des dénominations standard anglaises : French, English, German....

Voila, l'encodage est terminé. Je n'ai pas détaillé l'extraction des sous-titres, car ce n'ai pas une chose très aisée, car cela utilise de la reconnaissance de caractères. C'est une opération assez lourde. Mais c'est tout a fait possible a l'aide des outils issus du package transcode : tccat, pgm2txt et srttool.