Main menu:

Site search

Categories

avril 2009
L M M J V S D
 12345
6789101112
13141516171819
20212223242526
27282930  

Archive

Encoder un dvd en DivX, Xvid ou h264

Initialement, l’intérêt du DivX, apparu en premier lieu était de pouvoir transcoder un DVD de façon à ce qu’il tienne sur un CD. La plupart des DVD sont des doubles couches permettant le stockage de +/- 9 GB maximum. Etant donné que sur un DVD, on a droit en général à des bonus, des bandes annonces, plusieurs langues, des sous-titres etc…, le film en lui même ne fait pas cette capacité maximum. A titre d’exemple, un DVD dont le film dure une heure et demi, codé en 8 Mbits/sec occupe une place de plus ou moins 5.5 GB. Pour arriver à réduire cette capacité à 700 MB maximum (taille d’un CD), il faut une compression sévère et des codecs de qualité. Ceci a été rendu possible par l’apparition du MPEG-4.

Note: Cet article est principalement basé sur la documentation de MPlayer/mencoder. Je suis conscient qu’il existe des frontend graphiques vous évitant de devoir utiliser la ligne de commande mais je reste persuadé que pour bien comprendre ce que l’on fait et comment faire pour avoir la qualité la meilleure, ceci reste très intéressant et riche d’enseignements.

Les Codecs

Le codec DivX utilise la compression MPEG-4. C’est une compression avec pertes. Ce codec tente d’allier qualité et taille de fichier.

Xvid est une version libre open source sous licence GNU qui utilise la compression MPEG-4 Part 2 – Advance Simple Profile (ASP). Les vidéos compressées en Xvid sont lisibles par un équipement DivX. Néanmoins, cela suppose que les caractéristiques avancées que permet le codage Xvid ne soient pas utilisées. Sous Linux, la plupart des programmes comme MPlayer ou VLC sont compatibles Xvid (grâce à la librairie libavcodec de FFmpeg par exemple).

H.264 Est un codec basé sur la compression MPEG-4 part 10 – Advance Video Coding (AVC).
x264 est la version libre sous licence GNU du codec H.264.

Quel codec choisir?

La question se pose bien évidemment mais la réponse est relativement simple.
Pour les utilisateurs de Linux, la version privilégiée sera bien sûr la version libre. On choisira donc plutôt Xvid d’autant plus qu’il est compatible avec DivX si on utilise pas de fonctions avancées.
Maintenant, si on tient compte de la qualité et qu’il n’y a pas de problèmes de compatibilité à respecter, on choisira x264. La qualité de la vidéo compressée est supérieure à celle du DivX et même du Xvid utilisé avec des fonctions avancées.

Simple passe ou passes multiples?

Lorsque l’on compresse la vidéo, on a le choix entre un encodage simple passe ou multiples passes. Cela revient à choisir entre un codage en CBR (Constant Bit Rate) pour le simple passe et le VBR (Variable Bit Rate) pour le codage en passes multiples.
Pour des raisons de qualité, on choisira systématiquement le codage VBR.

Et pour l’audio?

Le son étant très sensible aux encodages successifs, à moins qu’on ait une bonne raison de le faire, on choisira de ne pas y toucher.

Calcul du bitrate vidéo

Celui-ci dépend de la qualité envisagée. Plus le bitrate est élevé, plus la qualité vidéo résultante sera bonne mais ceci au détriment de la taille du fichier. On travaille donc souvent à l’envers. La taille maximum étant définie à 700 MB, on calcule le débit vidéo maximum possible:

bitrate vidéo = ((700 MB / taille du film)*8 - bitrate audio)

Ceci donne pour un film de deux heures avec un son encodé en 128kbits/sec:

