13.3. Encodage avec la famille de codec `libavcodec`
Précédent | Chapitre 13. L'encodage avec MEncoder | Suivant

## 13.3. Encodage avec la famille de codec `libavcodec`

`libavcodec` fournit un encodage simple pour plusieurs formats vidéos et audio intéressants. Vous pouvez encoder vers les codecs suivant (la liste suivante est plus ou moins à jour):

### 13.3.1. codecs vidéo de `libavcodec`

Nom du codec vidéo | Description
--- | ---
mjpeg | Motion JPEG
ljpeg | JPEG sans perte
h261 | H.261
h263 | H.263
h263p | H.263+
mpeg4 | ISO standard MPEG-4 (DivX 5, compatible XviD)
msmpeg4 | pre-standard MPEG-4 variant par MS, v3 (AKA DivX3)
msmpeg4v2 | pre-standard MPEG-4 by MS, v2 (utilisé dans les vieux fichiers ASF)
wmv1 | Windows Media Vidéo, version 1 (AKA WMV7)
wmv2 | Windows Media Vidéo, version 2 (AKA WMV8)
rv10 | RealVidéo 1.0
rv20 | RealVidéo 2.0
mpeg1vidéo | MPEG-1 vidéo
mpeg2vidéo | MPEG-2 vidéo
huffyuv | compression sans perte
asv1 | ASUS Vidéo v1
asv2 | ASUS Vidéo v2
ffv1 | codec vidéo sans perte de FFmpeg
svq1 | Sorenson vidéo 1
flv | Sorenson H.263 utilisé dans Vidéo Flash
dvvideo | Vidéo Numérique Sony
snow | codec basé sur l'ondelette expérimentale de FFmpeg

La première colonne contient les noms de codec qui doivent être passés après la configuration de `vcodec`, comme ceci: `-lavcopts vcodec=msmpeg4`

Un exemple avec la compression MJPEG:

    mencoder dvd://2 -o title2.avi -ovc lavc -lavcopts vcodec=mjpeg -oac copy

### 13.3.2. Codecs audio de `libavcodec`=

Nom de codec audio | Description
--- | ---
mp2 | MPEG Layer 2
ac3 | AC3, AKA Dolby Digital
adpcm_ima_wav | IMA adaptatif PCM (4 bits par échantillon, compression 4:1)
sonic | codec avec/sans perte expérimental

La première colonne contient les noms du codec qui devra être passée après l'option `acodec`, comme ceci: `-lavcopts acodec=ac3`

Un exemple avec compression AC3:

    mencoder dvd://2 -o title2.avi -oac lavc -lavcopts acodec=ac3 -ovc copy

Contrairement aux codecs vidéo de `libavcodec`, ces codecs audio ne font pas un usage intelligents des bits qu'on leur donne vu qu'ils ont des modèles psycho-accoustiques minimaux (quand ils en ont) ce que la plupart des autres implémentations de codec comportent. Cependant, notez que tous ces codecs audio sont très rapides et fonctionnent qu'importe leur environnement à partir du moment où MEncoder a été compilée avec `libavcodec` (ce qui est le cas la plupart du temps), et ne dépend pas de bibliothèques externes.

### 13.3.3. Options d'encodage de libavcodec

Idéalement, vous voudriez probablement juste dire à mencoder de passer en mode "haute qualité" et passer à autre chose. Ce serait sûrement sympa, mais c'est malheureusement dur à faire vu que les différentes options d'encodage donnent différents résultats de qualité en fonction du matériel source. Ceci vient du fait que la compression dépende des propriétés visuelles de la vidéo en question. Par exemple, un film d'animation et un film d'action ont des propriétés très différentes et nécessitent des options différentes pour obtenir un encodage optimal. La bonne nouvelle, c'est que certaines options ne devraient jamais être mise à part, comme `mbd=2`, `trell`, et `v4mv`. Voir ci-dessous pour une description détaillée des options d'encodage communes.

