我在一个项目中使用了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上测试了相同的行为。在
有什么替代品吗总线连接()? 我用错了吗?我已经花了好几个小时找这个虫子了,我真的很感激你对这个问题的任何见解。谢谢!=)
我很肯定公认的答案是不正确的。
add_signal_watch_full
和add_signal_watch
之间的唯一区别是前者允许您设置事件源的优先级,而后者只使用G_PRIORITY_DEFAULT
调用前者。您可以在Csource code,行号940中进行验证。优先级只是影响事件被触发的顺序,不应该影响是否被触发,当然也不会影响信号消息的内容,这就是这里的问题所在。我甚至用不同的优先级值对它进行了测试,如果有一种方法可以实现的话,我会吃了我的帽子。:-)真正的答案是它不起作用。PyGObject和GStreamer0.10不能很好地协同工作。参见:
后者说:“请注意,尽管您可以将GStreamer0.10与PyGI一起使用,但关键功能在根本上是被破坏的,并且永远不会在GStreamer0.10中得到修复(因为它需要API中断)。”
那么,你的选择是:
如果您不打算在程序中使用GTK,则必须运行
gobject.Mainloop()
以从总线获取消息。这和其他主循环一样,会冻结整个程序(如果它没有线程化的话),所以我通常会放一些类似的东西:在一个不需要GUI但确实需要Gstreamer的程序的末尾。在
最后我使用了
add_signal_watch_full()
,不幸的是,它更加冗长。但是它工作得很好,我可以在我的处理程序上接收消息。在相关问题 更多 >
编程相关推荐