【发布时间】:2011-08-10 01:50:56
【问题描述】:
我一直在一个项目中使用 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)和错误感兴趣)。使用我拥有的新系统:
... # other imports
from gi.repository import Gst
import glib
import gobject
.... # other imports
gobject.threads_init()
loop = glib.MainLoop(None, False)
def bus_handler(bus, message):
print message
# handle the message
...
Gst.init_check(None)
player = Gst.ElementFactory.make('playbin2', 'my_player')
player.set_property('uri', 'file:///home/kenji/button.ogg')
bus = player.get_bus()
bus.connect('message', bus_handler)
bus.add_signal_watch()
player.set_state(Gst.State.PLAYING)
# start the main loop
但是,处理程序总是将参数 message 接收为 None。我已经尝试过滤掉这些,但我仍然一无所获(即所有消息都是无)。
我已经阅读了很多 GStreamer 文档(尤其是关于 GstBus、add_signal_watch() 和 playbin2),但我没有找到与此行为相关的任何内容。我检查了 Gst gir 文件,发现 add_watch() 不能自省,所以这是一条死胡同。上面这个例子中的 glib 主循环只是为了在没有完整的 GTK 例子的情况下使事情变得更短,但真正的事情使用 Gtk.main() (给出完全相同的行为)。
我在 Arch Linux 64 上使用 GStreamer 0.10.35.0(由 Gst.version() 告知),但我在 Ubuntu 11.04 32 位上的 GStreamer 0.10.32.0 上测试了相同的行为。
是否有任何替代 bus.connect() 的方法?我是否以错误的方式使用它?我已经花了好几个小时来寻找这个错误,我真的很感激对此的任何见解。谢谢! =)
【问题讨论】:
-
我发现了这个bug:bugzilla.gnome.org/show_bug.cgi?id=631901 基本上还没有实现。
-
我可以确认这在 gstreamer 1.0 中已修复。