GStreamer 1.0 unter Python 3.4 nutzen

Probleme bei der Installation?
Antworten
dibbegugger
User
Beiträge: 3
Registriert: Sonntag 23. August 2015, 16:14

Hallo zusammen!

Mit Python 3.4.2 unter Debian 8 (Jessie) versuche ich gerade, mich in GStreamer 1.0 einzuarbeiten. Dazu gibt es ein schönes GStreamer Application Development
Manual (1.5.2) (http://gstreamer.freedesktop.org/data/d ... manual.pdf). Dort scheitere ich schon am ersten Beispiel. Das ist zwar in C geschrieben, aber ich vermute, wenn in C ein "#include <gst/gst.h>" steht, müsste in Python ein "import gst" hinhauen. Tut es aber bei mir nicht:
ImportError: No module named 'gst'

Die folgenden Importe klappen (neben vielen anderen):
import gi
import gi.repository
import gtk

https://docs.python.org findet keine Ergebnisse zu den Suchbegriffen "gstreamer" oder "gst".

Da ich vermute, dass ich noch ein Paket installieren muss, frage ich zunächst:
Welches Paket muss ich noch installieren, damit der Import von gst klappt?

Falls ich mit meiner Vermutung schief gewickelt bin, frage ich: Was muss ich tun, damit ich die Funktionen von gst (z. B. gst_element_factory_make) nutzen kann?

Für Tipps danke ich heute schon!
BlackJack

@dibbegugger: Im `glib`-basierte Bibliotheken über das `gi`-Modul nutzen zu können müssen neben der eigentlichen Bibliothek auch die ”introspection”-Daten installiert werden. Die Paketnamen dafür fangen bei Debian mit `gir*` an. Wenn das entsprechende `gir<versionsnummer>-gstreamer-<versionsnummer>`-Paket installiert ist, dann sollte man ``from gi.repository import Gst`` ausführen können.
dibbegugger
User
Beiträge: 3
Registriert: Sonntag 23. August 2015, 16:14

Danke! Etwas weiter komme ich jetzt:

Code: Alles auswählen

from gi.repository import Gst
klappt (ohne dass ich weitere Pakete installieren musste; es waren schon diverse Pakete gir1.2* installiert).
Aber was mache ich jetzt? Das Manual stellt Funktionen wie zum Beispiel "gst_element_factory_make" vor. Ein

Code: Alles auswählen

>>> help("gst_element_factory_make")
bringt die Fehlermeldung

Code: Alles auswählen

no Python documentation found for 'gst_element_factory_make'
Was muss ich tun, damit ich die Funktionen von gst (z. B. gst_element_factory_make) nutzen kann?
Wie komme ich aus dem Manual von GStreamer auf die Funktionsnamen, die Python erwartet?
Wo ist das eventuell dokumentiert?

Wieder bedanke ich mich schon jetzt für Tipps!
BlackJack

@dibbegugger: Du must das Namensschema von den C-Funktionen entsprechend interpretieren. `glib` ist eine objektorientierte Bibliothek die aber in einer Sprache (C) geschrieben ist, die dafür keine besondere Unterstützung bietet. Es gibt also keine Objekte und Methoden sondern nur Strukturen und Funktionen. Namensräume gibt es auch nicht. Darum wird das immer alles in den Funktionsnamen gepackt. `gst` weil es eigentlich in einen Namensraum `Gst` gehört, `element_factory` weil die ”Klasse” für diese Methode eigenlich `ElementFactory` heisst, und dann der Methodenname `make`. Das ergibt dann:

Code: Alles auswählen

In [31]: Gst.ElementFactory.make?
Type:       function
String Form:<function make at 0x94fd2cc>
File:       /usr/lib/python2.7/dist-packages/gi/types.py
Definition: Gst.ElementFactory.make(*args, **kwargs)
Docstring:  <no docstring>
Dokumentation gibt es also nicht und nur die generischste aller möglichen Funktionssignaturen. Ist halt automatisch aus den gir-Daten „on the fly” generiert. Man muss sich also die GStreamer-Dokumentation anschauen. Demnach erwartet die Methode zwei Zeichenketten als Argumente. Wobei die zweite NULL (C) sein darf, was in Python dann auf `None` abgebildet wird.

Das erste Beispiel aus dem PDF das diese Funktion benutzt sieht also so aus (Python 2, aber das dürfte hier keinen Unterschied machen):

Code: Alles auswählen

#!/usr/bin/env python
from __future__ import absolute_import, division, print_function
import sys
from gi.repository import Gst


def main():
    Gst.init(sys.argv)
    element_type = 'fakesrc'
    element = Gst.ElementFactory.make(element_type, 'source')
    if not element:
        print('Failed to create element of type', element_type)
        sys.exit(1)


if __name__ == '__main__':
    main()
dibbegugger
User
Beiträge: 3
Registriert: Sonntag 23. August 2015, 16:14

Wunderbar! Das hilft mir weiter!
Jetzt werde ich mit viel Geduld und Vorsicht die GStreamer-Dokumentation lesen.
Herzlichen Dank!!
Antworten