Options à régler:

- vmax_b_frames: 1 ou 2 est bon selon le film. Notez que si vous avez besoin d'avoir votre encodeur décodable par DivX5, vous aurez besoin d'activer le support closed GOP, en utilisant l'option `cgop` de `libavcodec`, mais vous aurez besoin de désactiver la détection de scène, ce qui n'est pas une bonne idée étant donné que cela affectera un peu l'efficacité d'encodage.

- vb_strategy=1: aide aux scènes avec de rapides mouvements. Sur certaines vidéos, vmax_b_frames peut affecter la qualité, mais vmax_b_frames=2 avec vb_strategy=1 aideront.

- dia: portée de recherche de mouvement. Le plus large est l'écart; ce sera mieux, mais aussi plus lent. Des valeurs négatives sont une échelle complètement différente. De bonnes valeurs sont -1 pour un encodage rapide, ou 2-4 pour un plus lent.

- predia: pré-passe de recherche de mouvement. Pas aussi important que dia. De bonnes valeurs sont 1 (par défaut) à 4. Cela demande preme=2 pour être vraiment utile.

- cmp, subcmp, precmp: Fonction de comparaison pour l'estimation de mouvement. Testez avec des valeurs de 0 (défaut), 2 (hadamard), 3 (dct), et 6 (taux de distorsion). 0 est le plus rapide, et suffisant pour precmp. Pour cmp et subcmp, 2 est bon pour les animations, et 3 est bon pour les actions en direct. 6 peut-être ou non un peu mieux, mais c'est lent.

- last_pred: Nombre de prédicateurs de mouvement à prendre depuis la frame précédente. 1-3 (ou dans ces eaux) améliore la vitesse de l'encodage quasiment sans contrepartie. De plus hautes valeurs ralentiront sans avoir de gain réel.

- cbp, mv0: Contrôle la sélection de macroblocs. Un petit coût en vitesse pour un petit gain en qualité.

