【问题标题】:How to create MPEG2 Transport Stream Pipeline Using Python and Gstreamer如何使用 Python 和 Gstreamer 创建 MPEG2 传输流管道
【发布时间】:2017-04-12 01:06:27
【问题描述】:

在开发流式音频应用程序时,我使用了 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 是否有任何“详细”模式?

谢谢。

【问题讨论】:

    标签: streaming gstreamer mpeg2-ts python-gstreamer gstreamer-1.0


    【解决方案1】:

    一次一个问题:

    1) 它与 gst-launch-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 运行您的应用程序,您应该会看到大量日志记录。

    【讨论】:

      猜你喜欢
      • 2013-07-26
      • 2017-06-05
      • 2011-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多