sábado, 18 de septiembre de 2010

Guia de uso de pygst


Guia de uso de pygst.

El siguiente documento explica la implementación de gstreamer en python sobre gtk, utilizando la interfaz pygst. (El código de ejemplo es CeibalMedia.activity(0.0).xo)

Recepción de video por la red y reproducción en widget gtk:

En terminal (recibir sólo video):

gst-launch udpsrc port=5000 ! smokedec ! autovideosink

En pygst (recibir sólo video):

          def construir_pipeline(self, ip, puerto):
                    self.pipeline = gst.Pipeline("player")
                    # recepcion por UDP
                    udpsrc = gst.element_factory_make("udpsrc", "udpsrc0")
                    udpsrc.set_property('port', puerto)
                    # decodificar
                    smokedec = gst.element_factory_make("smokedec", "codec5")
                    sink = gst.element_factory_make("autovideosink", "SalidadeVideoaWidget")
                    # enlazar
                    self.pipeline.add(udpsrc, smokedec, sink)
                    gst.element_link_many(udpsrc, smokedec, sink)

Detalle:
El procedimiento de trabajo con gstreamer es muy sencillo.
Se crea una tubería de elementos donde la salida de cada uno de ellos, se convierte en la entrada para el siguiente.
De esta forma, establecemos un origen de datos, los procesamos y los mandamos a una salida.
En pygst, la tubería se construye a partir de elementos pygst, estos elemento poseen propiedades cuyos valores pueden
establecerse mediante set_property. En este ejemplo en particular, tenemos sólo 3 elementos:
  •           Origen de datos: udpsrc
  •           Decodificador: smokedec
  •           Salida de Video: autovideosink

Envío de Video por la Red:

En terminal (enviar sólo video):

gst-launch v4l2src ! video/x-raw-yuv,width=320,height=240,framerate=\(fraction\)2/1 ! ffmpegcolorspace ! smokeenc keyframe=8 qmax=40 ! udpsink host=192.168.1.5 port=5000

En pygst (enviar sólo video):

          def construir_pipeline(self):
                    self.pipeline = gst.Pipeline("player")
                    source = gst.element_factory_make("v4l2src", "camara")
                    codec2 = gst.element_factory_make("videorate", "codec2")
                    codec3 = gst.element_factory_make("videoscale", "codec3")
                    codec4 = gst.element_factory_make("ffmpegcolorspace", "codec4")
                    smokeenc = gst.element_factory_make("smokeenc", "codec5")
                    smokeenc.set_property('keyframe', 8)
                    smokeenc.set_property('qmax', 40)
                    udpsink = gst.element_factory_make("udpsink", "udpsalida")
                    udpsink.set_property('host', "192.168.1.5")
                    udpsink.set_property('port', 5000)
                    self.pipeline.add(source, codec2, codec3, codec4, smokeenc, udpsink)
                    gst.element_link_many(source, codec2, codec3, codec4, smokeenc, udpsink)

Detalle:
De acuerdo al código que recibe la señal, vemos que en el código de envío, si bien es más extenso, las diferencias son menores:

En el código que recibe la señal, inmediatamente despues del origen de datos (udpsrc), encontramos un decodificador (smokedec) y luego la salida al widget asignado para mostrar los datos.

En el código de envío, en lugar de un decodificador, necesitamos el codificador por eso antes de enviar los datos, tenemos smokeenc, y en lugar de enviar los datos a un widget gtk, los enviamos a la red (udpsink).

Los elementos videorate, videoscale y ffmpegcolorspace establecen el modo de video utilizado y por lo tanto los datos enviados.

En este ejemplo, hemos utilizado los siguientes elementos de gstreamer:

Origen de datos: v4l2src y udpsrc
Filtros: videorate, videoscale y ffmpegcolorspace
Codificadores: smokeenc
Decodificadores: smokedec
Salida de datos: autovideosink y udpsink

De modo que, siquiendo esta mecánica, es muy sencillo implementar pygst , todo depende de los elementos disponibles y del conocimiento que tengamos de éstos. Siempre puedes consultar sobre los elementos gstreamer para saber cuales son sus propiedades o cuales están disponibles en nuestro sistema.

Si por ejemplo deseas saber sobre el elemento videorate, en terminal escribes:
gst-inspect-0.10 videorate

Para saber sobre los elementos disponibles, simplemente escribes:
gst-inspect-0.10


Ceibal Jam – Uruguay. (Flavio Danesse – fdanesse@hotmail.com)

No hay comentarios:

Publicar un comentario en la entrada