我正在编写一个使用uridecodebin
的gstreamer插件。我希望能够拦截uridecodebin
无法打开文件(由于格式错误的URI,未知文件格式或不存在的文件)之前发生的错误。 #39;使用管道向应用程序报告。当我尝试将自己的手表添加到uridecodebin
总线时,它会失败(gst_bus_create_watch: assertion bus->priv->poll != NULL
)并且我会遇到段错误。
如何在错误报告给应用程序之前拦截错误,以便我可以在内部优雅地失败?如果文件没有被加载,它不是整个插件的严重错误,并且我希望能够在发生这种情况时进行一些清理工作。
答案 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()
乍一看,它可能对你有帮助。