GStreamer总线不发送消息

2024-06-16 10:38:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我在一个项目中使用了pygst,它运行得很好。我试图把它移植到新的内省系统(GI),但是我得到了不同的行为。在

像pygst这样的东西:

... # other imports
import pygst
pygst.require('0.10')
import gst
... # other imports

gobjects.threads_init()

...

def my_handler(bus, message):
    # handle the message

...

player = gst.element_factory_make('playbin2', 'my_player')
bus = player.get_bus()
bus.connect('message', my_handler)
bus.add_signal_watch()
...
player.set_state(gst.STATE_PLAYING)
# start the main Glib loop

message参数有一个属性.type,可用于选择性处理(我只对流结束(EOS)和错误感兴趣)。使用新系统我有:

^{pr2}$

但是,处理程序总是以None的形式接收参数消息。我试着过滤掉这些信息,但还是一无所获(即所有消息都是)。在

我读了很多GStreamer文档(尤其是关于GstBus的,add\u signal_watch()和playbin2),但我没有发现任何与此行为相关的内容。我检查了Gstgir文件,并且发现add\u watch()不能被内省,所以这是一个死胡同。上面这个例子中的glib主循环只是为了在没有完整的GTK示例的情况下使事情变得更短,但是实际的东西使用Gtk.main公司()(给出完全相同的行为)。在

我使用的是GStreamer 0.10.35.0(由Gst.版本())在ArchLinux64上,但我在Ubuntu11.0432位的gstreamer0.10.32.0上测试了相同的行为。在

有什么替代品吗总线连接()? 我用错了吗?我已经花了好几个小时找这个虫子了,我真的很感激你对这个问题的任何见解。谢谢!=)


Tags: theimportaddmessagemy系统importshandler
3条回答

我很肯定公认的答案是不正确的。add_signal_watch_fulladd_signal_watch之间的唯一区别是前者允许您设置事件源的优先级,而后者只使用G_PRIORITY_DEFAULT调用前者。您可以在Csource code,行号940中进行验证。优先级只是影响事件被触发的顺序,不应该影响是否被触发,当然也不会影响信号消息的内容,这就是这里的问题所在。我甚至用不同的优先级值对它进行了测试,如果有一种方法可以实现的话,我会吃了我的帽子。:-)

真正的答案是它不起作用。PyGObject和GStreamer0.10不能很好地协同工作。参见:

后者说:“请注意,尽管您可以将GStreamer0.10与PyGI一起使用,但关键功能在根本上是被破坏的,并且永远不会在GStreamer0.10中得到修复(因为它需要API中断)。”

那么,你的选择是:

  • 需要GStreamer 1.0。在
  • 使用旧的PyGST绑定。在
  • 在gstreamer0.10中使用PyGObject,但不能检查EOS之类的消息。只有非常基本的东西才有用。在

如果您不打算在程序中使用GTK,则必须运行gobject.Mainloop()以从总线获取消息。这和其他主循环一样,会冻结整个程序(如果它没有线程化的话),所以我通常会放一些类似的东西:

g_loop = threading.Thread(target=gobject.MainLoop().run)
g_loop.daemon = True
g_loop.start()

在一个不需要GUI但确实需要Gstreamer的程序的末尾。在

最后我使用了add_signal_watch_full(),不幸的是,它更加冗长。但是它工作得很好,我可以在我的处理程序上接收消息。在

相关问题 更多 >