NON RESPECT DE LA TAILLE FINALE DEMANDEEAu fil de mes différentes lectures (sur Doom et UV), et le post que l’on avait fait Jack et moi à ce sujet ayant disparu, re-voilà une explication des phénomènes d’Undersize et d’Oversize générés par le codec XviD.
Undersize : Le fichier encodé par le XviD est plus petit que le fichier demandé
Oversize : Le fichier encodé par le XviD est plus grand que le fichier demandé
Il faut savoir que les écarts peuvent être sur plusieurs dizaines de Mo (voire centaines de Mo).
J’espère que ma part d’interprétation personnelle des phénomènes est faible et que les explications ci-dessous soient le reflet de la réalité. Je me suis inspiré de ces 2 posts :
http://forum.doom9.org/showthread.php?threadid=92046http://forum.doom9.org/showthread.php?threadid=75527Si des passages vous paraissent obscurs, à la fin de ce post je donne quelques liens qui pourront vous aidez. Pour comprendre ces phénomènes il convient, je pense, de fournir quelques explications préalables.
1) PREAMBULE1.1) QuantificationXviD est un codec de compression "destructeur", ce qui signifie qu’il va éliminer des détails dans l’image qu’il considère inutile.
Chaque image est codée avec un
quantizer, celui-ci est une sorte de "diviseur" de qualité. Plus le diviseur est haut, plus la taille de l’image est petite, mais plus la qualité est inférieure également. Les quantizers vont de Q=1 à Q=31, ainsi :
Le quantizer Q=1 produit une image au maximum de la qualité, mais de très grande taille.
Le quantizer Q=31 produit une image au minimum de la qualité, mais de très petite taille.
Le quantizer Q=1 est (d’un avis général) jugé excessif. Le quantizer Q=2 est jugé comme étant suffisant pour une qualité "normale", et donne donc une image de taille plus petite par rapport à une image avec Q=1. En théorie il faudrait encoder avec ce quantizer fixe Q=2.
1.2) Variabilité de la sourceSi l’on prend des sources ayant exactement la même durée et si l’on encode ces sources avec le même quantizer unique, c’est à dire à même taux de compression, la taille finale du fichier encodé ne sera jamais identique. Cette différence est due à la "compressibilité" de la source. Plus la source sera compressible, plus la taille finale du fichier sera faible.
Une source sombre et statique sera beaucoup plus compressible qu’une source contrastée avec beaucoup de mouvements.
1.3) L’encodage en 2 passesPour avoir une qualité maximale pour une taille de fichier donnée, il faut employer le mode 2 passes. Le processus est le suivant :
La première passe d’encodage est réalisée à quantizer fixe Q=2.
Pour réaliser la 2ème passe, le codec XviD va utiliser le fichier issu de la 1ère passe comme référence, 3 cas de figure peuvent exister :
Le fichier créé lors de la 1ère passe est plus grand que la taille finale demandéeLors de la 2ème passe, le XviD utilisera des quantizers supérieurs afin de diminuer et respecter la taille demandée.
Le fichier aura la qualité maximale pour la taille que vous aurez spécifiée, mais de qualité inférieure à Q=2
Le fichier créé lors de la 1ère passe est plus petit que la taille finale demandéeEn théorie le résultat de l’encodage de la 1ère passe étant réalisé à Q=2, peut être considéré comme parfait. Mais comme la taille n’est pas respectée, le XviD va gonfler la taille du fichier final en injectant lors de la 2ème passe des images encodées à Q=1. En théorie le résultat devrait être "plus que parfait".
Le fichier créé lors de la 1ère passe a exactement la taille demandéeDans ce cas il n’y a aucun pb, mais statistiquement la probabilité d’avoir cette égalité est quasi nulle.
2) PHENOMENES OVERSIZE & UNDERSIZERevenons à nos problèmes d’Oversize et Undersize. Au vu des explications précédentes, tout va pour le mieux. Mais seulement des problèmes d’Oversize et Undersize existent bel et bien, alors il est où le problème ?
D’abord il faut savoir que les problèmes d’Oversize et d’Undersize sont liés et ne font qu’un. L’origine commune de ces problèmes étant la compressibilité de la source. Dans la grande majorité des sources, il y a un équilibre entre les différentes scènes sombre / contrastée, lente / rapide. Mais il arrive parfois que certaines sources soient décalées et offrent des compressibilités très importantes.
Avec des compressibilités importantes, le fichier issu de la 1ère passe est généralement plus petit que la taille finale demandée.
Comme expliqué précédemment, le codec XviD va injecter des images à Q=1 pour essayer de respecter la taille. "Essayer" car l’ajout massif d’images à Q=1 va fortement perturber le respect de taille finale demandée, et peut aboutir à un fichier surdimensionné.
Voilà comment le XviD génère le phénomène d’Oversize.
Pourquoi je fais toujours des fichiers sous-dimensionnés. D’après les explications précédentes, le codec XviD devrait me faire des fichiers surdimensionnés ?Parce que dans les paramètres du codec vous avez défini une valeur supérieure à 1 pour le quantizer mini des I/P et B-Frames. En règle générale la valeur définie est Q=2, mettre plus n’aurait aucun sens (et serait une erreur).
Donc dans le cas où le fichier de la 1ère passe est inférieur à la taille finale demandée et interdisant au XviD d’injecter des images à Q=1, le fichier final restera avec une taille inférieure à la taille finale demandée.
Voilà comment le XviD génère le phénomène d’Undersize.
Modifier le quantizer mini en le passant de Q=2 à Q=1 ne résoudra pas forcément le pb, car il y a de fortes chances à ce que le XviD génère cette fois de l’Oversize. Mais cela reste malgré tout une solution à envisager.
Il existe fort heureusement des "leviers" pour que le XviD respecte la taille. Vous pouvez agir à 2 endroits différents :
- Dans le paramétrage du codec
- Dans le paramétrage de l’encodage
3) PARAMETRAGE DU CODECBien que personnellement je n’aime pas cette solution, vous pouvez modifier certains paramètres. Le respect de la taille n’est pas assuré du tout, vous pourrez avoir un "léger mieux" ou basculer carrément dans le phénomène inverse. Suivant le cas de figure le réglage sera différent :
3.1) Phénomène d’Oversize- Choisir la matrice de quantification H.263 ou des matrices custom :
Jawor 1CD Matrix par exemple.
- Augmenter le quantizer mini pour les I/P et B-Frames (passer de Q=1 à Q=2)
- Si ce n'est pas fait, cochez les B-Frames avec max consecutive BVOPs = 1 et Packed bitstream coché. Si ce n'est pas suffisant, augmenter le quantizer appliqué en modifiant les paramètres Quantizer ratio et Quantizer offset. Vous avez également la possibilité d'injecter des B-Frames supplémentaires, via la description de zone, avec le paramètre B-VOP sensitivity.
- Modifier les valeurs des Overflows
Les OverflowsPar défaut le codec XviD à le réglage suivant des Overflows :
- Overflow control strength = 5%
- Max overflow improvement = 5%
- Max overflow degradation = 5%
Et là, modifier ces valeurs, on rentre dans des "recettes de cuisine". Chacun fait comme il le sent, malgré tout voilà quelques valeurs de référence :
La préconisation de Koepi :
- Overflow control strength = 20%
- Max overflow improvement = 20%
- Max overflow degradation = 20%
Sur Doom quelqu’un avait préconisé les valeurs suivantes :
- Overflow control strength = 0%
- Max overflow improvement = 4%
- Max overflow degradation = 9%
Et moi je serai tenté de faire ceci :
- Overflow control strength = 20%
- Max overflow improvement = 0%
- Max overflow degradation = 10% à 20%
Si vous décidez de modifier les Overflows et dans le cas où vous arriveriez à la taille finale demandée, je vous conseille vivement de contrôler la qualité de l’encodage sur différents types de scènes.
3.2) Phénomène d’UndersizeLes experts du XviD considère ce cas comme un "faux problème", puisque le résultat est avec une qualité "normale". Néanmoins vous pouvez toujours essayer de l’améliorer :
- Choisir la matrice de quantification MPEG ou des matrices custom :
Jawor 2CD matrix ou la matrice HVS best picture (dispo dans le package matrices du répertoire XviD) par exemple.
- Diminuer le quantizer mini pour les I/P et B-Frames (passer de Q=2 à Q=1)
- Supprimer les B-Frames, ou réduire le quantizer appliqué en modifiant les paramètres Quantizer ratio et Quantizer offset. Vous avez également la possibilité de diminuer le nombres de B-Frames, via la description de zone, avec le paramètre B-VOP sensitivity.
- Modifier les valeurs des Overflows
Je serai tenté de faire ceci :
- Overflow control strength = 20%
- Max overflow improvement = 10% à 20%
- Max overflow degradation = 0%
Bien que l'ayant préconisé par le passé, modifier les paramètres par défaut du codec est à mon sens une mauvaise solution. Elle est à utiliser qu’en dernier ressort si le paramétrage de l’encodage ne donne pas satisfaction.
4) PARAMETRAGE DE L’ENCODAGELe but est de faire varier la compressibilité du film et donc au final revenir dans une fourchette acceptable pour que le XviD respecte la taille finale demandée. Pour ce faire vous pouvez agir sur 2 paramètres :
- Dimensions de la vidéo finale
- Le script avisynth
4.1) Phénomène d’Oversize- Diminuer la résolution de la vidéo
- Utiliser un resize "floutant"
- Ajouter des filtres dans le script avisynth pour adoucir l’image (filtre "floutant")
Quelques exemples de filtres "floutant"
- Convolution3D
- Deen
- Fluxsmooth
4.2) Phénomène d’Undersize- Augmenter la résolution de la vidéo
- Utiliser un filtre de resize "sharp"
- Ajouter des filtres dans le script avisynth pour durcir l’image (filtre "sharp") ou de la luminosité et contraste
Quelques exemples de filtres "sharp"
- MSharpen
- Asharp
- Unfilter
Quelques exemples de filtres pour la luminosité et contraste
- Tweak
- Levels
4.3) A propos des filtres AvisynthIl est évident que l’utilisation des filtres ne doit se faire que si cela apporte un "plus" au résultat final. Tenir la taille finale demandée en dégradant la qualité de l’image à cause des filtres ajoutés n’a aucun sens.
L’utilisation des filtres cités est exclusive dans chaque cas :
- Pas de filtres "sharp" en cas d’Oversize
- Pas de filtres "floutant" en cas d’Undersize.
5) TEST DE COMPRESSIBILITEOn se rend aisément compte, dès lors que l’on est confronté à ces pb d’Oversize et Undersize, que malgré ces solutions, ça va être long et fastidieux de trouver le "bon réglage".
Quand vous en aurez marre de refaire des encodages complets pour vérifier si votre nouveau réglage va enfin réaliser ce que vous recherchez, et bien non ne changez pas de codec faites tout simplement un test de compressibilité.
5.1) Test de compressibilité quézako ?Ce test va justement vérifier cette variable inconnue, qui est la compressibilité spécifique de la source. Cela consiste ni plus ni moins que de réaliser un encodage avec tous les paramètres que vous aurez spécifiés : Paramétrage codec & paramétrage encodage. Au final vous n'aurez pas une vidéo encodée, mais le taux de compressibilité de la source exprimé en pourcentage. Pour info avoir un taux supérieur à 100% n'est pas une erreur de calcul du test.
Le test ne va pas encoder la source dans son intégralité, mais seulement qu’un pourcentage de celle-ci. Le pourcentage étant à définir par vous, prévoir 5% mini et pour avoir un résultat très fiable vous pouvez monter jusqu’à 10%.
La durée de ce test est variable, elle dépend bien sur de la durée de votre source et du script avisynth, pour info :
- Source de 1h30, test à 5%, script avisynth basic : 15mn environ
- Source de 2H, test à 10%, script avisynth complexe : 45mn environ
Prendre en compte les rapports de temps uniquement, ceci dépend également de la puissance de votre PC.
5.2) Le test de compressibilité dans RIAMCe test est fiable avec la version 4 de RIAM et uniquement à partir de cette version.
Le codec XviD respectera systématiquement la taille finale demandée si le résultat du test se situe dans une fourchette de 45% à 55%. Idéalement, essayez de cibler 50%.
Quelques conseils :
- A la fin du test de compressibilité, vous pouvez agir directement sur ce taux en modifiant les dimensions de l’image. Si, dans la fenêtre de prévisualisation vous modifiez le resize, le taux de compressibilité affiché dans le bandeau de titre évoluera directement. Attention, par effet induit, le ratio évoluera aussi.
- Si pour avoir un taux de 50% le resize ne vous convient pas, il vous faudra agir sur les autres paramètres, ce qui vous obligera à refaire un nouveau test de compressibilité.
- Ne sous-estimez pas la puissance des filtres avisynth, bon nombre de fois la solution passera par ceux-ci.
Pour se rendre compte de l'impact des filtres avisynth sur le taux de compression, vous pouvez lire ce post :
http://forum.ripp-it.com/Methode-pour-respecter-la-taille-en-XviD-t3176.htmlPetite précision : Mes remarques sur RIAM dans ce post sont obsolètes, car à l’époque de ce post la version 4 de RIAM n'existait pas encore.5.3) Les filtres de resizeLe choix du filtre de resize, systématiquement utilisé dans un script avisynth, aura une répercution sur le résultat du test de compressibilité. Le classement ci-dessous est donné du filtre qui offrira le plus de compressibilité à celui qui en donnera le moins :
- BilinearResize
- BicubicResize
- LanczosResize
Le filtre BicubicResize, de part ses 2 variables finales, se décompose en une multitude de cas entre BilinearResize et LanczosResize
Ne voulant pas relancer de "vieux débat", je re-précise que ce classement est en terme de compressibilité et nullement en terme de qualité d’image. Pour la qualité de l’image d’un filtre par rapport à un autre, veuillez vous reporter sur ce que vous disent vos yeux.
5.4) Le cas HybridFuppCe "filtre/script" intègre à la base un resize comme ceux précédemment cités. Mais de part la composition de ce "filtre", à resize équivalent, HybridFupp vous fera gagner 5% environ sur le taux de compressibilité. Ce qui peut être intéressant dans des "cas difficiles", la contre-partie est un allongement de la durée de l’encodage (2 fois plus long environ). Par rapport aux presets d’HybridFupp, voici les équivalences de resize :
"HybridQ" = BilinearResize
"very low" = BilinearResize
"low" = BicubicResize(i, w, h, 0.2, 0.4)
"medium" = BicubicResize(i, w, h, 0, 0.5)
"high" = BicubicResize(i, w, h, 0, 0.6)
"very high"= LanczosResize
"anime1" = BicubicResize(i, w, h, 0.333, 0.333)
"anime2" = BicubicResize(i, w, h, 0.333, 0.333)
Les presets correspondent à la version 0.915 d’HybridFupp
Rappel : A équivalence de resize, gain de 5% environ avec HybridFupp sur le taux de compressibilité.
Liens complémentaires-
B-Frames : Définition et mode de calcul-
B-Frames : Réglage du B-VOP sensitivity-
Définition des Overflows-
Influence de VHQ MODE sur la compressibilité-
Essai de test de compressibilité-
Influence des filtres de sharp sur la compressibilité-
Bits/(Pixel*Frame) et Test de Compressibilité