Ich schreibe eine Anwendung, die die Python-Gstreamer-Bindungen zum Abspielen von Audio verwendet, aber ich versuche jetzt auch, nur Audio zu dekodieren - das heißt, ich möchte Daten mit einem decodebin
und erhalten einen rohen PCM-Puffer. Insbesondere möchte ich Teile der Datei inkrementell lesen, anstatt die gesamte Datei im Speicher zu lesen.
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
-Objekt zu lesen? Wie gehe ich vor, um die Rate zu steuern, mit der ich Daten konsumiere (anstatt nur eine "Hauptschleife" einzugeben)?
Um die Daten zurück in Ihre Anwendung zu bekommen, ist der empfohlene Weg appsink .
Basiert auf einem einfachen Audioplayer wie diesem (und ersetzt den oggdemux / vorbisdec by decodebin & amp; capsfilter mit caps="audio / x-raw-int"), ändere autoaudiosink in appsink und verbinde " neuer-buffer " Signal an eine Python-Funktion + set" emss-signals " zu Wahr. 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 Dekodiergeschwindigkeit zu steuern oder zu verlangsamen.