我正在编写一个使用 uridecodebin
的 gstreamer 插件。 .我希望能够拦截 uridecodebin
时发生的错误。在使用管道向应用程序报告之前无法打开文件(由于 URI 格式错误、文件格式未知或文件不存在)。当我尝试将 watch 添加到 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),网址:http://localhost/vvvv.mp3
注意:这假设您将代码添加到现有 watch
编辑2:
关于您的第二条评论,您是否调查了 gst_bus_new()。
乍一看,它可能会对您有所帮助。
关于plugins - 在 gstreamer 插件中拦截总线消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32248148/