2010-08-17 6 views
8

Ich schreibe eine Anwendung, die die Python Gstreamer Bindungen verwendet, um Audio abzuspielen, aber ich versuche jetzt auch nur Audio zu decodieren - das heißt, ich ' d möchte Daten mit einem decodebin lesen und einen rohen PCM-Puffer erhalten. Insbesondere möchte ich Teile der Datei inkrementell lesen, anstatt die gesamte Datei im Speicher zu lesen.Verwenden (Python) Gstreamer zum Decodieren von Audio (PCM-Daten)

Einige spezifische Fragen: Wie kann ich dies mit Gstreamer erreichen? Mit Pygst speziell? Gibt es ein bestimmtes "Sink" -Element, das ich verwenden muss, um Daten aus dem Stream zu lesen? Gibt es eine bevorzugte Möglichkeit, Daten von einem pygst Buffer object zu lesen? Wie gehe ich vor, um die Rate zu steuern, mit der ich Daten konsumiere (anstatt nur eine "Hauptschleife" einzugeben)?

+0

Mehr Referenz für die Zukunft: das ist die Lösung, die ich (mit Elmarcos Hilfe) entwickelt habe, was auch in anderen Projekten nützlich sein könnte. http://github.com/sampsyo/pynastfp/blob/master/lastfp/gstdec.py – adrian

Antwort

5

Um die Daten zurück in Ihre Anwendung zu bekommen, ist der empfohlene Weg .

Basierend auf einem einfachen Audio-Player wie this one (und die oggdemux/vorbisdec ersetzen durch decodebin & capsfilter mit Kappen = "audio/x-raw-int"), ändert autoaudiosink appsink und "new-buffer" Signal an eine Python-Funktion verbinden + setze "emss-signals" auf True. Die Funktion empfängt dekodierte Abschnitte von PCM/int-Daten. Die Geschwindigkeit der Decodierung hängt von der Rate ab, mit der Sie dekodieren und konsumieren können. Da sich das neue Puffersignal im Gstreamer-Thread-Kontext befindet, könnten Sie einfach in dieser Funktion schlafen/warten, um die Decodiergeschwindigkeit zu steuern oder zu verlangsamen.

+0

Vielen Dank! Ich wusste nichts von Appsink. Das hilft sehr! – adrian

+2

Eine zusätzliche Notiz (für zukünftige Referenz) nach dem Ausprobieren: Es scheint, dass Sie die "Sync" -Eigenschaft des Appsink auf false setzen müssen, um Daten so schnell wie möglich zu erhalten. Andernfalls verbrauchen Sie Daten in Echtzeit. – adrian

+0

richtig, ich habe vergessen, das zu erwähnen. – elmarco