17.08.2008 MPEG-4 vers H.263, VP6 ou H.264 via FFmpeg

Vieux. Ce billet a plus d'un an. S'il contient des informations techniques elles sont peut être obsolètes.

Dans un post précédent je parlais des specs du Flip Mino et d'une méthode simple pour convertir les AVI obtenus en FLV via FFmpeg. Bon, force est de constater que la qualité obtenue craint un peu... C'est pas beau. Il y en a qui ne sont pas content de la qualité de l'image enregistrée par ces mini-caméras et je les comprend. Mais en même temps faut pas rêver vu la taille des appareils, il suffit de check les specs pour voir que ça ne sera pas le paradis visuel. Pourtant l'image enregistrée est correcte et les fichiers AVI récupérés du Flip sont largement regardables. Une mauvaise compression en vue de les passer en FLV pour les mettre sur le web et c'est là que le bât blesse. Il doit y avoir moyen de trouver un meilleur compromis pour obtenir une qualité post-compression bien meilleure.

Aujourd'hui Flash est le meilleur moyen de diffuser de la video sur le web en attendant Silverlight HTML5 et ses balises <video>et <audio>. Je me suis donc plongé dans les méandres d'FFmpeg, de Flash Video, des codecs etc. pour approfondir certains points.

On commence par FFmpeg. Le logiciel est très puissant mais la documentation est plutôt moyenne et pas trop à jour. Pas facile à prendre en main quand on commence. Il faut donc aller chercher de l'info ailleurs :

A l'installation, il faut bien penser aux librairies dont on aura besoin. Heureusement, installer FFmpeg sous OS X c'est simple via MacPorts, faut juste pas oublier les variants pour installer les librairies nécessaires pour, par exemple, encoder en H.264, avoir du son en MP3 ou en AAC etc.

Ensuite il faut aller voir du côté de la video Flash et des codecs supportés. En observant un peu ce qui se fait, on peut voir que YouTube à l'air d'utiliser du Sorenson H.263, tandis que des sites comme CollegeHumor.com ou GameTrailers.com semblent préférer le VP6. C'est sans appel, le VP6 rend beaucoup mieux que le H.263. Historiquement Flash à supporté d'abord le codec Sorenson H.263 depuis la version 6 de son player, puis Adobe a décidé de supporter le codec On2 VP6 dans Flash Player 8. Le choix de VP6 à fait grincer pas mal de dents chez les kiffeurs du libre mais doit continuer à faire les choux gras de On2. Pour combien de temps on ne sait pas car depuis quelque temps Flash supporte le codec H.264 (depuis la version 9.0.98) qui fait aussi bien sinon mieux que le VP6 en fonction des avis qu'on peut lire.

On se retrouve donc avec 3 codecs utilisables (4 en vrai) pour voir de la video avec Flash Player 9 : H.263, VP6 et H.264. On va laisser tomber VP6 car ça n'est pas libre et il y a eu quelques histoires avec la lib libvp62. Il y a bien quelques bidouilles pour encoder en VP6 mais faut se prendre la tête et c'est pas très légal. Le support du H.264 nous arrange bien.

Il nous reste donc à creuser du côté de FFmpeg et des codecs H.263 et H.264.

En cherchant bien on peut trouver des tips et des conseils pour encoder en H.263+MP3. On trouve presque la même commande ici. Il s'agit ensuite de jouer principalement sur la taille de la video et sur le bitrate pour trouver le meilleur compromis en fonction des images. Par exemple :
ffmpeg -i INPUT.avi -ar 22050 -acodec libmp3lame -ab 96k -vcodec flv -b 300k -s 360x240 -g 150 -cmp 2 -subcmp 2 -mbd 2 -flags +aic+cbp+mv0+mv4+trell -y OUTPUT.flv

Pour faire du H.264+AAC il y a des exemples de commandes bien balaises qui donnent un très bon résultat. Par contre c'est vachement plus long de faire du H.264 mais la qualité est meilleure et on obtient même des fichiers plus légers. Il est possible d'accélérer un peu l'encodage en jouant sur des paramètres. Par exemple :
ffmpeg -i INPUT.avi -acodec libfaac -ab 128k -vcodec libx264 -b 300k -s 360x270 -flags +loop -cmp +chroma -partitions +parti8x8+parti4x4+partp8x8+partp4x4+partb8x8 -flags2 +brdo+dct8x8+wpred+bpyramid+mixed_refs -me umh -subq 7 -trellis 1 -refs 6 -bf 16 -directpred 3 -b_strategy 1 -bidir_refine 1 -coder 1 -me_range 16 -g 250 -keyint_min 25 -sc_threshold 40 -i_qfactor 0.71 -rc_eq 'blurCplx^(1-qComp)' -qcomp 0.6 -qmin 10 -qmax 51 -qdiff 4 -y OUTPUT.mp4.

Les 2 commandes FFmpeg ci-dessus permettent d'obtenir une qualité d'image tout à fait correcte pour la diffusion vidéo sur le web.

Au final, le H.263 donne de moins bons résultats que le H.264 mais l'encodage est largement plus rapide. C'est peut-être une des raisons qui fait rester YouTube au H.263 vu la fréquentation du site ?

Vous êtes sur le blog personnel de Marc Hertzog. Les opinions exprimées sont uniquement celles de son auteur.