# GStreamer

GStreamer est une bibliothèque logicielle de manipulation de sons et d'images (appelée aussi framework multimédia) écrite en C et distribuée sous licence libre.
Initialement développée pour proposer une solution capable de concurrencer QuickTime et DirectShow sur GNU/Linux, sa première version publique date du 31 octobre 1999.
Le travail sur la synchronisation vidéo et audio de son auteur, lui a permis d'implémenter cette partie dans PipeWire, un gestionnaire de flux multimédias pour Linux, qui va permettre d'unifier les API des gestionnaires audio avec JACK, faible latence, orienté audio professionnel, et PulseAudio davantage orienté bureau, ainsi que les flux vidéos. Ces apports permettent en contrepartie d'alléger la gestion de synchronisation de Gstreamer.
Elle a été portée depuis sur une grande variété de systèmes d'exploitation autres que GNU/Linux, tels que BSD, OpenSolaris, Android, OS X, iOS, Windows, OS/400.
C'est un projet maintenu au sein de Freedesktop.org.

## Distribution et adoption

GStreamer a été rapidement adoptée par le projet GNOME (dès la version 2.2 de ce dernier, sortie en février 2003) dont elle est devenue un pilier (Totem, Rhythmbox, Epiphany et Pitivi, par exemple, en tirent largement parti).
Elle est également utilisé par Phonon, la couche d'abstraction multimédia de KDE4.
Elle a ensuite commencé à être utilisée sous Windows et MacOS : c'est ainsi que Songbird se basait dessus pour proposer des versions fonctionnant sous ces différentes plateformes, de même qu'Opera a reposé dessus pour afficher l'élément vidéo de HTML5 sous Windows, GNU/Linux et FreeBSD (à partir de sa version 10.5 et, semble-t-il, jusqu'à l'abandon du moteur de rendu de pages Web maison Presto au profit de Blink).
WebOS y recourt également.
Pour faciliter les usages commerciaux de GStreamer, Fluendo (it) et Collabora (en) ont œuvré ensemble à la création d'un SDK multiplateforme (GNU/Linux, Windows et Mac OS X pour la première version nommée Amazon qui est sortie le 7 juin 2012, puis Android avec la version Brahmaputra sortie le 28 novembre 2012 et iOS avec la version Congo sortie le 12 juin 2013). Depuis, le SDK continue à être mis à jour parallèlement à GStreamer lui-même.

## Fonctionnement technique

GStreamer repose sur un fonctionnement en pipeline qui rappelle les tubes sous Unix : les éléments sont connectés entre eux via des tubes. Mais avec GStreamer, le type d’un flux passant par un tube est connu des éléments (le format de sortie et d’entrée n’a pas à être spécifié au niveau de chaque élément). On peut également dupliquer un flux avec la commande tee.

### Exemples
#### Lecture d'un fichier audio

