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 ;)

  • kbsali

    Merci, super tutoriel de presentation!
    la suite la suite! :)

    ps : faute de frappe juste apres la 1er copie d’ecran : “La commande gst-lauch permet de tester un framewok en ligne de commande” –> gst-lauNch ! ;)

    • limlim

      Bonjour a tous ;
      est ce que gstreamer peut me permettre de coder une sequence video mpg en h264 avec differents bitrate ?
      merci

  • Mathieu

    C’est pratique aussi d’installer le module gstreamer0.10-x (pour Debian et Ubuntu), sinon il peut manquer les plugins ximagesink et xvimagesink…

  • Estelle

    Bonjour NicoLargo,

    Merci pour toutes ces explications au sujet de Gstreamer. Maintenant, je voudrais pouvoir utiliser la librairie gstreamer-java pour modifier un fichier au format Flv. Globalement je veux pouvoir changer le flux audio et/ou vidéo de mon fichier.
    Sais-tu si cela est possible avec cette librairie? En aurais-tu d’autres à me conseiller ?

    Merci d’avance.

    Estelle.

  • http://blog.nicolargo.com NicoLargo

    @Estelle: la librairie Gstreamer-Java permet de faire en Java tout ce qui est possible de faire avec Gstreamer. Donc il est possible de modifier un fichier au format FLV si ce format est reconnu (le pense que oui mais il vaut mieux lire la documentation).

  • Thomas

    Bonjour,

    Je voudrais utiliser gstreamer-java pour fair un lecteur video en java.

    J’ai ajouté le gstreamer-java.jar a mon projet et je l’ai ajouté au classpath .
    Je vois bien qu’il a un problème avec “le code natif ” : il manque quelque chose .

    Mais quoi ? et ou ?

    Merci de ton aide

  • julgrut

    Super blog, j’y puise de nouvelles connaissances, elle s’accroient quand on la partage.
    Juste pour dire merci et je retourne bosser sur gstreamer. (Il y a une faute à la 6ème ligne “abordé” prend “er” à la fin).

  • http://www.nicolargo.com NicoLargo

    @julgrut: meric :) et bon boulot avec GStreamer !

  • basma

    bonjour à tous, j’ai tester les commandes avec un vidéo .avi mais ça n’a pas marché, est ce que Gstreamer fonctionne seulement avec les vidéos de type .ogg ??????????

    • http://www.nicolargo.com NicoLargo

      Bien sur que non mais il faut adapter la pipeline en conséquence… Par exemple pour lire une vidéo sans se soucier du type/codec:

      gst-launch filesrc location=./fichier.avi ! queue ! decodebin ! ffmpegcolorspace ! autovideosink

      • basma

        est ce qu’on peut utiliser Gstreamer coté serveru, càd, est ce qu’on peut l’exploiter pour faire un serveur de streamign, j’ai bien cherché mais j’ai pas trouvé d’informations !!

  • Smile

    salut à tous, est ce que Gstreamer peut jouer le role d’un serveur de streaming, en d’autres mots, est ce que je peux installer Gstreamer sur une machine ubuntu lié à une base de data médiathèque, et connecté à un serveur web afin que ce dernier gère le lancement de Gstreamer automatiquement, est ce que Gstremaer dans ce cas peut jouer le role d’un serveur?? car j’ai eu l’habitude de l’utiliser coté client seulement, merci d’avance .

    • http://www.nicolargo.com NicoLargo

      GStreamer peut sans problème être utilisé coté serveur. Le meilleur exemple est de regarder du coté du serveur de streaming Flumotion (faire une recherche sur ce blog) qui est basé sur GStreamer.

      Il faut juste garder en tête que GStreamer n’est qu’un framework. A toi donc de construire ton application autour…

      • Smile

        Merciiii NicoLargo, et bonne continuation, c’est un super blog honnêtement :)

  • Pingback: Video Raspberry | Pearltrees

  • Pingback: Video Raspberry | Pearltrees