2017-04-12 139 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,你应该看到大量的日志记录。