- qprd: quantification adaptative basée sur la complexité du macrobloc. Peut aider ou aggraver la situation ceci dépend de la vidéo et des autres options. Cela peut causer des artefacts à moins que vous ne paramétriez vqmax à certaines valeurs raisonnablement petites (6 c'est bien, voire peut-être 4); vqmin=1 devrait aussi aider.

- qns: très lente, spécialement quand combinée avec qprd. Cette option dira l'encodeur à minimiser le bruit dû à la compression d'artefact au lieu de faire strictement ressembler la vidéo encodée à la source. N'utilisez pas ceci à moins d'avoir déjà bidouillé tout ce qui est possible et que les résultats ne sont pas encore assez bons.

- vqcomp: Bidouille du contrôle de taux. Quelles sont les bonnes valeurs qui dépendent du film? Vous pouvez de manière sûre laisser cela de côté si vous voulez. Réduire vqcomp met plus de bits sur les scènes de basse complexité, l'augmenter les met sur les scènes de haute complexité (défaut: 0.5, portée: 0-1. portée recommandée: 0.5-0.7).

- vlelim, vcelim: Paramètre le seuil du seul coefficient d'élimination pour les plans de luminance et de chroma. Ceux-là sont encodés séparément dans tous les algorithmes de style MPEG. L'idée derrière tout ceci est d'utiliser certaines bonnes heuristiques pour déterminer quand le changement dans un bloc est inférieur au seuil que vous avez spécifié, et dans ce cas, de simplement encoder le bloc comme étant "sans changement". Cela économisera des bits et accélérera peut-être l'encodage. vlelim=-4 et vcelim=9 semblent être de bonnes valeurs pour les films en direct, mais semblent ne pas aider avec les animations; quand vous voudrez encoder une animation, vous devrez probablement les laisser inchangés.

- qpel: Estimation de mouvement de quart de pixel. MPEG-4 utilise la précision de moitié de pixel pour sa recherche de mouvement par défaut, donc cette option vient avec un surplus car plus d'information seront stockées dans le fichier encodé. La compression gain/perte dépend du film, mais n'est habituellement pas très efficace sur les animations. qpel induit toujours un surcoût significatif dans le temps de décodage du CPU (+25% en pratique).

- psnr: n'affecte pas l'encodage courant, mais écrit un fichier journal donnant le type/taille/qualité de chaque frame, et imprime un résumé du PSNR (rapport maximal du signal sur le bruit) à la fin.

Options à éviter:

- vme: La valeur par défaut est la mieux.

- lumi_mask, dark_mask: Quantification adaptative pyscho-visuelle. Vous ne voulez pas jouer avec ces options si vous tenez à la qualité. Des valeurs raisonnables peuvent être efficaces dans votre cas, mais soyez prévenu que ceci reste très subjectif.

- scplx_mask: Essaie d'éviter l'apparition d'artefacts carrés, mais le post-traitement est le mieux.

### 13.3.4. Exemples de paramètres d'encodage

Les paramètres suivant sont des exemples de combinaisons d'option de différents encodages qui affectent la vitesse et la qualité pour un bitrate donné.

Tous les paramètres d'encodage sont testés sur un échantillon de vidéo de 720x448 @30000/1001 fps, le bitrate cible était 900kbps, et la machine était un AMD-64 3400+ à 2400 Mhz en mode 64 bits. Chaque paramètre d'encodage comporte la mesure de vitesse d'encodage (en frames par seconde) et la perte PSNR (en dB) comparé au paramètre de "très haute qualité". Sachez que selon votre source, votre machine et les derniers développements, vous pourrez obtenir des résultats très différents.

Description | Options d'encodage | vitesse (en fps) | perte PSNR relative (en dB)
--- | --- | --- | ---
Très haute qualité | `vcodec=mpeg4:mbd=2:mv0:trell:v4mv:cbp:last_pred=3:predia=2:dia=2:vmax_b_frames=2:vb_strategy=1:precmp=2:cmp=2:subcmp=2:preme=2:qns=2` | 6fps | 0dB
Haute qualité | `vcodec=mpeg4:mbd=2:trell:v4mv:last_pred=2:dia=-1:vmax_b_frames=2:vb_strategy=1:cmp=3:subcmp=3:precmp=0:vqcomp=0.6:turbo` | 15fps | -0.5dB
Rapide | `vcodec=mpeg4:mbd=2:trell:v4mv:turbo` | 42fps | -0.74dB
Temps réel | `vcodec=mpeg4:mbd=2:turbo` | 54fps | -1.21dB

### 13.3.5. Matrices inter/intra personnalisées

Avec cette fonctionnalité de `libavcodec` vous pouvez rentrer des matrices personnalisées inter (I-frames/frames clé) et intra (P-frames/frames prévu). La plupart des codecs supporte ceci - on rapporte que `mpeg1video` et `mpeg2video` fonctionnent avec.

Cette fonctionnalité est utilisée habituellement pour régler les matrices utilisées par les spécifications KVCD.

La Matrice de Quantification KVCD "Notch" :

Intra:

     8  9 12 22 26 27 29 34
     9 10 14 26 27 29 34 37
    12 14 18 27 29 34 37 38
    22 26 27 31 36 37 38 40
    26 27 29 36 39 38 40 48
    27 29 34 37 38 40 48 58
    29 34 37 38 40 48 58 69
    34 37 38 40 48 58 69 79

Inter:

    16 18 20 22 24 26 28 30
    18 20 22 24 26 28 30 32
    20 22 24 26 28 30 32 34
    22 24 26 30 32 32 34 36
    24 26 28 32 34 34 36 38
    26 28 30 32 34 36 38 40
    28 30 32 34 36 38 42 42
    30 32 34 36 38 40 42 44

Utilisation:

    $ mencoder input.avi -o output.avi -oac copy -ovc lavc -lavcopts inter_matrix=...:intra_matrix=...

    $ mencoder input.avi -ovc lavc -lavcopts
    vcodec=mpeg2video:intra_matrix=8,9,12,22,26,27,29,34,9,10,14,26,27,29,34,37,
    12,14,18,27,29,34,37,38,22,26,27,31,36,37,38,40,26,27,29,36,39,38,40,48,27,
    29,34,37,38,40,48,58,29,34,37,38,40,48,58,69,34,37,38,40,48,58,69,79
    :inter_matrix=16,18,20,22,24,26,28,30,18,20,22,24,26,28,30,32,20,22,24,26,
    28,30,32,34,22,24,26,30,32,32,34,36,24,26,28,32,34,34,36,38,26,28,30,32,34,
    36,38,40,28,30,32,34,36,38,42,42,30,32,34,36,38,40,42,44 -oac copy -o svcd.mpg

### 13.3.6. Exemple

Voilà, vous venez tout juste d'acheter votre exemplaire de 'Harry Potter et la Chambre des Secrets' (édition écran large, bien sûr), et vous voulez ripper ce DVD ceci afin de pouvoir l'ajouter à votre PC Home Cinéma. C'est un DVD de région 1, donc en NTSC. L'exemple ci-dessous peut quand même être adapté au PAL, si ce n'est que vous devrez retirer `-ofps 24000/1001` (parce que le framerate de sortie est le même que celui en entrée), et bien sûr les dimensions de découpage seront différentes.

Après avoir lancé `mplayer dvd://1`, nous suivons le processus détaillé dans la section Comment traiter le téléciné et l'entrelacement dans les DVDs NTSC et découvrir que c'est une vidéo progressive en 24000/1001 fps, ce qui signifie que nous n'aurons pas besoin d'utiliser un filtre inverse téléciné, comme `pullup` ou `filmdint`.

Ensuite, nous voulons déterminer le rectangle de recadrage approprié, donc nous utilisons le filtre cropdetect:

    mplayer dvd://1 -vf cropdetect

Cherchez une frame complètement remplie (comme une scène lumineuse), et vous verrez dans la console de sortie de MPlayer:

    crop area: X: 0..719  Y: 57..419  (-vf crop=720:362:0:58)

Rejouons ensuite le film avec le filtre pour tester le résultat:

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

Et nous nous apercevons que tout est parfait. Ensuite, nous nous assurons que la hauteur et la largeur sont des multiples de 16. La largeur est bonne, cependant la hauteur ne l'est pas. Vu que nous avons quelques notions minimales de maths, nous savons que le plus proche multiple de 16 inférieur à 362 est 352.

Nous pourrions juste utiliser `crop=720:352:0:58`, mais il serait mieux d'enlever un peu du haut et un peu du bas afin de garder le centre. Nous avons rétréci la hauteur de 10 pixels, mais nous ne voulons pas augmenter le décalage de 5 pixels vu que c'est un nombre impair et que cela affectera défavorablement la qualité. A la place, nous augmenterons le décalage y de 4 pixels:

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

Une autre raison pour retirer les pixels du haut et du bas est que nous nous assurons que nous avons éliminé tous les pixels à moitié noir s'ils existent. Notez que si votre vidéo est télécinée, assurez-vous que le filtre `pullup` (ou quelque soit le filtre inverse téléciné que vous avez décidé d'utiliser) apparaissent dans la chaîne de filtres avant que vous découpiez. Si il est entrelacé, dés-entrelacez-le avant découpage. (Si vous choisissez de préserver la vidéo entrelacée, alors soyez certain que votre décalage de découpage vertical est un multiple de 4.)

