拦截gstreamer插件中的总线消息

时间:2015-08-27 11:26:56

标签: plugins error-handling gstreamer

我正在编写一个使用uridecodebin的gstreamer插件。我希望能够拦截uridecodebin无法打开文件(由于格式错误的URI,未知文件格式或不存在的文件)之前发生的错误。 #39;使用管道向应用程序报告。当我尝试将自己的手表添加到uridecodebin总线时,它会失败(gst_bus_create_watch: assertion bus->priv->poll != NULL)并且我会遇到段错误。

如何在错误报告给应用程序之前拦截错误,以便我可以在内部优雅地失败?如果文件没有被加载,它不是整个插件的严重错误,并且我希望能够在发生这种情况时进行一些清理工作。

1 个答案:

答案 0 :(得分:0)

您需要阅读此页面:
http://gstreamer.freedesktop.org/data/doc/gstreamer/head/manual/html/chapter-bus.html

使用wxpython,我执行以下操作:

        # Create the bus to listen for messages
        bus = Gplayer.get_bus()
        bus.add_signal_watch()
        bus.enable_sync_message_emission()
        bus.connect('message', self.OnBusMessage)


#   Listen for gstreamer bus messages
    def OnBusMessage(self, bus, message):
        t = message.type
        if t == Gst.MessageType.ERROR:
            Gplayer.set_state(Gst.State.NULL)
            self.OnStop(None)
            wx.MessageBox('Gstreamer Error - Unsupported file type, Corrupt file,\
             Unable to access or Invalid Output Device', 'Error', wx.OK | wx.ICON_INFORMATION)     

或者在您的情况下,不要报告任何内容。

编辑:
您可以解析消息以查看将成为错误的第1部分和第2部分,这将是更详细的解释。

#   Listen for gstreamer bus messages
    def OnBusMessage(self, bus, message):
        t = message.type
        if t == Gst.MessageType.ERROR:
            print "Part 1",Gst.Message.parse_error (message)[0]
            print "part 2",Gst.Message.parse_error (message)[1]    

这是我从上面得到的遗失文件:
第1部分未找到
第2部分gstsouphttpsrc.c(1192):gst_soup_http_src_parse_status():/ GstPlayBin:playbin / GstURIDecodeBin:uridecodebin0 / GstSoupHTTPSrc:source: 找不到(404),网址:http://localhost/vvvv.mp3

注意:这假定您将代码添加到现有手表

编辑2:
关于你的第二条评论,你有没有调查过gst_bus_new() 乍一看,它可能对你有帮助。