11 feb. 2012

Python + GObject + Gstreamer + GTK3 (Parte 2)

Para poder trabajar con 4 lenguajes distintos es fundamental comenzar a entender el funcionamiento del que se encargara del trabajo pesado que en nuestro caso es Gstreamer, como ya les comente este depende de un ligero balance con GObject que se encarga de realizar el bucle sobre el que vive y corre Gstreamer.

Algunos podrán pensar en usar Pygst pero como no ha sido 100% portado a la nueva tecnología es mejor usar elementos conocidos que no cambian tanto en el tiempo al evolucionar las versiones del código.

Lo primero es entender el funcionamiento de Gstreamer. Para no complicarnos los módulos para reproducir contenido de Gstreamer son bastante amplios pero como esto es una primer aproximación realmente solo nos vamos a enfocar en Playbin que se encarga de reproducir cualquier cosa que le demos de comer.

Para quien desea leer un poco mas de la arquitectura y ejemplos pensados para pygtk y gtk2 es bueno ver esta pagina.

Volviendo al tema de playbin.
El código funciona de la siguiente forma.

Primero se crea un un elemento de Gstreamer que para efectos mas prácticos le podemos decir contenedor.

self.playbin = gst.element_factory_make("playbin2","player")

Después es necesario crear un elemento llamado bus que se encarga de escuchar cambios en el interior del contenedor.

bus = self.playbin.get_bus()

Como pueden ver usa get que es obtener en español. Lo que obtiene es información de lo que pasa dentro del contenedor que se llama playbin y creamos con las instrucción anterior.

Al bus es necesario agregarle un observador de señales ya que como sabemos al contenedor le llegaran y le saldrá información.

bus.add_signal_watch()


Este sistema entonces emite señales de lo que entra y sale del contenedor en todo momento pero tiene que almacenar esa información en alguna parte por lo que la siguiente linea se encarga de hacer el proceso de almacenamiento mas simple, al crear una función llamada self.mensajes donde guardaremos esa información importante.

bus.connect("messages", self.mensajes)


Vamos entonces a crear una función que es obligatoria como las anteriores para el funcionamiento de gstreamer. Y es el almacenador de los mensajes.

def self.mensajes(self, bus, messages):
     t = message.type
     if t == gst.MESSAGE_EOS:
           self.playbin.set_state(gst.STATE_NULL)

Esta primera parte de la definición en la función self.mensajes lo que hace es guardar en una variable t todos los mensajes que vengan del bus. Específicamente todos los mensajes que se producen cuando termina de reproducir algún contenido, el bus lee esos mensajes con una forma MESSAGE_EOS. Y lo siguiente que el sistema hace es decirle a Gstreamer que si no encuentra contenido pause (detenga) la reproducción, esto se hace con el comando set_state(gst.STATE_NULL).

     elif t == gst.MESSAGE_ERROR:
           self.playbin.set_state(gst.STATE_NULL)
           err, debug = message.parse_error()
           print "Error: %s" % err, debug

La segunda parte de la definición self.mensajes se encarga de decirle que hacer a gstreamer si lo que se intenta meter dentro del contener tiene errores o no se puede reproducir, en este caso primero pausa la reproducción y después crea un texto en consola donde se muestra la razón por lo que no se puede reproducir el contenido.

Con esto hemos terminado la segunda parte y ya sabemos como crear un playbin y que debe tener como obligatorio en Gstreamer para su correcto funcionamiento, en la próxima entrada comenzare a mostrar con ejemplos en GTK3 como trabajar con Gstreamer.

No hay comentarios:

Publicar un comentario en la entrada