Si la perte de ces 10 pixels vous peine, vous pouvez, au lieu de réduire les dimensions, prendre le plus proche multiple de 16. La chaîne de filtres ressemblerait à ceci:

    -vf crop=720:362:0:58,scale=720:352

Réduire la vidéo comme cela signifie qu'une petite quantité de détails est perdu bien que cela ne soit probablement pas perceptible. Augmenter la taille entraînera une qualité inférieure (à moins que vous n'augmentiez le bitrate). Le redimensionnement sauvera l'ensemble de ces pixels. C'est une différence que vous voudrez prendre en compte à chaque circonstance. Par exemple, si le DVD vidéo était fait pour la télévision, vous pourriez avoir intérêt à éviter le redimensionnement vertical, étant donné que la ligne d'échantillons correspond à la manière d'origine avec laquelle le contenu a été enregistré.

Après vérification, nous voyons que notre film a un peu d'action et beaucoup de détails, donc nous prenons 2400Kbit pour notre bitrate.

Nous sommes maintenant prêts à faire les deux passes d'encodage. Première passe:

    mencoder dvd://1 -ofps 24000/1001 -oac copy -vf crop=720:352:0:62,hqdn3d=2:1:2 -ovc lavc \
    -lavcopts vcodec=mpeg4:vbitrate=2400:v4mv:mbd=2:trell:cmp=3:subcmp=3:mbcmp=3:autoaspect:vpass=1 \
    -o Harry_Potter_2.avi

