Introduction à GStreamer, le framework multimedia

Date: 29/01/2009 | Catégories: Open-source | Tags: ,

Depuis l'intégration dans le noyau de Gnome 2.2, GStreamer est devenu un "framework" multimédia très à la mode. Contrairement à la musique, être à la mode peut être compatible avec qualité. Nous allons dans ce billet aborder cet outil très pratique à partir du moment ou vous voulez développer des applications gérants du son et de la vidéo.

Introduction

GStreamer est une boite à outil permettant de gérer des données multimédia (son et vidéo) de bout en bout: de l'acquisition de la source (fichier, flux réseau, webcam, micro...) au traitement (effet vidéo, audio, encodage) à la diffusion (sur l'écran, dans un fichier, sur le réseau).

Un exemple:

Ce dernier est développé en C (note du Troll: le seul et unique language pour faire ce genre de chose) mais il existe de nombreuse librairie pour appeller GStreamer à partir de logiciel développé dans d'autres languages (C, Java, Perl, Python...et autres). GStreamer existe sous GNU/Linux, BSD et Windows (voir ici la procédure pour compiler GStreamer sous Windows).

Il se base sur une architecture modulaire composé d'un coeur (GStreamer) et de plugins (Base, Good, Ugly, Bad).

Installation de GStreamer

Voici les lignes de commandes à saisir pour installer GStreamer et les plugins sur une distribution GNU/Linux Ubuntu:

# sudo apt-get install gstreamer0.10-tools gstreamer0.10-plugins-base gstreamer0.10-plugins-good gstreamer0.10-plugins-ugly gstreamer0.10-plugins-bad gstreamer0.10-ffmpeg

Pour vérifier que l'installation est ok, vous pouvez lancer la commande suivante qui devrait afficher la liste des plugins disponibles:

# gst-inspect
...
Nombre total : 168 greffons, 762 fonctionnalités

Un premier exemple

Pour tester notre Framework avant de l'intégrer dans votre logiciel, il existe une ligne de commande très pratique: gst-launch.

Nous allons par exemple utiliser GStreamer pour ouvrir un fichier vidéo au format OGG et l'afficher sur notre écran (les bases d'un lecteur multimédia... sans le son ;)):

# gst-launch filesrc location=./Vidéos/big_buck_bunny_480p_stereo.ogg ! oggdemux ! theoradec ! xvimagesink

et le résultat:

Détaillons un peu cette ligne:

 

# gst-launch filesrc location=./Vidéos/big_buck_bunny_480p_stereo.ogg ! oggdemux ! theoradec ! xvimagesink

La commande gst-launch permet de tester un framework en ligne de commande.

# gst-launch filesrc location=./Vidéos/big_buck_bunny_480p_stereo.ogg ! oggdemux ! theoradec ! xvimagesink

Nous appelons en premier le plugin filesrc qui est un plugin qui prend en entrée un fichier multimédia (dont le nom est passé par le paramètre location).

Pour avoir une documentation précise du plugin (et des ses paramètres), vous pouvez utilsier la commande suivante:

# gst-inspect filesrc

# gst-launch filesrc location=./Vidéos/big_buck_bunny_480p_stereo.ogg ! oggdemux ! theoradec ! xvimagesink

Le deuxième plugin utilisé (il faut utiliser le ! entre deux plugins, c'est un peu l'équivalent d'un | pour les commandes Unix) est oggdemux, qui prend en entrée un flux vidéo OGG (fourni dans notre cas par filesrc) et qui de décode.

# gst-launch filesrc location=./Vidéos/big_buck_bunny_480p_stereo.ogg ! oggdemux ! theoradec ! xvimagesink

Ensuite on utilise le plugin theoradec pour décoder la vidéo dont le format est Theora.

# gst-launch filesrc location=./Vidéos/big_buck_bunny_480p_stereo.ogg ! oggdemux ! theoradec ! xvimagesink

Ce dernier plugin (xvimagesink) prend en entrée un flux video décodé (format RAW) et l'affiche sur l'écran en utilisant Xv (XFree86 Video).

Comme on peut le voir, cette logique d'enchaînement de tâches est très intuitive.

Ainsi, si l'on souhaite que notre lecteur vidéo redimmensionne l'image avant de l'afficher, il suffit d'ajouter les plugins suivants (videoscale):

# gst-launch filesrc location=../Vidéos/big_buck_bunny_480p_stereo.ogg ! oggdemux ! theoradec ! videoscale ! video/x-raw-yuv,height=240 ! xvimagesink

Simple non :) ?

D'autres exemples...

Récupération d'un flux venant d'une caméra (sur /dev/video0), redimensionnement en 240 lignes et affichage sur l'écran:

# gst-launch v4l2src ! videoscale ! video/x-raw-yuv,height=240 ! xvimagesink

Récupération d'un flux venant d'une caméra (sur /dev/video0), redimensionnement en 240 lignes, application d'un filtre EffectTV (quarktv qui rend flou les objets en mouvement) et affichage sur l'écran:

# gst-launch v4l2src ! videoscale ! video/x-raw-yuv,height=240 ! ffmpegcolorspace ! quarktv ! ffmpegcolorspace ! xvimagesink

Dans nos premiers exemples, nous avons traités notre flux de manière séquentielle. Si nous voulons, par exemple, ajouter l'audio à notre lecteur multimédia il faut que GStreamer gére la vidéo et le son en parallèle. On va utiliser le plugin queue qui a pour fonction de créer un nouveau "thread" GStreamer.

Notre lecteur multimédia devient donc:

# gst-launch filesrc location=./Vidéos/big_buck_bunny_480p_stereo.ogg ! oggdemux name=demux
demux. ! queue ! vorbisdec ! audioconvert ! audioresample ! osssink
demux. ! queue ! theoradec ! xvimagesink

On peut améliorer le lecteur en laissant GStreamer sélectionner lui même les sorties audio et vidéo (autodetect):

# gst-launch filesrc location=./Vidéos/big_buck_bunny_480p_stereo.ogg ! oggdemux name=demux
demux. ! queue ! vorbisdec ! audioconvert ! audioresample ! autoaudiosink
demux. ! queue ! theoradec ! autovideosink

Je m'arrête là pour ce premier article sur GStreamer. Nous reviendrons bientôt sur ce passionnant sujet notamment en abordant l'encodage audio et vidéo et le streaming sur le réseau.Je vous laisse consulter la longue liste des plugins pour trouver votre bonheur. N'hésitez pas à proposer vos framework GStreamer en ligne de commande dans les commentaires ;)