Voici un pipeline qui va permettre la lecture du fichier audio « mon_son.ogg » – consistant en un son compressé avec le codec Vorbis et présenté dans un format conteneur Ogg – en faisant appel au serveur de sons PulseAudio (dans cet exemple, le greffon « filesrc » permet de déclarer le fichier source, « oggdemux » permet de démultiplexer (en) le fichier, « vorbisdec » de le décoder et « pulsesink » d'envoyer le résultat à PulseAudio) :
L'exemple précédent peut être simplifié en laissant GStreamer détecter lui-même la nature du conteneur et du codec, au moyen du greffon « decodebin » :
Il est même possible de laisser GStreamer détecter lui-même le serveur de sons en utilisant le greffon « autoaudiosink » :

#### Lecture d'un fichier audio-vidéo

Voici un pipeline qui va permettre la lecture du fichier audio-vidéo WebM « ma_vidéo.webm » (dans cet exemple, le greffon « decodebin » est affublé d'un nom quelconque – ici « foo » – pour pouvoir être réutilisé par chaque pipe – un pour traiter le flux vidéo, l'autre pour traiter le flux audio – qui est mis en attente à l'aide du greffon « queue » pour que les deux parties soient jouées en même temps) :

#### Transcodage d'un fichier audio-vidéo

Voici un pipeline qui va permettre le transcodage d'un fichier MP4 (contenant généralement une partie vidéo compressée avec le codec H.264 et une partie audio compressée avec le codec AAC, mais c'est sans importance dans cet exemple où nous laissons le greffon « decodebin » s'occuper de tout ça comme nous l'avons vu précédemment) en fichier ogv associant les codecs Vorbis et Theora respectivement pour l'audio et la vidéo (le greffon « decodebin » est de nouveau affublé d'un nom, « foo », pour pouvoir être réutilisé dans chacun des pipes audio et vidéo, de même ici que le greffon « oggmux » qui est nommé pour l'occasion « bar » et qui va permettre de multiplexer les parties audio et vidéo) :

## Greffons

GStreamer adopte un système de greffons regroupés sous les appellations « Good », « Bad » et « Ugly » selon le support qui leur est accordé, support qui est défini en fonction de la qualité du greffon lui-même, sa licence et d’autres choses :
* les greffons « Good » sont de bonne qualité et très bien supportés,
* les greffons « Bad » sont ceux dont la qualité n’est pas assurée parce qu’ils sont soit peu utilisés, soit peu testés, soit peu maintenus ou tout simplement parce que leur support n’est pas prioritaire,
* les greffons « Ugly » sont des greffons de bonne qualité mais dont la redistribution est problématique.
Pour l’anecdote, ce nommage en « Good », « Bad », et « Ugly » est inspiré du titre anglais d’un célèbre film de Sergio Leone : Le Bon, la Brute et le Truand (The Good, the Bad and the Ugly).

## GStreamer Editing Services (GES) et Non-Linear Engine (NLE)

La bibliothèque GStreamer Editing Services a été développée par-dessus GStreamer pour offrir une interface de programmation simplifiée pour des opérations d'édition multimédia, et en particulier l'édition non-linéaire dont l'édition vidéo non-linéaire.
Pour être précis, GStreamer Editing Services s'appuie sur Non-Linear Engine (le successeur de GNonLin) qui s'appuie lui-même sur GStreamer à cet effet.
Non-Linear Engine est média-agnostique et ne possède aucune notion d'édition vidéo. Non-Linear Engine est essentiellement composée de quelques greffons thread-safe pour GStreamer qui permettent des opérations de composition et de mixage et aussi de convertir dynamiquement la piste de montage d'un projet en un pipeline pour GStreamer.
À compter de sa version 0.91, l'éditeur video non-linéaire Pitivi repose sur GES.

## Historique

Le projet débute comme une preuve de concept en juin 1999, avec la publication de la version 0.0.1. Le 11 janvier 2001, le projet publie sa première véritable version, la 0.1.0.
En juillet 2002 fut publiée la version 0.4.0, qui est également la première version à intégrer le projet GNOME. Avec la version 0.6.0 publiée le 2 février 2003, le projet considère que le support de l'audio est enfin pleinement fonctionnel.
La série 0.8 a été lancée en mars 2004, rapidement suivie par la série 0.10, lancée en décembre 2005, qui signe véritablement la maturité du framework.
La version 1.0, sortie le 24 septembre 2012, succède finalement à la version 0.10. Cette version est conçue pour pouvoir coexister avec la précédente sur un même système afin de faciliter la transition.
La version 1.2, sortie le 24 septembre 2013, prend notamment en charge l'accélération matérielle par le processeur graphique du décodage voire du codage vidéo pour certains codecs et processeurs (via la bibliothèque gstreamer-vaapi).
La version 1.4, entre autres choses, corrige la prise en charge du format MPEG-TS.
À compter de la version 1.6, sortie le 25 septembre 2015, Non-Linear Engine (NLE) remplace GNonLin.
En 2017, commence l'intégration de Gstreamer, Alsa, PulseAudio et JACK au sein d'un ensemble unifié appelé Pipewire.

## Logiciels utilisant GStreamer

* Arista (transcodage)
* Banshee (lecteur audio)
* BMPx (lecteur audio)
* Cheese (vidéo/webcam)
* Clementine (lecteur audio)
* Dino (chat)
* Exaile (lecteur audio)
* Gnome-Music (lecteur audio)
* HandBrake (transcodage)
* Jokosher (studio audio)
* JuK (lecteur audio)
* Listen (lecteur audio)
* Miro (lecteur de vidéos en ligne)
* Muine (lecteur audio)
* OpenCV (traitement/analyse d'image)
* Pidgin (chat)
* Pitivi (éditeur vidéo NL)
* Quod Libet (lecteur audio)
* Rhythmbox (lecteur audio)
* Shotwell (gestion photo/vidéo)
* Sound Juicer (transcodage audio)
* Songbird (lecteur audio)
* Totem (lecteur vidéo)
* Transmageddon (transcodage)