libavcodec
fournit un encodage simple pour plusieurs formats vidéos et audios intéressants.
Vous pouvez encoder vers les codecs suivant (la liste suivante est plus ou moins à jour):
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
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 audios ne font pas un usage intelligents des bits qu'on leur donne
vu qu'ils ont des modèles psycho-acoustique minimaux (quand ils en ont)
ce que la plupart des autres implémentations de codec comportent.
Cependant, notez que tous ces codecs audios sont très rapides et fonctionnent en dehors
de 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.
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: pre-passage 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 contre-partie. 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 agraver 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 coefficent 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 log 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 psychovisuelle. 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.
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 ciblé é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 |
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:
$ mencoderinput.avi
-ooutput.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
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 verez 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ésentrelacez-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 anti-bruit, 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, pourrez-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