GStreamer总线发送无消息

Ken*_*nji 5 python gstreamer

我一直在项目中使用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
Run Code Online (Sandbox Code Playgroud)

消息参数具有属性.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
Run Code Online (Sandbox Code Playgroud)

但是,处理程序始终将参数消息作为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,我真的很感激任何有关这方面的见解.谢谢!=)

Ken*_*nji 1

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