La seconde passe est la même, si ce n'est que nous spécifions `vpass=2`:

    mencoder dvd://1 -ofps 24000/1001 -oac copy -vf crop=720:352:0:62,hqdn3d=2:1:2 -ovc lavc \
    -lavcopts vcodec=mpeg4:vbitrate=2400:v4mv:mbd=2:trell:cmp=3:subcmp=3:mbcmp=3:autoaspect:vpass=2 \
    -o Harry_Potter_2.avi

Les options `v4mv:mbd=2:trell` augmenteront considérablement la qualité au dépend de la durée d'encodage. Il y a peu de raison de ne pas prendre en compte ces options quand le but premier est la qualité. Les options `cmp=3:subcmp=3:mbcmp=3` choisissent une fonction de comparaison qui rend une plus haute qualité que celle par défaut. Vous pouvez tenter d'expérimenter avec ces paramètres (reportez-vous à la page man pour les valeurs possibles) étant donné que différentes fonctions peuvent avoir un large impact sur la qualité selon le matériel source. Par exemple, si vous trouvez que `libavcodec` produit trop d'artefacts carrés, vous pouvez essayer de choisir le NSSE expérimental comme fonction de comparaison via `*cmp=10`.

Pour ce film, le AVI résultant durera 138 minutes et pèsera à peu près 3GB. Si vous disiez que la taille du fichier n'était pas importante, cette taille est parfaitement acceptable. Cependant, si vous la souhaitez plus petite, vous pouvez essayer un bitrate inférieur. Les augmentations de bitrates ont des effets amoindris, tandis que nous pourrons clairement voir une amélioration à partir de 1800Kbit jusqu'à 2000Kbit, cela ne semblera pas tellement rentable notablement au-dessus de 2000Kbit. Libre à vous d'expérimenter jusqu'à totale satisfaction.

Parce que nous avons passé la source vidéo au travers d'un filtre antibruit, vous aimerez en rajouter un peu pendant la lecture. Ceci, avec le filtre de post-traitement `spp`, améliore de façon radicale la perception de qualité et aide à éliminer les artefacts carrés de la vidéo. Avec l'option `autoq` de MPlayer, vous pouvez faire varier le montant de post-traitement achevé par le filtre spp selon le CPU disponible. Aussi, à ce point, pourriez-vous vouloir demander une correction gamma et/ou couleur qui convient mieux à l'affichage. Par exemple:

    mplayer Harry_Potter_2.avi -vf spp,noise=9ah:5ah,eq2=1.2 -autoq 3

Précédent | Niveau supérieur | Suivant
13.2. Comment gérer le téléciné et l'entrelacement des DVDs NTSC | Sommaire | 13.4. Encodé avec le codec `XviD`