2010-08-17 5 views
8

파이어 폭스 Gstreamer 바인딩을 사용하여 오디오를 재생하는 응용 프로그램을 작성하고 있지만 오디오를 디코딩하려고합니다. 즉, decodebin을 사용하여 데이터를 읽고 원시 PCM 버퍼를 받고 싶습니다. 특히, 전체 파일을 메모리로 읽는 대신 점진적으로 파일의 청크를 읽고 싶습니다.(파이썬) Gstreamer를 사용하여 오디오를 PCM 데이터로 디코딩

몇 가지 구체적인 질문 : Gstreamer로 어떻게이 작업을 수행 할 수 있습니까? 특히 pygst와 함께? 스트림에서 데이터를 읽는 데 사용해야하는 특정 "싱크"요소가 있습니까? pygst Buffer object에서 데이터를 읽는 기본 방법이 있습니까? 어떻게하면 "메인 루프"에 들어가기보다는 데이터를 소비하는 속도를 제어 할 수 있습니까?

+0

향후 참조 : 이것은 (elmarco의 도움으로) 생각해 낸 해결책이며 다른 프로젝트에서도 유용 할 수 있습니다. http://github.com/sampsyo/pylastfp/blob/master/lastfp/gstdec.py – adrian

답변

5

응용 프로그램에서 데이터를 다시 가져 오려면 권장 방법은 appsink입니다. this one 같은 간단한 오디오 플레이어 기준

(및 캡 = "오디오/X-원시 INT"로 & capsfilter을 decodebin하여 oggdemux/vorbisdec 교체) appsink로 변경 autoaudiosink 및 파이썬 함수 "new-buffer" 신호 연결 + "emit-signals"를 True로 설정하십시오. 이 함수는 PCM/int 데이터의 디코딩 된 덩어리를받습니다. 디코딩 속도는 디코딩하고 소비 할 수있는 속도에 따라 다릅니다. new-buffer 신호가 Gstreamer 쓰레드 컨텍스트에 있기 때문에, 그 기능을 잠/대기 시켜서 디코딩 속도를 제어하거나 감속시킬 수 있습니다.

+0

감사합니다. 나는 앱 링크에 대해 몰랐다. 이것은 많은 도움이됩니다! – adrian

+2

추가 참고 사항 (나중에 참조 할 수 있음) 시도한 후 : 가능한 빨리 데이터를 가져 오기 위해 appsink의 "sync"속성을 false로 설정해야하는 것으로 보입니다. 그렇지 않으면 실시간으로 데이터를 사용하게됩니다. – adrian

+0

맞음, 나는 그것을 언급하는 것을 잊었다. – elmarco

관련 문제