2010-08-17 6 views
8

Sto scrivendo un'applicazione che usa i collegamenti Python Gstreamer per riprodurre l'audio, ma ora sto provando a decodificare anche l'audio - cioè, I ' Mi piace leggere i dati usando un decodebin e ricevere un buffer PCM grezzo. Nello specifico, voglio leggere i blocchi del file in modo incrementale piuttosto che leggere l'intero file in memoria.Usa (Python) Gstreamer per decodificare l'audio (per dati PCM)

Alcune domande specifiche: come posso realizzare questo con Gstreamer? Con pygst in particolare? C'è un particolare elemento "sink" che devo usare per leggere i dati dallo stream? C'è un modo preferito per leggere i dati da un pygst Buffer object? Come faccio a controllare la velocità con cui consumo i dati (anziché entrare semplicemente in un "ciclo principale")?

+0

Altri riferimenti futuri: questa è la soluzione che ho trovato (con l'aiuto di elmarco), che potrebbe essere utile anche in altri progetti. http://github.com/sampsyo/pylastfp/blob/master/lastfp/gstdec.py – adrian

risposta

5

Per recuperare i dati nell'applicazione, il metodo consigliato è appsink.

Sulla base di un semplice lettore audio come this one (e sostituire l'oggdemux/vorbisdec da decodebin & capsfilter con tappi = "audio/x-raw-int"), il cambiamento autoaudiosink a appsink, e collegare "new-buffer" segnale ad una funzione pitone + imposta "emit-signals" su True. La funzione riceverà blocchi decodificati di dati PCM/int. Il tasso di decodifica dipende dalla velocità con cui è possibile decodificare e consumare. Poiché il segnale del nuovo buffer si trova nel contesto del thread Gstreamer, è possibile semplicemente sospendere/attendere in quella funzione per controllare o rallentare la velocità di decodifica.

+0

Grazie! Non sapevo di appink. Questo aiuta molto! – adrian

+2

Una nota aggiuntiva (per riferimenti futuri) dopo aver provato questo: sembra che sia necessario impostare la proprietà "sync" delle app su false per poter ottenere i dati il ​​più rapidamente possibile. Altrimenti, consumerai i dati in tempo reale. – adrian

+0

corretto, ho dimenticato di dirlo. – elmarco