Я использую 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() (что дает точно такое же поведение).
Я использую GStreamer 0.10.35.0 (как сообщает Gst.version()) в Arch Linux 64, но я тестировал такое же поведение на GStreamer 0.10.32.0 в 32-разрядной версии Ubuntu 11.04.
Есть ли альтернатива bus.connect()? Я использую его неправильно? Я потратил довольно много часов на поиски этой ошибки, я был бы очень признателен за любую информацию об этом. Спасибо! знак равно