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

在将错误报告给应用程序之前,我该如何截获该错误,以便可以在内部正常地失败?如果没有加载文件,对于整个插件来说这不是一个严重错误,我希望能够在发生这种情况时进行一些清理工作。

最佳答案

您需要阅读以下页面:
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),URL:http://localhost/vvvv.mp3

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

编辑2:
关于您的第二条评论,您是否调查过gst_bus_new()。
乍一看,可能会对您有所帮助。

09-12 19:13