14.3. Encodage avec la famille de codec libavcodec

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

## 14.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):

### 14.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, 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 donnés après la configuration de `vcodec`, par exemple comme ceci: `-lavcopts vcodec=msmpeg4`

Un exemple avec la compression MJPEG:

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

### 14.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 de codec qui doivent être donnés après l'option `acodec`, par exemple 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`, ses codecs audio ne font pas un usage avisé des bits qu'ils consomment car ils leur manquent certains modèles psycho-acoustiques minimaux (quand ils en ont) ce que la plupart des autres implémentations de codecs possèdent. Cependant, notez que tous ces codecs audio sont très rapides et sont disponibles à partir du moment où MEncoder a été compilé avec `libavcodec` (ce qui est le cas la plupart du temps), et ne dépend pas de bibliothèques externes.

### 14.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 difficile à implémenter car les différentes options d'encodage donnent des résultats de qualité différents en fonction du matériel source. Ceci vient du fait que la compression dépend 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 omises, comme `mbd=2`, `trell`, et `v4mv`. Voir ci-dessous pour une description détaillée des options d'encodage les plus communes.

Options à régler:

- vmax_b_frames: 1 ou 2 est bon selon le film. Notez que si vous avez besoin d'avoir votre encodage 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 pour les scènes avec beaucoup de mouvement. Sur certaines vidéos, l'option vmax_b_frames peut affecter la qualité, mais utiliser vmax_b_frames=2 avec vb_strategy=1 aide.

- dia: portée de la passe de recherche de mouvement. Plus la valeur de cette option est élevée, meilleure sera la qualité et plus l'encodage sera lent. Les valeurs négatives représentent une échelle complètement différente. De bonnes valeurs sont -1 pour un encodage rapide, ou 2-4 pour un plus lent.

- predia: portée de recherche de mouvement en pré-passe. Pas aussi important que dia. De bonnes valeurs vont de 1 (par défaut) à 4. Cela requière preme=2 pour être réellement utile.

- cmp, subcmp, precmp: Fonction de comparaison pour l'estimation de mouvement. Testez avec les valeurs 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 films d'action. 6 peut être (ou non) un peu meilleur, mais est lent.

- last_pred: Nombre de prédicteurs de mouvement à prendre depuis l'image précédente. 1-3 (ou dans ces eaux) améliore la qualité pratiquement sans perte en vitesse. De plus hautes valeurs ralentiront l'encodage sans réel gain.

- 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é des macroblocs. Peut aider ou gêner selon la vidéo et les autres options. Cela peut causer des artefacts à moins que vous ne paramétriez vqmax à des 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. Avec cette option, l'encodeur minimise le bruit dû aux artefacts de compression au lieu de faire correspondre strictement la vidéo encodée à la source. Ne l'utilisez pas à moins d'avoir déjà peaufiné tout le reste et que les résultats ne soient pas encore assez bons.

- vqcomp: mise au point du contrôle de débit. La nature du film définiera quelles sont les bonnes valeurs à appliquer Vous pouvez sans problème laisser cette option 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. recommandé: 0.5-0.7).

- vlelim, vcelim: Définit le coefficient du seuil d'élimination pour la luminance et les plans de chrominance. Ils sont encodés séparément dans tous les algorithmes de style MPEG. L'idée derrière tout ceci est d'utiliser de 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 économise des bits et accélére peut-être l'encodage. vlelim=-4 et vcelim=9 semblent être de bonnes valeurs pour les films de "scènes réelles", mais semblent ne pas aider avec les films d'animation; quand vous voudrez encoder une animation, vous devriez probablement les laisser tel quel.

- qpel: Estimation de mouvement de quart de pixel. MPEG-4 utilise une précision d'un demi pixel pour sa recherche de mouvement par défaut, donc cette option augmente la quantité d'information qui est stockée dans le fichier encodé. Le gain ou la perte en terme de compression dépend du film, mais ce n'est habituellement pas très efficace pour les animations. qpel induit toujours un surcoût significatif en temps de décodage (+25% en pratique).

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

Options qu'il n'est pas recommandé de changer:

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

- 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, ceci reste très subjectif.

- scplx_mask: Essaie d'empêcher l'apparition d'artefacts dûs aux blocs, mais le post-traitement est plus efficace.

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

Les paramètrages suivants sont des exemples de différentes combinaisons d'options d'encodage qui affectent le compromis vitesse / qualité pour un débit donné.

Tous les paramètrages d'encodage ont été testés sur un échantillon vidéo de résolution 720x448 à 30000/1001 images par seconde, le débit cible était de 900kbit/s, et la machine était un AMD-64 3400+ à 2400 MHz en mode 64 bits. Chaque exemple d'encodage est donné avec la vitesse d'encodage mesurée (en images par seconde) et la perte en PSNR (en dB) par rapport au réglage de "très haute qualité". Sachez que selon votre video source, votre machine et les derniers développements, vous pourrez obtenir des résultats très différents.

