Pour partager des vidéos capturées par mon appareil photo, je les convertissais jusqu’alors en Ogg/Theora grâce à ffmpeg2theora. Ce format (contrairement au h264) est libre et lisible nativement par Firefox, y compris par la version mobile.

Mais j’envisage depuis longtemps de passer à WebM (le format libéré par Google il y a un peu plus de deux ans), plus performant, lui aussi lu nativement par Firefox (et par d’autres). Pour cela, je vais utiliser avconv.

avconv

Qu’est-ce qu’avconv ? Le meilleur moyen de le savoir est d’exécuter ffmpeg sans arguments :

$ ffmpeg
…
*** THIS PROGRAM IS DEPRECATED ***
This program is only provided for compatibility and will be removed in a future release. Please use avconv instead.

En fait, c’est plus compliqué que ça.

J’ai précisé « ffmpeg » dans le titre du billet car je pense que c’est encore sous ce nom que l’outil est le plus connu. Le contenu de ce billet s’applique aussi bien à ffmpeg qu’à avconv.

Filtres

Il m’arrive d’avoir besoin d’appliquer des filtres très simples ; typiquement, augmenter la luminosité d’une vidéo. ffmpeg2theora permet de le faire directement grâce à l’option -B. Mais on a beau chercher dans le man d’avconv, on ne trouve rien.

frei0r

C’est là qu’intervient le projet frei0r. Il s’agit d’une API permettant d’appliquer des filtres vidéo que chaque application pourra utiliser. Et ça tombe bien, l’application avconv peut l’utiliser si elle a été compilée avec l’option --enable-frei0r.

La bonne nouvelle, c’est que la version distribuée par Debian wheezy est compilée avec cette option. La mauvaise, c’est que celle fournie dans Ubuntu 12.04 ne l’est pas.

frei0r a besoin de plugins permettant d’appliquer les filtres. Il est nécessaire pour cela d’installer frei0r-plugins :

sudo apt-get install frei0r-plugins

avconv + frei0r

La syntaxe pour utiliser frei0r dans avconv est la suivante :

-vf frei0r=<filter_name>[{:|=}<param1>:<param2>:...:<paramN>]

Mais comment connaître les filter_names disponibles et leurs paramètres ?
Je n’ai trouvé aucune documentation à ce sujet. J’ai donc consulté les sources.

À partir de là, on comprend facilement que la luminosité est modifiée par le filtre brightness comportant un paramètre de type double (voir notamment la fonction f0r_get_param_info) compris entre 0 (sombre) et 1 (clair) (0.5 étant la luminosité de la vidéo d’origine).

En respectant la syntaxe, cela donne par exemple :

avconv -i video.mts -s 640x360 -ac 1 -q:a 2 -b:v 600k -vf frei0r=brightness:0.6 output.webm

Il existe plein d’autres filtres. Par exemple pour le contraste, c’est contrast0r :

-vf frei0r=contrast0r:0.4

Pour les combiner, il suffit de concaténer plusieurs blocs -vf :

-vf frei0r=brightness:0.6,frei0r=contrast0r:0.4

Conclusion

Malgré les apparences, avconv permet, pour peu qu’il soit compilé avec l’option-qui-va-bien, d’encoder des vidéos en modifiant la luminosité, le contraste, et d’appliquer bien d’autres filtres… ce qui est très pratique.