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

7.3.1. Codecs vidéo de libavcodec

Nom du codec vidéoDescription
mjpeg Motion JPEG
ljpeg JPEG sans perte
jpeglsJPEG LS
targaimage Targa
gifimage GIF
bmpimage BMP
pngimage PNG
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
ffvhuffFFmpeg huffyuv sans perte modifié
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
flashsvFlash Screen Video
dvvideo Vidéo Numérique Sony
snow codec basé sur l'ondelette expérimentale de FFmpeg
zmbvZip Motion Blocks Video
dnxhdAVID DNxHD

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

7.3.2. Codecs audio de libavcodec

Nom de codec audioDescription
ac3AC-3, AKA Dolby Digital
adpcm_*formats PCM adaptatif - se reporter au tableau complémentaire
flacFree Lossless Audio Codec (FLAC)
g726G.726 ADPCM
libamr_nb3GPP Adaptive Multi-Rate (AMR) narrow-band
libamr_wb3GPP Adaptive Multi-Rate (AMR) wide-band
libfaacAdvanced Audio Coding (AAC) - utilisant FAAC
libgsmETSI GSM 06.10 full rate
libgsm_msMicrosoft GSM
libmp3lameMPEG-1 audio layer 3 (MP3) - utilisant LAME
mp2MPEG-1 audio Layer 2(MP2)
pcm_*formats PCM - se reporter au tableau complémentaire
roq_dpcmId Software RoQ DPCM
soniccodec avec perte expérimental FFmpeg
soniclscodec sans perte expérimental FFmpeg
vorbisVorbis
wmav1Windows Media Audio v1
wmav2Windows Media Audio v2

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 AC-3 :

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.

7.3.2.1. tableau complémentaire des formats PCM/ADPCM

nom du codec PCM/ADPCMDescription
pcm_s32lesigned 32-bit little-endian
pcm_s32besigned 32-bit big-endian
pcm_u32leunsigned 32-bit little-endian
pcm_u32beunsigned 32-bit big-endian
pcm_s24lesigned 24-bit little-endian
pcm_s24besigned 24-bit big-endian
pcm_u24leunsigned 24-bit little-endian
pcm_u24beunsigned 24-bit big-endian
pcm_s16lesigned 16-bit little-endian
pcm_s16besigned 16-bit big-endian
pcm_u16leunsigned 16-bit little-endian
pcm_u16beunsigned 16-bit big-endian
pcm_s8signed 8-bit
pcm_u8unsigned 8-bit
pcm_alawG.711 A-LAW
pcm_mulawG.711 μ-LAW
pcm_s24daudsigned 24-bit D-Cinema Audio format
pcm_zorkActivision Zork Nemesis
adpcm_ima_qtApple QuickTime
adpcm_ima_wavMicrosoft/IBM WAVE
adpcm_ima_dk3Duck DK3
adpcm_ima_dk4Duck DK4
adpcm_ima_wsWestwood Studios
adpcm_ima_smjpegSDL Motion JPEG
adpcm_msMicrosoft
adpcm_4xm4X Technologies
adpcm_xaPhillips Yellow Book CD-ROM eXtended Architecture
adpcm_eaElectronic Arts
adpcm_ctCreative 16->4-bit
adpcm_swfAdobe Shockwave Flash
adpcm_yamahaYamaha
adpcm_sbpro_4Creative VOC SoundBlaster Pro 8->4-bit
adpcm_sbpro_3Creative VOC SoundBlaster Pro 8->2.6-bit
adpcm_sbpro_2Creative VOC SoundBlaster Pro 8->2-bit
adpcm_thpNintendo GameCube FMV THP
adpcm_adxSega/CRI ADX

7.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 les plans de luminance et 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.

7.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.

DescriptionOptions d'encodagevitesse (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=26im/s0dB
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:turbo15im/s-0.5dB
Rapidevcodec=mpeg4:mbd=2:trell:v4mv:turbo42im/s-0.74dB
Temps réelvcodec=mpeg4:mbd=2:turbo54im/s-1.21dB

7.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

7.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 -o Harry_Potter_2.avi -ovc lavc \
  -lavcopts vcodec=mpeg4:vbitrate=2400:v4mv:mbd=2:trell:cmp=3:subcmp=3:autoaspect:vpass=1 \
  -vf pullup,softskip,crop=720:352:0:62,hqdn3d=2:1:2

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 -o Harry_Potter_2.avi -ovc lavc \
  -lavcopts vcodec=mpeg4:vbitrate=2400:v4mv:mbd=2:trell:cmp=3:subcmp=3:autoaspect:vpass=2 \
  -vf pullup,softskip,crop=720:352:0:62,hqdn3d=2:1:2

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 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