Description | Options d'encodage | vitesse (en images/s) | perte relative de PSNR (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` | 6im/s | 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` | 15im/s | -0.5dB
Rapide | `vcodec=mpeg4:mbd=2:trell:v4mv:turbo` | 42im/s | -0.74dB
Temps réel | `vcodec=mpeg4:mbd=2:turbo` | 54im/s | -1.21dB

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

Grâce à cette fonctionnalité de `libavcodec` vous pouvez rentrer des matrices personnalisées inter (image I ou images clé) et intra (image P ou image prédite). De nombreux codecs le supportent - 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 entree.avi -o sortie.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

### 14.3.6. Exemple

Voilà, vous venez tout juste d'acheter votre exemplaire de 'Harry Potter et la Chambre des Secrets' (édition panoramique, bien sûr), et vous voulez copier ce DVD 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 l'option `-ofps 24000/1001` (parce que le le nombre d'images par seconde en sortie est le même que celui en entrée), et bien sûr les dimensions de recadrage seront différentes.

Après avoir lancé `mplayer dvd://1`, nous suivons le processus détaillé dans la section Comment gérer le téléciné et l'entrelacement dans les DVDs NTSC et découvrons que c'est une vidéo progressive à 24000/1001 images par seconde, ce qui signifie que nous n'avons pas besoin d'utiliser de filtre téléciné-inverse, 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

Assurez-vous que vous visualisez une image 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)

Revisionnons 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 a l'air 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 la partie centrale. 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 augmentons le décalage vertical 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. Si votre vidéo est télécinée, assurez-vous que le filtre `pullup` (ou n'importe quel autre filtre téléciné-inverse que vous avez décidé d'utiliser) apparaissent dans la chaîne de filtres avant que vous ne recadriez. Si il est entrelacé, désentrelacez-le avant le recadrage. (Si vous choisissez de préserver la vidéo entrelacée, alors assurez-vous que votre décalage vertical de recadrage est un multiple de 4.)

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

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

Réduire la taille de 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 débit). Le recadrage enlève quand à lui complétement les pixels à l'extérieur du nouveau cadrage. C'est un compromis dont vous devrez tenir compte selon les circonstances. Par exemple, si une vidéo DVD a été faite pour la télévision, vous pourriez vouloir éviter le redimensionnement vertical, étant donné que l'échantillon de lignes correspond à la manière avec laquelle le contenu a été enregistré.

En inspectant le film, nous voyons qu'il contient une bonne quantité d'action et beaucoup de détails, donc nous choisissons un débit de 2400Kb/s.

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

    mencoder dvd://1 -ofps 24000/1001 -oac copy -vf pullup,softskip,crop=720:352:0:62,hqdn3d=2:1:2 -ovc lavc \
    -lvcopts 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 pullup,softskip,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 prix d'une plus longue durée d'encodage. Il y a peu de raison de ne pas utiliser ces options quand le but premier est la qualité. Les options `cmp=3:subcmp=3:mbcmp=3` sélectionne une fonction de comparaison qui donne une meilleure qualité que celle par défaut. Vous pouvez essayer de faire varier ces paramètres (reportez-vous à la page man pour les valeurs possibles) étant donné que différentes fonctions peuvent avoir un impact important sur la qualité selon le matériel source. Par exemple, si vous trouvez que `libavcodec` produit trop d'artefacts de blocs, vous pouvez essayer de choisir la fonction de comparaison expérimentale NSSE via `*cmp=10`.

Pour ce film, le AVI résultant durera 138 minutes et pèsera à peu près 3GB. Et puisque vous disiez que la taille du fichier ne comptait pas, cette taille est parfaitement acceptable. Cependant, si vous l'aviez voulu plus petite, vous pourriez essayer un débit inférieur. L'augmentation du débit améliore la qualité, mais de moins en moins, ainsi, tandis que nous pourrions clairement voir une amélioration de 1800Kb/s à 2000Kb/s, cela peut ne pas être notable au-dessus de 2000Kb/s. Libre à vous d'expérimenter jusqu'à totale satisfaction.

Parce que nous avons passé la source vidéo au travers d'un filtre antibruit, vous pourriez vouloir 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 de bloc de la vidéo. Avec l'option `autoq` de MPlayer, vous pouvez faire varier le montant de post-traitement effectué par le filtre spp en fonction de la disponibilté de votre processeur. Aussi, arrivé à ce point, vous pourriez vouloir appliquer une correction gamma et/ou couleur pour convenir au mieux à votre écran. Par exemple:

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

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