Multimedia/Matroska

De TartareFR
Aller à la navigation Aller à la recherche

Le format MKV, c'est quoi ?

Dans l'univers de l'encodage de films, nous parlons souvent du célèbre format DivX. Mais que se cache-t-il sous ce nom ? Le DivX est ce qu'on appelle un codec vidéo, une sorte de « format » de flux vidéo qu'on trouve dans un conteneur vidéo... Mais c'est quoi un conteneur ?

Prenons les choses par le début : un conteneur vidéo est un format de fichier conçu pour stocker plusieurs données audio et vidéo. Les conteneurs les plus connus sont l'AVI (Audio Video Interleave), l'OGM (Ogg Media video), le WMV (Windows Media Video), le RMVB (RealMedia Variable BitRate.), pour ne citer qu'eux. Le MKV (Matroska Video) est aussi un conteneur vidéo.

Un conteneur n'est pas un codec, il « enveloppe » des flux qui ont été encodés par des codecs. Ainsi :

  • AVI : le couple de codecs le plus répandu est assurément le DivX (pour la vidéo) et le MP3 (pour l'audio). Mais on trouve aussi pour la vidéo les XviD et MPEG, et pour l'audio le MP2, le WAV et même l'AC3.
  • OGM : plus rarement utilisé, ce contenur supporte des flux vidéo au format Theora, Xvid ou DivX, une ou plusieurs pistes son au format Ogg Vorbis, AC3, MP3, FLAC ou WAV. Il semblerait, mais je n'ai jamais testé, qu'il supporte également le sous-titrage et le chapitrage.
  • WMV : le conteneur se base sur des codecs propriétaires de Microsoft, que je connais assez mal. Je vous invite à consulter par exemple la page de Wikipédia à ce sujet.
  • RMVB : ce conteneur utilise un flux vidéo en RV9 et un flux audio en RA.

Tous ces conteneurs sont limités à certains codecs : impossible de mettre un RV9 dans un AVI ou de mettre du OGG dans un RMVB. Ne parlons même pas des sous-titres qu'on ne peut pas muxer (assembler) dans ces conteneurs.

Le conteneur MKV permet tout ceci. Il a plusieurs avantages :

  • Il permet de muxer quasiment tous les flux vidéo : DivX, XviD, RealVideo, H.264, Theora, RV9, VP6 et autres...
  • Il permet de muxer quasiment tous les flux audio, et en grand nombre (avec l'AVI seules 2 pistes au maximum) : OGG Vorbis, AAC, MP2, MP3, AC3, DTS, PCM, WV (WavPack), FLAC. Le MPC n'est pas encore au point pour le mux dans un MKV.
  • Il permet d'intégrer un grand nombre de pistes de sous-titres, directement dans le fichier. Pour les AVI, il faut avoir le *.srt séparément ou une incrustation en dur dans la vidéo. Mais le MKV n'est pas le seul à avoir cette capacité
  • Il permet aussi d'intégrer le chapitrage. Là non plus, il n'est pas le seul à avoir cette capacité.
  • Il permet le tag des pistes audio et des sous-titres.
  • Un autre très gros avantage : l'overhead (l'espace disque utilisé pour assembler les différents flux) est bien plus petit, même nul voire négatif. Par exemple vous avez une vidéo de 610Mio avec une piste audio de 90Mio, le fichier fera 713Mio en AVI (donc 13Mio de perte), alors qu'en MKV il fera à peine 700Mio (699Mio).

Je propose ici un tutorial pour encoder un DVD en MKV. Je me base sur le très bon tutorial de la Communauté francophone des utilisateurs d'Ubuntu[1].

Prérequis

Note.png
Norme
Cette page respecte la notation de wikipedia: 1Mio = 1024Kio et 1Mo = 1000ko.

Le format du fichier final que nous allons obtenir est le suivant :

  • Conteneur : Matroska Video
  • Codec vidéo : x264
  • Codec audio : OGG Vorbis
  • Sous-titrage : SUB
  • Chapitrage : OGG Chapters / XML

Pour cela, il vous faudra les logiciels/packages suivants :

  • mplayer : lecteur vidéo aux possiblités très étendues
  • mencoder : encoder vidéo (même package que mplayer)
  • vorbis-tools : outils pour Ogg Vorbis, notamment oggenc (l'encodeur Ogg Vorbis)
  • ogmtools : boîte à outils OGG Media Streams, dont utiliserons le binaire dvdxchapter
  • x264 : librairie permettant l'encodage en H264/AVC
  • mkvtoolnix : outil de traitement des MKV (notamment pour muxer...)

Il vous faudra aussi pas mal de capacité disque dur pour accueillir tous les fichiers temporaires (notamment la copie du DVD à encoder, soit un fichier de 4 à 9 Go, et 1 à 2 Go par piste audio lors de l'extraction avant encodage). Et la ligne de commande ne doit pas vous faire peur. Certains y voient comme un frein pour une migration vers Linux. Mais faut bien admettre qu'elle est vachement pratique et surtout que les possiblités qu'elle nous offre vont souvent bien plus loin que celles d'une interface graphique.

Encodage en 6 étapes

Étape 1 – extraction du film au format VOB

Il nous faut dans un premier temps extraire la piste du DVD qui nous intéresse, à savoir la piste contenant le films. Un DVD possède en effet plusieurs pistes en plus du celle du film, comme les bonus par exemple. Afin de déterminer la bonne piste, il nous faut les tester une à une avec la commande suivante :

mplayer dvd://<piste>

mplayer étant le binaire du logiciel de même nom et <piste> le numéro de la piste que vous souhaitez visionner. En général, la piste du film correspond à l'indice N de la plus grosse famille de fichiers VTS_N_xx.VOB du répertoire VIDEO_TS du DVD.

Il est possible de sélectionner un lecteur si celui par défaut n'est pas le bon. Par exemple, je souhaite utiliser mon graveur qui est le deuxième lecteur optique reconnu (/dev/sr1, alors que le lecteur par défaut est /dev/sr0) :

mplayer dvd://<piste> -dvd-device /dev/sr1
Note.png
Méthode alternative
Vous pouvez utiliser dvdnav et observer la sortie de mplayer pour déterminer le numéro du titre.
mplayer -nocache dvdnav://

Une fois la bonne piste trouvée (supposons ici la piste 4), l'extraction de celle-ci vers un fichier *.vob se fait en tapant :

mplayer -dumpstream dvd://4 -dumpfile video.vob

où l'option -dumpstream précise qu'on récupère le flux brut de lecture et -dumpfile qu'on définit nous-même le nom du fichier d'extraction (video.vob dans cet exemple) pour éviter le nom par défaut. Cette étape prend quelques minutes. Notez qu'on ne crée qu'un seul fichier qui pèsera plusieurs Go. Il faut donc que votre système de fichiers le supporte, ce qui est le cas pour les systèmes de fichiers habituels sous Linux.

A cette étape, il y a des informations très utiles qui nous sont communiquées dans le terminal. En effet Les méta-données (langues des pistes audios et des chapitres : les pistes audio avec leurs identifiants « aid » ainsi que les sous-titres disponibles, également avec leurs identifiants « sid ») seront perdues. Il est donc conseillé de les noter dans un fichier texte ou autre ; elles sont affichées par mplayer via des lignes comme :

Flux audio : 0 format : ac3 (5.1) langue : ja aide : 128.
Flux audio : 1 format : ac3 (5.1) langue : en aide : 129.

et

Sous-titre ( sid ) : 0 langue : en
Sous-titre ( sid ) : 1 langue : fr
Sous-titre ( sid ) : 2 langue : es
$ mplayer -dumpstream dvd://4 -dumpfile video.vob
MPlayer dev-SVN-r27637-4.2.1-openSUSE Linux 10.3 (i686)-Packman (C) 2000-2008 MPlayer Team
CPU: Intel(R) Core(TM)2 CPU          6600  @ 2.40GHz (Family: 6, Model: 15, Stepping: 6)
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://4.
There are 7 titles on this DVD.
There are 2 angles in this DVD title.
audio stream: 0 format: ac3 (5.1) language: en aid: 128.
audio stream: 1 format: ac3 (5.1) language: fr aid: 129.
audio stream: 2 format: ac3 (stereo) language: en aid: 130.
number of audio channels on disk: 3.
subtitle ( sid ): 0 language: en
subtitle ( sid ): 1 language: fr
subtitle ( sid ): 2 language: nl
subtitle ( sid ): 3 language: en
subtitle ( sid ): 4 language: fr
number of subtitles on disk: 5
Core dumped ;)
* 
Exiting... (End of file)

Avant de retirer le DVD de votre lecteur, et si vous souhaitez extraire les sous-titres du dvd, il est conseillé de sauvegarder les fichiers IFO qu'il contient.

Note.png
Méthode alternative
Si vous avez des problèmes pour récupérer le fichier vob avec la méthode ci-dessus, vous pouvez essayer avec la commande :
mplayer -nocache -dumpstream dvdnav://4 -dumpfile video.vob

Étape 2 – récupération des chapitres

Nous allons maintenant extraire les chapitres. Pour cela, nous pouvons utiliser le binaire dvdxchap :

dvdxchap -t <piste> /dev/sr0 > chapters.txt

Je trouve cependant que la commande suivante donne de meilleurs timings pour les chapitres :

chaplin -d /dev/sr0 -t <piste> -c

Mais il faut mettre en forme le résultat... Personnellement, je remplace les timings du fichier chapters.txt créé plus haut par ces nouveaux timings. Le package chaplin est disponible dans certains dépôts de packages des distributions Linux, sinon les sources sont ici.

Étape 3 – extraction des sous-titres

Si votre DVD contient des sous-titres, il est possible de les intégrer au fichier final. Pour extraire les sous-titres nous pouvons nous baser sur les identifiants sid vus plus haut. Il est aussi possible de les retrouver avec la commande :

mplayer -v dvd://<piste>

qui nous redonne (l'option -v augmente le niveau de verbosité) :

subtitle ( sid ): 0 language: en
subtitle ( sid ): 1 language: fr
subtitle ( sid ): 2 language: nl
subtitle ( sid ): 3 language: en
subtitle ( sid ): 4 language: fr
number of subtitles on disk: 5

N'hésitez pas à tester les sous-titres, où "-sid" spécifie l'identifiant de la piste de sous-titre :

mplayer dvd://<piste> -sid <ID_sous-titre>

Pour extraire les sous-titres, il faut exécuter pour chacun d'euxs :

mencoder dvd://<piste> -vobsubout subtitles -vobsuboutindex 0 -sid <ID_sous-titre> -o /dev/null -nosound -ovc frameno 

Les fichiers subtitles.idx et subtitles.sub seront alors créés dans le répertoire courant. Répétez cette opération pour chacune des pistes de sous-titres que vous souhaitez extraire, en changeant le numéro de l'option vobsuboutindex (incrémentez-le pour chaque nouveau sous-titre). Il est judicieux ici de renommer les fichiers (même nom est extensions idx et sub) pour chaque langue, ou plus simplement de changer la base de nom en arguement de l'option -vobsubout pour bien pouvoir les identifier plus tard. Il est aussi possible de faire l'extraction à partir de fichier video.vob créé, mais les informations contenues dans le fichier subtitles.idx sont alors moins complètes, notamment pour la police (taille, couleurs).

Faisons le tour des options utilisées (voir le manuel de mplayer/mencoder)  :

  • -vobsubout <base_de_nom> : définit le nom de base pour les fichiers *.idx et *.sub de destination. Cela désactive le rendu des sous-titres dans le film encodé et le redirige vers un groupe de fichiers de sous-titres VOBsub.
  • -vobsuboutindex <index> : spécifie l'index des sous-titres dans le fichiers de sortie. Ici on prend 0 (valeur par défaut), puisqu'on a qu'un seul sous-titre récupéré à chaque fois.
  • -sid <ID_sous-titre> : indique l'identifiant du sous-titre voulu.
  • -o <fichier> : précise le nom de fichier créé par mencoder. Ici, on choisit /dev/null, c'est-à-dire qu'on envoie la vidéo nulle part (on ne crée aucune vidéo).
  • -nosound : on n'utilise pas de son.
  • -ovc <codec_video> : codec vidéo utilisé. Ici on choisit frameno qui est un codec "audio only" (pas de vidéo).

La suite des opérations ne nécessite plus le DVD source. Vous pouvez le ranger sur votre étagère. Nous allons travailler uniquement avec le fichier video.vob créé.

Note.png
Il existe des méthodes permettant de transformer ces sous-titre "vobsub" en "srt". Nous ne les détaillerons pas ici cependant, voici deux liens qui sont particulièrement utile pour comprendre la méthode (en anglais) :

Étape 4 – extraction et encodage des pistes audio

Méthode utilisant mplayer et oggenc

Pour encoder les pistes audio voulues, nous allons nous baser sur leurs identifiants vus plus haut. Il toutefois est possible de récupérer ces identifiants directement dans le fichier video.vob créé :

mplayer video.vob -v -vo null -ao null -frames 0 | grep "audio stream:"

Dans notre exemple, la piste anglais à pour aid le numéro 128, et la piste française l'aid 129. Pour lire notre fichier video.vob avec la piste audio souhaitée, nous pouvons exécuter la commande :

mplayer video.vob -aid <ID_piste_audio>

Nous allons dans un premier temps extraire la piste audio souhaitée du fichier video.vob en la récupérant sous le format WAV. Si vous souhaitez l'extraire en mode stéréo et que vous avez un paramétrage de MPlayer en 5.1 (channels=6 dans le fichier <path>~/.mplayer/config</path>), il n'est pas nécessaire de modifier ce paramétrage. Il suffit d'ajouter la bonne option à la ligne de commande (-channels 2), soit pour la piste anglaise (-aid 128) :

mplayer video.vob -aid 128 -channels 2 -ao pcm:file=audio128.wav -vc null -vo null 

où l'option -ao pcm:file=audio128.wav indique que nous utilisons le driver de sortie audio PCM, c'est-à-dire la capacité d'écrire un fichier WAV dont nous indiquons le nom. L'option -vo null stipule que nous n'utilisons aucun driver de sortie vidéo et -vc null indique que nous n'utilisons aucun codec vidéo. Nous faisons de même pour toutes les pistes audio que nous voulons garder, en respectant leurs aid. Cela peut aussi prendre plusieurs minutes. Attention, les fichiers WAV obenus sont assez gros (>1 Go par piste, voir presque 2 Go selon les films).

Il arrive souvent que le volume sonore des pistes audio soit un peu faible. Pour augmenter le volume, il est possible d'utiliser l'option -af volume=<diff_en_dB> qui appliquera une augmentation de <diff_en_dB> décibels. Par exemple :

mplayer video.vob -aid 128 -channels 2 -af volume=20 -ao pcm:file=audio128.wav -vc null -vo null 

Attention toutefois avec cette option, il peut y avoir des distorsions dans le son.

Après cela, nous allons encoder nos volumineux fichiers WAV dans le format Ogg Vorbis. C'est un codec audio destructeur, au même titre que le MP3, de très bonne qualité. Nous choisissons pour cela une option de « qualité » en termes de bitrate selon le tableau suivant :

Qualité Bitrate
-q0 64 kb/s
-q1 80 kb/s
-q2 96 kb/s
-q3 112 kb/s
-q4 128 kb/s
-q5 160 kb/s
-q6 192 kb/s
-q7 224 kb/s
-q8 256 kb/s
-q9 320 kb/s
-q10 500 kb/s

Les bitrates affichés sont des bitrates maximaux, le format Ogg Vorbis étant en bitrate variable (VBR). En général, le choix se fait entre -q3, -q4 et -q5, mais on est libre de choisir ce que l'on veut (on pourrait même prendre du MP3 à la place, ou encore du FLAC). Plus le bitrate est grand, meilleure est la qualité, mais moins de place il nous restera pour la vidéo pour une taille de fichier final fixée. C'est pour cela qu'en général je prends -q3. Pour chaque fichier WAV, nous faisons :

oggenc -q3 <fichier.wav>

qui créera <fichier.ogg>. Ainsi nous aurons, toujours dans notre exemple, les fichiers audio128.ogg et audio129.ogg. Si le résultat vous satisfait, vous pouvez effacer les fichiers WAV maintenant et libérer les Go qu'ils occupent, sinon réessayer avec un autre bitrate (et les conséquences pour la place de la vidéo qui en découlent)...

Méthode utilisant ffmpeg

D'abord on détermine la liste des pistes (video/audio/sous-titre/…) :

ffmpeg -i video.vob

Normalement l'ordre des pistes est la même que celle déterminée dans la section Extraire en vob ; cependant les numéros sont différents (ils sont sous la forme "0:x").

Une fois qu'on a repéré la piste audio voulue (ici la numéro 2) on l'extrait :

ffmpeg -i video.vob -map 0:2 -vn -sn -acodec libvorbis -aq 3 -ac 2 audio.ogg
  • -map 0:2 permet de choisir la piste à encoder.
  • -vn on extrait aucune piste vidéo (on ne conserve que la piste audio)
  • -sn on extrait aucune piste de sous-titre (on ne conserve que la piste audio)
  • -aq 3 permet de choisir la qualité du son, plus la valeur est grande, meilleur est la qualité. Ce paramètre va de 1 à 10.
  • -ac 2 permet de spécifier le nombre de canaux voulu (2 pour du stéréo, 6 pour du 5.1, etc.), cette option n'est pas obligatoire.

Méthode utilisant ffmpeg2theora

On peut utiliser ffmpeg2theora dont la sortie par défaut utilise le codec audio vorbis :

ffmpeg2theora video.vob -a 3 --novideo -o audio.oga

Pour changer le numéro de la piste (qui s'affiche lors de l'encodage avec ffmpeg2theora) :

ffmpeg2theora video.vob -a 3 --audiostream 2 --novideo -o audio.oga
  • -a 3 permet de choisir la qualité du son.
  • --audiostream 2 permet de choisir la piste son à extraire. Pour avoir la bonne langue, choisissez la piste qui vous concerne.

Étape 5 – extraction et encodage de la piste vidéo

Avant de lancer l'encodage de la vidéo, nous allons fixer 2 paramètres essentiels : le crop et le bitrate de la vidéo.

Déterminer si votre vidéo est entrelacée

Si, lors des mouvements, des lignes horizontales apparaissent sur l'image, il faut utiliser un filtre de désentrelacement. Si vous n'êtes pas sûr, jouez une scène d'action image par image (la touche "." avec mplayer), ça se voit très bien.

Attention, ne pas utiliser de filtre de désentrelacement sur une source Telecine. En effet, le Telecine peut être inversé de manière lossless (sans pertes), contrairement à l'entrelacement.

Si vous allez encoder la vidéo via mencoder, vous avez le choix entre plusieurs désentrelaceurs :

  • lavcdeint : ?
  • kerndeint : Kernel deinterlace
  • filmdint : ?
  • pp=lb : Linear Blend Deinterlace
  • pp=li : Linear Interpolating Deinterlace
  • pp=ci : Cubic Interpolating Deinterlace
  • pp=md : Median Deinterlace
  • pp=fd : FFMpeg Deinterlace

Pour lire votre vidéo avec un filtre de désentrelacement, tapez la commande suivante (si vous voulez utiliser le désentrelaceur cubique) :

mplayer video.vob -vf pp=ci

Si vous allez encoder la vidéo via ffmpeg, pas besoins de vous creuser la tête… vous utiliserez l'option -deinterlace (équivalent de pp=fd).


Warning.png
Surtout, si votre vidéo n'est pas entrelacée, n'appliquez aucun filtre de désentrelacement, vous perdriez en qualité!

Découpage des bandes noires – le crop

La vidéo d'un DVD, de part son format, possède bien souvent des bandes noires. Pour une meilleur efficacité du codec il est préférable de ne laisser aucune bande noir, si petite soit-elle. mplayer sait définir la dimension exacte de la fenêtre vidéo sans ces bandes noires. Pour cela, on utilise le filtre vidéo cropdetect :

mplayer video.vob -nosound -vo null -vf cropdetect

Ce filtre a pour effet de lancer le calcul du crop et les résultats sont affichés dans le terminal. Ce résultat respecte la taille des blocs (les valeurs sont des multiples de 16). Au bout d'un moment (quelques secondes), sa valeur se stabilise et on obtient quelque chose comme :

[CROP] Crop area: X: 0..719  Y: 70..505  (-vf crop=720:432:0:72).
[CROP] Crop area: X: 0..719  Y: 70..505  (-vf crop=720:432:0:72).
[CROP] Crop area: X: 0..719  Y: 70..505  (-vf crop=720:432:0:72).
[CROP] Crop area: X: 0..719  Y: 70..505  (-vf crop=720:432:0:72).
[CROP] Crop area: X: 0..719  Y: 70..505  (-vf crop=720:432:0:72).
[CROP] Crop area: X: 0..719  Y: 70..505  (-vf crop=720:432:0:72).
[CROP] Crop area: X: 0..719  Y: 70..505  (-vf crop=720:432:0:72).
[CROP] Crop area: X: 0..719  Y: 70..505  (-vf crop=720:432:0:72).
[CROP] Crop area: X: 0..719  Y: 70..505  (-vf crop=720:432:0:72).
[CROP] Crop area: X: 0..719  Y: 70..505  (-vf crop=720:432:0:72).
[CROP] Crop area: X: 0..719  Y: 70..505  (-vf crop=720:432:0:72).
[CROP] Crop area: X: 0..719  Y: 70..505  (-vf crop=720:432:0:72).
[CROP] Crop area: X: 0..719  Y: 70..505  (-vf crop=720:432:0:72).
[CROP] Crop area: X: 0..719  Y: 70..505  (-vf crop=720:432:0:72).
[CROP] Crop area: X: 0..719  Y: 70..505  (-vf crop=720:432:0:72).

Notre crop ici vaut 720:432:0:72. Notez que la syntaxe de l'option à utiliser est indiquée : -vf crop=720:432:0:72. Nous pouvons tester ce réglage :

mplayer video.vob -vf crop=720:432:0:72

Si toutefois le résulat ne vous satisfait pas, vous pouvez modifier le crop « à la main ». Mais en général, c'est tout bon. En revanche, j'ai constaté que la résolution affichée n'est pas la résolution réelle de l'image, même si la ratio largeur/hauteur est respecté. J'ai cru détecter que la hauteur est bonne (432 dans notre exemple), mais la largeur est plus grande que celle indiquée (720 pour notre exemple). Nous pouvons redimensionner la hauteur à partir de la largeur. Nous aurons donc bien une largeur à 720, mais dans ce cas la hauteur est plus petite que 432. Nouvelle syntaxe :

mplayer video.vob -vf crop=720:432:0:72,scale=720:-2

C'est syntaxe sera reprise lors du rip de la vidéo. Notez aussi que si des problèmes de ratio largeur/hauteur subsistent, nous pouvons utiliser en plus l'option -aspect <ratio> (également lors du rip).

Note.png
Visualisation du crop
Vous pouvez également visualiser l'effet du crop en faisant apparaître un rectangle simulant le découpage sur la vidéo originale :
{{app|mplayer}} video.vob -vf rectangle=656:576:34:0 -nocache -nosound

Vous pouvez modifier les valeurs manuellement. Cependant, veuillez à ce que les tailles de l'image soit des multiples de 16 (largeur = premier nombre du crop ; hauteur = deuxième nombre du crop).

Quel bitrate choisir ?

À mon sens, il y a deux façons d'aborder le problème : soit on décide de se limiter à une taille donnée pour le fichier final (700Mio, 2x700Mio), soit on choisit le bitrate qui nous convient le mieux en s'autorisant des fichiers un peu plus gros que 700Mio.

Quel que soit ce choix, la relation entre la taille finale du fichier et le bitrate vidéo se calcul de la même manière. Posons :

  • final : la taille finale du fichier que nous voulons obtenir (en Mio, soit 700Mio par exemple),
  • video : la taille de la video seule (en Mio),
  • audio : la somme des tailles des pistes audio que vous avez encodées (en Mio),
  • subtitles : la taille des pistes de sous-titres (comptez 1 Mio à 2 Mio par piste),
  • time : la durée de la vidéo (en secondes).

Le bitrate est un flux dont la dimension s'exprime en kb/s. Donc bitrate = (video en kb/s) / time. Or :

  • (video en Mio/s) * 2^3 nous donne video en Mib/s
  • (video en Mib/s) * 2^10 nous donne video en Kib/s
  • (video en Kib/s) * 2^10*10^-3 nous donne video en kb/s
  • video = final - audio - subtitles

Nous avons donc : bitrate = video * 2^(3+10+10)*10^-3 / time

Soit encore : bitrate = (final - audio - subtitles) * 2^23*10^-3 / time

<calcBitrate/>

L'encodage vidéo

Méthode avec mencoder

Pour l'encodage vous avez le choix d'utiliser mencoder (qui utilise lui même x264), ou ffmpeg (qui peut utiliser libx264, ce dernier ayant la réputation de fournir des images de meilleur qualité).

Encodage visant une taille de fichier

Avec un bitrade à 800 kb/s, en 2 passes, sans désentrelacement, les commandes seront :

Première passe :

mencoder video.vob -o video.avi -vf crop=720:432:0:72,scale=720:-2 \
-ovc x264 -x264encopts \
bitrate=800:frameref=8:mixed_refs:bframes=3:b_adapt:b_pyramid=strict:weight_b:partitions=all:8x8dct:me=umh:subq=7:trellis=2:threads=auto:pass=1 \
-nosound -nosub

Deuxième passe :

mencoder video.vob -o video.avi -vf crop=720:432:0:72,scale=720:-2 \
-ovc x264 -x264encopts \
bitrate=800:frameref=8:mixed_refs:bframes=3:b_adapt:b_pyramid=strict:weight_b:partitions=all:8x8dct:me=umh:subq=7:trellis=2:threads=auto:pass=2 \
-nosound -nosub

Ces paramètres donnent une extrêmement haute qualité (on peut encore augmenter certains paramètres, mais ça serait de l'abus), mais demandent beaucoup de temps d'encodage : environ 12 h pour un film de 2h à 1Mbit/s sur un core 2 duo 1,6 GHz (ordinateur portable).

Cependant la première passe ne sert qu'à créer un fichier statistiques, on peut donc choisir des paramètres moins élevés pour qu'elle se déroule plus rapidement, la perte n'est pas perceptible en général. Il est ainsi possible de diviser la durée de la première passe par 4 et arriver à 7h30 pour l'exemple précédent.

Exemple 1ère passe plus rapide :

mencoder video.vob -o video.avi -vf pp=ci,crop=720:576:0:0 -ovc x264 -x264encopts \
bitrate=800:frameref=8:mixed_refs:bframes=3:subq=3:b_pyramid:weight_b:threads=auto:pass=1 -nosound

Voici l'explication des options (ne maîtrisant pas tout, loin de là, je reprends ce qu'indique la manpage de mencoder qu'il faudra consulter pour certains renvois) :

  • bitrate=<valeur> : fixe le débit binaire (bitrate) moyen à utiliser en kbits/ seconde (par défaut : désactivé). Etant donné que le débit binaire peut varier, cette moyenne peut ne pas être respectée pour des vidéos très courtes (voir ratetol). Pour un encodage en débit binaire constant (CBR), vous devez utiliser cette option accompagnée de vbv_maxrate, pour une qualité finale significativement moins bonne.
  • frameref=<1–15> : nombre des trames précédentes à utiliser comme prédicteur pour les trames-B et -P (par défaut : 1). Est efficace avec les dessins animés, mais avec des films dont les sujets sont réels, on n'observe plus d'amélioration significative au-delà d'environ 6 trames de référence. N'a pas d'effet sur le temps de décodage, mais augmente la quantité de mémoire nécessaire pour le décodage. Quelques décodeurs ne gèrent qu'au plus 15 trames de référence.
  • (no)mixed_refs : permet à chaque partition de mouvement 8x8 ou 16x8 de choisir indépendamment leur trame de référence. Sans cette option, tout le macro-bloc doit utiliser la même référence. Nécessite frameref>1.
  • bframes=<0–16> : nombre maximum de trames-B consécutives entre les trames-I et -P (par défaut : 0).
  • (no)b_adapt : décide automatiquement quand utiliser des trames-B et combien, jusqu'au maximum défini ci-dessus (par défaut : activé). Si cette option est désactivée, alors le maximum de trames-B est utilisé.
  • (no)b_pyramid : autorise les trames-B à servir de référence pour prédire d'autres trames. Si on prend par exemple 3 trames-B consécutives : I0 B1 B2 B3 P4, sans cette option, les trames-B ont les mêmes restrictions que MPEG-[124]. Elles sont alors codées dans l'ordre I0 P4 B1 B2 B3, et toutes les trames-B sont prédites à partir de I0 et P4. Avec cette option, elles sont codées I0 P4 B2 B1 B3. B2 est la même que ci-dessus, mais B1 est prédit à partir de I0 et B2, et B3 est prédite à partir de B2 et P4. Ceci améliore généralement légèrement la compressiblité, et ne dégrade pas la vitesse d'encodage. Cependant, c'est une option expérimentale : elle n'est pas encore peaufinée, et n'aide pas toujours la compression. Requière bframes>=2. Désavantage : augmente de 2 trames le délai de décodage.
  • (no)weight_b : utilise des prédictions pondérées dans les trames-B. Sans cette option, les macro-blocs prédits bidirectionnellement voient leurs trames de référence pondérés de la même valeur. Avec cette option, les pondérations sont déterminées par la position temporelle de la trame-B par rapport à celles de référence. Requière bframes>1.
  • partitions=<liste> : autorise certain types de macro-blocs optionnels (par défaut : p8x8,b8x8,i8x8,i4x4). « all » autorise tous les types.
  • (no)8x8dct : taille de transformée spatiale adaptative : autorise les macro-blocs à décider entre 4x4 et 8x8 DCT. Sans cette option, uniquement le type 4x4 DCT est utilisé. Appartient au « High Profile » de la norme h264.
  • me=<nom> : définit l'algorithme d'estimation du mouvement fullpixel. « umh » recherche multi-hexagonale irrégulière (lent).
  • subq=<0–9> : ajuste la qualité d'affinement de subpel. Ce paramètre contrôle le compromis qualité/vitesse lié aux décisions du processus d'estimation du mouvement. subq=5 peut augmenter jusqu'à 10% le taux de compression par rapport à subq=1, subq=7 active la sélection des macro-blocs en fonction de leur taux de distortion dans toutes les trames.
  • trellis=<0–2> : quantification optimale du point de vue du taux de distortion : 2 activé pour toutes les décisions de modes de macroblocs (lent, requiert subq>=6).
  • threads=<1–16> : crée des threads pour encoder en parallèle sur plusieurs processeurs (par défaut : 1). Cela dégrade un peu la qualité de la compression. 0 ou « auto » demande à x264 de détecter le nombre de processeurs et de créer le nombre de threads approprié.
  • pass=<1–3> : active le mode 2 ou 3 passes. Il est recommandé de toujours encoder en mode 2 ou 3 passes puisque cela permet une distribution plus adéquate des bits et améliore la qualité globale. Voici comment cela fonctionne, et comment l'utiliser : la première passe (pass=1) écrit le fichier de statistiques. Vous devriez désactiver des options gourmandes en temps processeur. En mode deux passes, la seconde passe (pass=2) se base sur le fichier de statistiques pour allouer le bon nombre de bits aux trames (ratecontrol). En mode trois passes, la seconde passe (pass=3, non ce n'est pas une erreur) fait les deux : elle lit le fichier de statistiques, puis ré-écrit par dessus. Vous devriez utiliser toutes les options d'encodage, à l'exception de celles vraiment très gourmandes. La troisième passe (pass=3) fait la même chose que la seconde, à la différence près qu'elle dispose des statistiques de la deuxième passe pour mieux travailler. Vous pouvez utiliser toutes les options d'encodage, même les plus gourmandes. La première passe peut être effectuée à un débit binaire moyen (ABR) ou à quanta constant. Le mode ABR est recommandé puisqu'il ne nécessite pas que vous deviniez le quanta à utiliser. Les passes suivantes sont ABR (débit binaire moyen), et vous devez définir un débit binaire.

Le choix des options n'est pas de moi, c'est celui du tutorial de la Communauté francophone des utilisateurs d'Ubuntu, à ceci près que l'option brdo n'est pas disponible chez moi, et je ne sais pas quelle est sa signification.

Warning.png
Options trellis
L'option trellis=<0–2> posait parfois problème [2].
Note.png
Sous-titre intégré par défaut
Il peut être utile d'ajouter l'option -nosub dans le cas où un sous-titre est intégré par défaut.

encodage visant une qualité

Lorsque le fichier n'est pas destiné à être gravé et que la qualité de l'image importe plus que la taille du fichier, il est possible d'encoder la vidéo en utilisant un paramètre de crf (constant rate factor). Avec ce paramètre, on ne vise pas une taille de fichier mais une qualité d'image ; le débit varie alors suivant les scènes pour garantir cette qualité toute au long du film.

Cette méthode ne necessite qu'une seul passe :

mencoder video.vob -o video.avi -vf crop=720:576:0:0 -ovc x264 -x264encopts crf=20:preset=slow:tune=animation:threads=auto -nosound -nosub

Le paramètre "crf" peut varier de 0 à 51, plus il est petit, meilleur est la qualité (0 correspondant à un encodage sans perte). Dans certains cas, l'ajout des options "harddup et scale" seront nécessaires. Ce qui donnera :

mencoder video.vob -o video.avi-ovc x264 -x264encopts crf=20:preset=slow:tune=film -nosound -vf crop=720:416:0:80,scale,harddup

Méthode avec ffmpeg

ffmpeg permet d'utiliser libx264 qui semble donner de meilleurs résultats. Il ne possède pas de tune comme x264, il dispose en revanche de ces propre preset et profile. Ceux-ci sont disponible sous forme de fichier, un simple "locate ffpreset" permet de les trouver.

Cette partie du tutorial est fortement inspirée de ce billet du blog de Robert Swain[3].

encodage visant une taille de fichier

Chaque preset possède son équivalent spécifique à la première passe (on ajoute "_firstpass" au nom du preset), ils permettent d'augmenter la vitesse de celle-ci sans altérer la qualité :

ffmpeg -i video.vob -an -sn -pass 1 -vcodec libx264 -vpre slow_firstpass -b 800k -threads 0 -vf crop=720:576:0:0 video.mkv

puis la second passe :

ffmpeg -i video.vob -an -sn -pass 2 -vcodec libx264 -vpre slow -b 800k -threads 0 -vf crop=720:576:0:0 video.mkv
  • -an : on extrait aucune piste audio (on ne conserve que la piste vidéo)
  • -sn : on extrait aucune piste de sous-titre (on ne conserve que la piste vidéo)
  • -vpre : spécifie le preset (on peut spécifier plusieurs fois cette option)
  • -threads 0 : permet d'utiliser tous les CPU
  • -deinterlace : si la vidéo est entrelacé

Pour les appareils et lecteurs ne supportant pas les fonctionnalités les plus avancées de h264, il est conseillé d'utiliser le preset "main" (voir "baseline") en plus du preset de rapidité.

encodage visant une qualité

ffmpeg -i video.vob -an -vcodec libx264 -vpre slow -crf 20 -threads 0 -vf crop=720:576:0:0 video.avi

Étape 6 – construction du fichier MKV final

En ligne de commande

Dans cette dernière étape, nous allons coller tous les morceaux ensemble pour former le fichier final. Cette opération est appelée « multiplexage ». Pour y parvenir, une interface graphique existe. Elle est ouverte par les commandes mmg ou mkvmerge-gui fournies respectivement par les packages <package>mkvtoolnix</package> et <package>mkvtoolnix-gui</package>. Comme c'est souvent le cas dans l'univers GNU/Linux, cette interface permet la construction automatique du jeu d'options beaucoup moins faciles à retenir de la commande mkvmerge, sachant que cette dernière peut être utilisée directement en s'affranchissant de l'interface graphique. Cette section donne un exemple d'utilisation d'une telle commande avec la liste des options usuelles.

Exemple simple: construction d'un fichier video.mkv contenant un flux vidéo x264, 1 flux audio Ogg Vorbis, sans sous-titre et un index de chapitres

mkvmerge -o "video.mkv" --title "Ma Video" \
-d 0 -A -S video.avi \
--language 0:fre --default-track 0:yes -a 0 -D -S audio.ogg \
--chapters chapters.txt

Exemple plus complexe: construction d'un fichier video.mkv contenant un flux vidéo x264, 2 flux audio Ogg Vorbis (un français et un anglais), 2 langues de sous-titres (français et anglais) et un index de chapitres. Chacun de ces éléments a été obtenu selon les explications des sections précédentes.

mkvmerge -o "/media/disk/tmp/video.mkv" --title 'Ma Video' \
-d 0 -A -S /media/disk/tmp/video.avi \
--language 0:fre --default-track 0:yes -a 0 -D -S /media/disk/tmp/audio129.ogg \
--language 0:eng --default-track 0:no -a 0 -D -S /media/disk/tmp/audio128.ogg \
--language 0:fre -s 0 -D -A /media/disk/tmp/subtitlesfr.idx \
--language 0:eng -s 0 -D -A /media/disk/tmp/subtitlesen.idx \
--track-order 0:0,1:0,2:0,3:0,4:0 --chapters /media/disk/tmp/chapitres.txt

Voici la signification des options générales :

  • -o <fichier.mkv> : nom du fichier de sortie. Le nom peut être absolu (avec toute l'arborescence) ou relatif. Dans notre exemple, nous créons le fichier video.mkv.
  • --track-order <FileID1:TID1,FileID2:TID2,FileID3:TID3,...> : nous avons une liste de couples <FileIDn:TIDm> (c'est-à-dire des couples d'identifiants de fichiers et de plages) séparés par des virgules. Dans notre exemple, nous avons une plage avec 5 fichiers utilisés (hors index de chapitres).
  • --chapters <fichier.txt> : donne le nom du fichier d'index de chapitres à utiliser (si toutefois nous souhaitons inclure un tel index).
  • --title <Ma Video> : donne un titre au media.

Pour les différents flux, voici les options (syntaxe de type "[options] fichier_de_flux") :

  • -a <n> : ajout d'un flux audio à la plage n (plage 0 dans cas).
  • -d <n> : ajout d'un flux vidéo à la plage n.
  • -s <n> : ajout de sous-titres à la plage n.
  • -A : pas de flux audio.
  • -D : pas de flux vidéo.
  • -S : pas de sous-titres.
  • --language <trackID:langue> : réglage de la langue pour le flux (audio et sous-titres par exemple) de la page trackID.
  • --default-track <trackID:booléen> : réglage par défaut ou non du flux pour la page trackID. Il est ainsi possible de définir quel flux audio sera celui par défaut.

Je vous invite toutefois à parcourir la longue liste d'options de mkvmerge afin d'en appréhender tout le potentiel.

mkvmerge --help

Avec l'interface graphique

Démarrez la MkvMergeGUI :

mmg

Input

Dans le premier onglet − input − ajoutez la vidéo, les pistes audio et les pistes de sous-titres, de préférence dans l'ordre que vous souhaitez établir par défaut. Sélectionnez ensuite chacune des pistes audio dans la liste Tracks et définissez en la langue. Donnez leur éventuellement un titre.

Il se peut que les pistes audio et vidéo n'aient pas la même durée. Cela risque d'introduire un gros décalage entre la bande vidéo et la bande son. Vous pouvez heureusement décaler la bande son dans le "sous onglet" Format Specific Options en indiquant ce décalage dans le champ Delay (en millisecondes).

Sélectionnez les pistes de sous-titres, définissez en la langue et choisissez le format de compression zlib. Redirigez éventuellement la sortie avec le champ Output filename.

Attachments

Dans cet onglet, vous pouvez ajoutez l'affiche du film, la couverture du boitier DVD, le synopsis du film dans un fichier texte, etc. Tout ce qui se trouve dans cet onglet est optionnel. N'oubliez pas de bien préciser le type mime de chacun des fichiers joints. Global

Dans le champ File/segment title, renseignez le titre du film. Dans le champ Chapter file, parcourez l'arborescence pour y ajouter votre fichier de chapitrage du DVD. Précisez en juste en dessous la langue. Si votre fichier est en XML, précisez l'encodage utilisé (généralement utf-8 pour le XML). Start Muxing

Appuyez sur le bouton Start Muxing

Quelques dizaines de secondes plus tard, votre fichier mkv est prêt : il contient un film avec une image qualité DVD, plusieurs bandes sons, plusieurs pistes de sous-titres et un chapitrage complet du film.