2017-04-12 140 views
0

在開發流音頻應用程序時,我使用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有沒有'詳細'模式?

謝謝。

回答

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,你應該看到大量的日誌記錄。