0

스트리밍 오디오 응용 프로그램을 개발할 때 gst-launch-1.0 명령 줄 도구를 사용하여 테스트 용 MPEG 전송 스트림을 생성했습니다. 이것은 의도 한대로 작동했습니다 (간단한 http 서버에서 스트림을 제공하고 VLC 미디어 플레이어를 사용하여들을 수있었습니다). 그런 다음 파이썬 gstreamer 코드에서 해당 스트림의 인코딩 부분을 복제하려고했습니다. 서버에 연결된 Python 버전은 정상이지만 오디오는들을 수 없습니다. 커맨드 라인 구현이 왜 효과가 있었는지 이해하려고 노력하고 있지만 파이썬은 그렇지 못했습니다. Mac OS 10.11 및 Python 2.7에서 작업하고 있습니다. gstreamer를 파이프 라인을 만들어Python과 Gstreamer를 사용하여 MPEG2 전송 스트림 파이프 라인을 만드는 방법

gst-launch-1.0 audiotestsrc freq=1000 ! avenc_aac ! aacparse ! mpegtsmux ! tcpclientsink host=127.0.0.1 port=9999 

파이썬 코드는 다음과 같습니다 : 다음과 같은 일을

명령 줄이었다. 오류가 발생하지 않고 인스턴스화되었으며 http 서버에 성공적으로 연결되었지만 VLC를 통해 소리가 들리지 않습니다. 파이썬 코드의 AppSrc가 오디오를 직접 재생하는 별도의 gstreamer 파이프 라인을 사용하여 작동하고 있음을 확인했습니다. 이것은 잘 동작했다.

def create_mpeg2_pipeline(): 
    play = Gst.Pipeline() 
    src = GstApp.AppSrc(format=Gst.Format.TIME, emit_signals=True) 
    src.connect('need-data', need_data, samples()) # need_data and samples defined elsewhere 
    play.add(src) 

    capsFilterOne = Gst.ElementFactory.make('capsfilter', 'capsFilterOne') 
    capsFilterOne.props.caps = Gst.Caps('audio/x-raw, format=(string)S16LE, rate=(int)44100, channels=(int)2') 
    play.add(capsFilterOne) 
    src.link(capsFilterOne) 

    audioConvert = Gst.ElementFactory.make('audioconvert', 'audioConvert') 
    play.add(audioConvert) 
    capsFilterOne.link(audioConvert) 

    capsFilterTwo = Gst.ElementFactory.make('capsfilter', 'capsFilterTwo') 
    capsFilterTwo.props.caps = Gst.Caps('audio/x-raw, format=(string)F32LE, rate=(int)44100, channels=(int)2') 
    play.add(capsFilterTwo) 
    audioConvert.link(capsFilterTwo) 

    aacEncoder = Gst.ElementFactory.make('avenc_aac', 'aacEncoder') 
    play.add(aacEncoder) 
    capsFilterTwo.link(aacEncoder) 

    aacParser = Gst.ElementFactory.make('aacparse', 'aacParser') 
    play.add(aacParser) 
    aacEncoder.link(aacParser) 

    mpegTransportStreamMuxer = Gst.ElementFactory.make('mpegtsmux', 'mpegTransportStreamMuxer') 
    play.add(mpegTransportStreamMuxer) 
    aacParser.link(mpegTransportStreamMuxer) 

    tcpClientSink = Gst.ElementFactory.make('tcpclientsink', 'tcpClientSink') 
    tcpClientSink.set_property('host', '127.0.0.1') 
    tcpClientSink.set_property('port', 9999) 
    play.add(tcpClientSink) 
    mpegTransportStreamMuxer.link(tcpClientSink) 

제 질문은 파이썬에서 구현 한 gstreamer 파이프 라인이 명령 행 파이프 라인과 어떻게 다릅니 까? 그리고 더 일반적으로, 당신은 어떻게 이런 종류의 일을 디버깅합니까? gstreamer에 '자세한 정보 표시'모드가 있습니까?

감사합니다. 한 번에

답변

0

질문 하나 :

1) 어떻게 GST-출시-1.0의 차이점은 무엇입니까? 전체 코드를 보지 않고도 말하기는 어렵지만 추측하려고합니다. gst-launch-1.0은 적절한 패드 연결을 수행합니다. 귀하가 muxer과 같은 경우 싱크 패드 없이도 직접 연결할 수 없습니다. 연결하기 전에 하나를 생성하도록 요청해야합니다. 동적 패드를 살펴보십시오. https://gstreamer.freedesktop.org/documentation/application-development/basics/pads.html

또한 gst-launch-1.0에는 오류 처리 기능이있어 모든 작업이 성공했는지 확인하고 그렇지 않은 경우 오류를보고합니다. 최소한 GstBus 메시지 처리기를 추가하여 오류 메시지를 알리는 것이 좋습니다. 또한 GStreamer에서 호출하는 함수에 대한 반환을 확인해야합니다. 그러면 프로그램에서이 연결 오류를 포착 할 수 있습니다.

2) Gstreamer 디버깅? 대부분 GST_DEBUG 변수를 설정하여 수행 : https://gstreamer.freedesktop.org/documentation/tutorials/basic/debugging-tools.html#the-debug-log

과 함께 응용 프로그램을 실행 GST_DEBUG=6 ./yourapplication 및 로깅을 많이 볼 수 있습니다.