在開發流音頻應用程序時,我使用gst-launch-1.0命令行工具生成用於測試的MPEG傳輸流。這按預期工作(我能夠從簡單的http服務器提供流並使用VLC媒體播放器聽到它)。然後我嘗試在Python gstreamer代碼中複製該流的編碼部分。連接到服務器的Python版本沒問題,但沒有聽到任何聲音。我試圖理解命令行實現的工作原理,但是Python沒有。我正在使用Mac OS 10.11和Python 2.7。如何使用Python和Gstreamer創建MPEG2傳輸流管線
的起作用的命令行如下:
gst-launch-1.0 audiotestsrc freq=1000 ! avenc_aac ! aacparse ! mpegtsmux ! tcpclientsink host=127.0.0.1 port=9999
創建該gstreamer的管道Python的代碼如下。它實例化時不會產生任何錯誤,並且它已成功連接到http服務器,但無法通過VLC聽到聲音。我驗證了Python代碼中的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)
我的問題是,我在Python中實現的gstreamer管道與命令行管道有什麼不同?更一般地說,你怎麼調試這種事情? gstreamer有沒有'詳細'模式?
謝謝。