在开发流式音频应用程序时,我使用了 gst-launch-1.0 命令行工具来生成用于测试的 MPEG 传输流。这按预期工作(我能够从一个简单的 http 服务器提供流并使用 VLC 媒体播放器听到它)。然后,我尝试在 Python gstreamer 代码中复制该流的编码部分。连接服务器的 Python 版本正常,但听不到声音。我试图理解为什么命令行实现有效,但 Python 没有。我正在使用 Mac OS 10.11 和 Python 2.7。
有效的命令行如下:
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 是否有任何“详细”模式?
谢谢。