bitrate vidéo = ((700 * 1024 * 1024 / (120 * 60))* 8 - (128 * 1024) = 684 kbits/sec

Les bandes noires

Souvent, la taille de l’image est réduite à des valeurs inférieures aux 720 pixels de résolution horizontale du DVD.
Il faut aussi toujours supprimer (cropping) les bandes noires en haut et en bas de l’image parce que les bandes noires ont un impact négatif sur l’encodage (transitions vives difficiles à encoder, elles utilisent de la bande passante,… ). Il faut aussi toujours tenir compte du fait que à cause des macroblocs du codage MPEG-4 qui ont une taille de 16×16, la taille de l’image doit toujours être un multiple de 16.

MPlayer a une fonction particulière qui aide à déterminer la taille des bandes noires. On utilise le filtre cropdetect dans une zone très claire du film:

$ mplayer dvd://1 -dvd-device /media/disk/DVD/ -vf cropdetect 
...
[CROP] Crop area: X: 2..717  Y: 57..518  (-vf crop=704:448:8:64).0 

Ensuite on rejoue le film avec le paramètre de cropping qu’on vient de déterminer au moyen du filtre crop. Ceci permet de se rendre compte d’une éventuelle erreur:

$ mplayer dvd://1 -vf crop=720:362:0:58

Si on tient compte du fait que la résolution horizontale et verticale doit être un multiple de 16, on prend la valeur juste inférieure et multiple de 16. On retire aussi une petite valeur en haut et en bas pour que le centre de l’image soit respecté. Cela donne:

$ mplayer dvd://1 -vf crop=720:352:0:62

Si malgré tout cela, la taille du fichier est encore trop grande ou que le bitrate calculé est trop faible pour avoir une qualité satisfaisante, on peut jouer sur la taille de l’image en utilsant le filtre scale de MPlayer/Mencoder. Attention: il faut toujours veiller à utiliser des multiples de 16:

$ mplayer dvd://1 -dvd-device /media/disk/DVD/ -vf scale=640:400

Ceci vous permet de voir la taille résultante en utilisant le filtre. Le même filtre peut être utilisé avec mencoder lors de l’encodage:

$ mencoder -ofps 25 -ovc xvid -xvidencopts bitrate=500 -aid 129 -oac copy -vf crop=704:448:8:64,scale=640:400 dvd://1 -dvd-device /media/disk/THE_BIBLE -o the_bible_xvid_1pass.avi

Caractéristiques du DVD

Il est souvent nécessaire de connaître les caractéristiques du DVD. Le nombre de titres, les langues existantes, les sous-titres éventuels… Qunad on lance MPlayer en ligne de commande, il affiche les caractéristiques du DVD:

$ mplayer dvd://1 -dvd-device /media/disk/DVD/
MPlayer 1.0rc2-4.3.2 (C) 2000-2007 MPlayer Team
CPU: Intel(R) Pentium(R) 4 CPU 2.80GHz (Family: 15, Model: 3, Stepping: 3)
CPUflags:  MMX: 1 MMX2: 1 3DNow: 0 3DNow2: 0 SSE: 1 SSE2: 1
Compiled with runtime CPU detection.
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.

Playing dvd://1.
There are 3 titles on this DVD.
There are 15 chapters in this DVD title.
There are 1 angles in this DVD title.
audio stream: 0 format: ac3 (unknown) language: en aid: 128.
audio stream: 1 format: ac3 (stereo) language: fr aid: 129.
audio stream: 2 format: ac3 (stereo) language: it aid: 130.
number of audio channels on disk: 3.
subtitle ( sid ): 0 language: nl
subtitle ( sid ): 1 language: en
subtitle ( sid ): 2 language: fr
subtitle ( sid ): 3 language: el
subtitle ( sid ): 4 language: it
subtitle ( sid ): 5 language: fr
subtitle ( sid ): 6 language: it
number of subtitles on disk: 7
MPEG-PS file format detected.
VIDEO:  MPEG2  720x576  (aspect 3)  25.000 fps  7500.0 kbps (937.5 kbyte/s)
xscreensaver_disable: xscreensaver wid=31457384.
==========================================================================
Opening video decoder: [mpegpes] MPEG 1/2 Video passthrough
VDec: vo config request - 720 x 576 (preferred colorspace: Mpeg PES)
Could not find matching colorspace - retrying with -vf scale...
Opening video filter: [scale]
The selected video_out device is incompatible with this codec.
Try appending the scale filter to your filter list,
e.g. -vf spp,scale instead of -vf spp.
VDecoder init failed :(
Opening video decoder: [libmpeg2] MPEG 1/2 Video decoder libmpeg2-v0.4.0b
Selected video codec: [mpeg12] vfm: libmpeg2 (MPEG-1 or 2 (libmpeg2))
==========================================================================
==========================================================================
Forced audio codec: mad
Opening audio decoder: [liba52] AC3 decoding with liba52
Using SSE optimized IMDCT transform
Using MMX optimized resampler
AUDIO: 48000 Hz, 2 ch, s16le, 192.0 kbit/12.50% (ratio: 24000->192000)
Selected audio codec: [a52] afm: liba52 (AC3-liba52)
==========================================================================
AO: [pulse] 48000Hz 2ch s16le (2 bytes per sample)
Starting playback...
VDec: vo config request - 720 x 576 (preferred colorspace: Planar YV12)
VDec: using Planar YV12 as output csp (no 0)
Movie-Aspect is 1.78:1 - prescaling to correct movie aspect.
VO: [xv] 720x576 => 1024x576 Planar YV12 

Cela permet de déterminer que l’audio ID (aid) est 129 pour le français, que le film a une résolution de 720 x 576 (ce qui est normal pour un DVD), que le son est codé en AAC à 192kb/s.
Tous ces renseignements seront utilisés dans la ligne de commande de transcodage.

Encodage

Ci-dessous, vous trouverez les lignes de commandes que j’ai utilisées pour faire mes essais. Vous devrez donc modifier certains des paramètres pour que cela corresponde à votre cas (device, aid,…)
Dans chaque cas, le son est copié tel quel sans transcodage.

encodage xvid en une passe:

$ mencoder -ofps 25 -ovc xvid -xvidencopts bitrate=800 -aid 129 -oac copy -vf scale=640:480 dvd://1 -dvd-device /media/disk/THE_BIBLE -o the_bible_xvid_1pass.avi

encodage deux passes en divx:

$ mencoder dvd://1 -dvd-device /media/disk/THE_BIBLE -ovc lavc -lavcopts vcodec=mpeg4:vpass=1:autoaspect -aid 129 -oac copy -o /dev/null
$ mencoder dvd://1 -dvd-device /media/disk/THE_BIBLE -ovc lavc -lavcopts vcodec=mpeg4:mbd=2:trell:vpass=2:autoaspect -aid 129 -oac copy -o the_bible_divx.avi

encodage en xvid en deux passes:

$ mencoder dvd://1 -dvd-device /media/disk/THE_BIBLE -mf fps=25 -ovc xvid -xvidencopts pass=1:bitrate=800 -alang fr -oac copy -o /dev/null
$ mencoder dvd://1 -dvd-device /media/disk/THE_BIBLE -mf fps=25 -ovc xvid -xvidencopts pass=2:bitrate=800 -alang fr -oac copy -o the_bible_xvid.avi

encodage deux passes en x264:

$ mencoder -aid 129 -oac copy -ovc x264 -x264encopts subq=5:8x8dct:me=umh:frameref=2:bframes=3:b_pyramid:weight_b:bitrate=800:pass=1 dvd://1 -dvd-device /media/disk/THE_BIBLE -o /dev/null
$ mencoder -aid 129 -oac copy -ovc x264 -x264encopts subq=5:8x8dct:me=umh:frameref=2:bframes=3:b_pyramid:weight_b:bitrate=800:pass=2 dvd://1 -dvd-device /media/disk/THE_BIBLE -o the_bible_x264.avi

Comparez les résultas obtenus. Pour cela, choisissez des scènes d’actions où l’ensemble de l’image est animée. Choisissez des images sombres et regardez le codage qui donne les images les moins bruitées. Observez s’il n’y a pas de pixelisation dans certaines scènes, signe d’un bitrate trop faible…

Comments

Comment from david bettsworth
Time: 9 juillet 2009, 9 h 09 min

Enfin un tout-en-un parfait sur le sujet,
c’est simplement génial….

Comment from linuxindetails
Time: 8 décembre 2009, 18 h 50 min

Excellent tutoriel ! Le meilleur que j’ai vu jusqu’à présent concernant l’encodage de dvd sous Linux. En plus des commandes à exécuter, vos explications techniques sont simples et claires !

Comment from Steph
Time: 27 avril 2010, 20 h 07 min

Hello

Bizzare ton subq pour l’encodage en deux passes !
La doc dit : Experience shows that, with one reference frame, subq=5 (the default setting) takes about 35% more time than subq=1

Moi j’aurais mis 1 pour la 1ere passe, et 6 pour la 2e.

++

Comment from admin
Time: 27 avril 2010, 20 h 29 min

Oui, tu as raison. La doc le dit clairement d’ailleurs:

If you care about speed, a reasonable compromise is to use low subq and frameref values on the first pass, and then raise them on the second pass.

Je ne me souviens plus si, au moment de la rédaction de ce billet, c’était mon intention et qu’il s’agit d’un typo mais il est évident que ta proposition est correcte.