Gstreamer-Plugins entwickeln
Klempnerei
Gstreamer ist ein Framework zur Entwicklung von Multimedia-Anwendungen in C, C++, Python oder Mono. Plugins übernehmen die Ein- und Ausgabe sowie die Verarbeitung der medialen Daten.
Gstreamer ist ein Framework zur Entwicklung von Multimedia-Anwendungen in C, C++, Python oder Mono. Plugins übernehmen die Ein- und Ausgabe sowie die Verarbeitung der medialen Daten.
Die schöne neue Multimediawelt bringt dem Anwender unzählige Dateiformate und Gerätschaften. Mit Gstreamer [1] steht ein Multimedia-Framework zur Verfügung, das beliebige Inhalte verarbeitet. Es verwaltet dabei in einer Pipeline drei Arten von Elementen: Die erste empfängt Audio- oder Videosignale, die zweite verarbeitet sie, die dritte reicht die Signale an einen Ausgang wie die Soundkarte weiter. Der Gnome-Desktop verwendet Gstreamer für seine Media-Anwendungen (CD-Player, Videoplayer, Lautstärkeregler und vieles mehr), die Quellen und Pakete gibt es auf der Gstreamer-Webseite.
Am Beispiel eines Echoeffekts (Delay mit Feedback) beschreibt der Artikel, wie jeder C-Kundige eigene Plugins für das Framework entwickelt. Abbildung 1 stellt zunächst den Signalfluss schematisch dar: Der Echoeffekt beruht auf einem Ringpuffer, der eingehende Audiodaten zwischenspeichert und verzögert wiedergibt. Die ausgehenden Daten kehren etwas leiser in den Ringpuffer zurück, dabei entstehen die Echos. Die Länge des Ringpuffers bestimmt die Echoabstände, die Dämpfung für die Rückkopplung steuert das Abklingverhalten. Bevor das Signal ertönt, durchläuft es noch eine Mischstufe, die die Intensität des Effekts regelt.
Abbildung 1: Ein Ringpuffer speichert eingehende Daten zwischen und gibt sie dann verzögert wieder. Die ausgehenden Daten kehren anschließend etwas leiser in den Ringpuffer zurück, so entsteht ein Echo.
Das Effektelement besitzt später also drei Parameter:
Klingt kompliziert, ist es aber nicht. Ein einfaches Array realisiert den Ringpuffer, zum Hineinschreiben und Auslesen merkt sich der Algorithmus zwei Array-Indizes, die Mischstufe besteht aus einer schlichten Addition.
So sieht das Ganze nun als Gstreamer-Element aus: Gstreamer selbst ist in der Programmiersprache C geschrieben. Um auch in C objektorientiert zu programmieren [2], kommt die Gobject-Bibliothek zum Einsatz. Obwohl dieser Artikel C für das Beispiel-Plugin verwendet, kann ein Entwickler Gstreamer-Anwendungen und -Plugins auch in C++, Python, Mono oder anderen Sprachen realisieren.
Nur den oben beschriebenen Algorithmus in C umzusetzen, genügt leider nicht: Ein Element muss sich auch um die Ressourcenverwaltung kümmern und ein paar Spielregeln einhalten, damit die Kooperation der unterschiedlichen Elemente funktioniert. Gstreamer bringt bereits mehrere Basisklassen mit, das Beispielelement nutzt eine solche Klasse und stützt sich zum Teil auf ererbte Methoden.
Das Gstreamer-Konzept ist recht einfach: Signale aus verschiedenen Quellen, etwa dem Internet oder aus Gerätedateien, erreichen die Pipeline, die aus Elementen besteht. Elemente gehören zur wichtigsten Gstreamer-Objektklasse »GstElement«. Sie beeinflussen und verwandeln die eingehenden Signale, demultiplexen oder konvertieren sie. Mehrere Elemente hintereinander geschaltet bilden eine Pipeline: Das Eingangssignal durchläuft also die Pipeline und landet zum Beispiel beim Audio-Ausgang.
Container innerhalb dieser Pipeline, die selbst Elemente sind, aber zugleich mehrere Elemente in sich versammeln (Abbildung 2), heißen Bins. Elemente lassen sich nicht nur im Verhältnis 1:1 verschalten, sondern auch 1:n, n:1 oder n:m. Auf diese Weise besteht beispielsweise die Möglichkeit, ein eingehendes AV-Signal (Source) in ein Sound- und ein Videosignal (Sink) zu zerlegen.
Alle Rezensionen aus dem Linux-Magazin
Im Insecurity Bulletin widmet sich Mark Vogelsberger aktuellen Sicherheitslücken sowie Hintergründen und Security-Grundlagen. mehr...