He estado usando pygst en un proyecto y ha estado funcionando bien. Intento migrarlo al nuevo sistema de introspección (GI), pero he estado obteniendo un comportamiento diferente.El bus GStreamer envía Ninguno mensaje
En el antiguo pygst que tienen algo como esto:
... # 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
El parámetromensaje tiene un atributo .type que puede ser utilizado para el procesamiento selectivo (sólo estoy interesado en el final de corriente (EOS) y error). Usando el nuevo sistema que tengo:
... # 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
Sin embargo, el controlador siempre recibe el mensaje de parámetros como Ninguno. Intenté filtrar estos, pero sigo sin obtener nada (es decir, todos los mensajes son Ninguno).
He leído mucha documentación de GStreamer (especialmente en GstBus, add_signal_watch() y playbin2) pero no he encontrado nada relacionado con este comportamiento. He comprobado el archivo Gst gir y he visto que add_watch() no se puede introspectar, por lo que es un callejón sin salida. El bucle principal glib en este ejemplo de arriba es solo para hacer las cosas más cortas sin un ejemplo completo de GTK, pero el real usa Gtk.main() (dando exactamente el mismo comportamiento).
Estoy usando GStreamer 0.10.35.0 (según lo informado por Gst.version()) en Arch Linux 64, pero he probado el mismo comportamiento en GStreamer 0.10.32.0 en Ubuntu 11.04 de 32 bits.
¿Hay alguna alternativa a bus.connect()? ¿Lo estoy usando de forma incorrecta? He pasado bastantes horas buscando este error, realmente apreciaría cualquier idea sobre esto. ¡Gracias! =)
Encontré este error: https://bugzilla.gnome.org/show_bug.cgi?id=631901 Básicamente, aún no está implementado. –
Puedo confirmar que esto está solucionado en gstreamer 1.0. –