Streaming multimedia con Flumotion

gstreamer

Flumotion es una plataforma de streaming escrito en Python. Es una buena alternativa para hacer streaming live o VoD. La implementación se basa en dos frameworks expectaculares: gstreamer y twisted.

Entre las demás alternativas existentes para streaming, flumotion es una buena alternativa aunque la versión libre no soporta ni RTP ni broadcast streaming. Flumotion es paquete debian, pero la versión que está empaquetada no ofrece los mismos servicios que la versión 0.3.2 que se utiliza en esta receta.

Introducción

Esta plataforma se descompone en tres niveles:

  • High level: En este nivel hay manager's, atmosphere y flows.
  • Mid level: demonios de manager's y sorker's
  • Low level: componentes

Sólo existe una atmósfera en la que existe un manager dentro del "planeta" y luego hay flujos que contienen semillas y demás movidas.
Esto no lo entiendo ni yo, pero es la paranoia del desarrollador, así que habrá que tenerlo en cuenta.

En fin, que este tipo de diseño permite una instalación distribuida ya que el manager puede ejecutarse en un host y luego tener uno
o varios workers que se encarguen de diferentes flujos y así conseguir un sistema distribuido "acojonante". Si queréis ver mas sobre
esto leed el manual, aunque no esperéis gran cosa.

Ingredientes

Lo primero es conseguir los fuentes de la versión
0.3.2 de flumotion. También se pueden conseguir en el repo subversion:

$ svn co https://core.fluendo.com/svn/flumotion/trunk flumotion

Instalación

Ahora toca compilar e instalar:

$ ./configure && make && sudo make install

En /usr/local/bin/ tendremos todos los ejecutables de la plataforma. Como Flumotion utiliza conexiones SSL para poder
administrar es necesario crearse un certificado con openssl o utilizar el de prueba que esta en conf/default.pem.

Por defecto el certificado debe estar en /usr/local/etc/flumotion/. Sino hay que indicar su ubicación por línea de comandos.

Prueba inicial

Lo primero ser ejecutar el manager:

$ flumotion-manager -d 3 conf/managers/default/planet.xml > log/manager.log &

Ahora, de momento, solo ejecutaremos un worker:

$ flumotion-worker -d 3 -u user -p test > log/worker.log &

Para ver las demás opciones consultar el manual. Aunque
no esperéis gran cosa.

Ahora lanzémos la interfaz de administración. Hay dos: una con gtk y otra con ncurses. Yo utilizo la de gtk:

$ flumotion-admin -v

Como se muestra en el manual la conexión con el manager se
puede hacer con o sin conexión SSL. Ya que nos ponemos, utilizamos SSL que por defecto se conecta por el puerto 7531. Si la conexión
no existe la creamos para futuros accesos. Lo primero que aparecerá en la interfaz de administración ser el wizard. Dentro de
el podremos configurar varios flujos, productores, consumidores, etc. Si le damos a todo "Siguiente" al final se crearan los jobs
necesarios para hacer nuestra primera prueba. Una vez arrancados todos los procesos es hora de probar el streaming. Por defecto podremos
acceder a el en la url http://localhost:8800/. Podremos acceder mediante un browser o con xine, mplayer, etc; en definitiva con el
reproductor multimedia que ms os guste. En este punto podremos observar la carta de ajuste de gstreamer.

La interfaz de administración en modo texto se llama: flumotion-admin-text y funciona de una forma similar a la anterior.

Configuración básica

Como alguien se habrá podido imaginar, los ficheros de configuración están en el directorio con/. Estos ficheros de configuración son
XML, lo cual facilita bastante el trabajo con la plataforma. El primer fichero a tener en cuenta es planet.xml:

 < planet >
  < manager name="planet" >
    < host >fulanito< /host >
    < port >50000< /port >
    < transport >TCP< /transport >
    < certificate>/path/default.pem< /certificate >
    < debug >5< /debug >

    < component name="manager-bouncer" type="htpasswdcrypt-bouncer" >
      < property name="data" >< ![CDATA[
 user:PSfNpHTkpTx1M
 ]] >< /property >
    < /component >
   < /manager >
 < /planet >

Para el worker es necesario el fichero default.xml en conf/workers:

< worker>
< worker name="default">
    < manager>
      < host>fulanito< /host>
      < port>50000< /port>
      < transport>< /transport>
    < /manager>

    < authentication type="plaintext">
      < username>user< /username>
      < password>test< /password>
    < /authentication>

    < feederports>8650-8669< /feederports>
    < debug>*:4< /debug>

< /worker>

Como mínimo es necesario un manager y luego se pueden utilizar tantos componentes como se necesiten. En este caso se utiliza
un "htpasswdcrypt-bouncer" para hacer la autenticación del administrador. En el worker hay que indicar el usuario/password
necesario para acceder a la interfaz de administración.

Otro fichero a tener en cuenta es el de los flujos. En principio se puede poner cualquier nombre a este fichero, pero habrá
que meterlo dentro de un directorio con el mismo nombre. Por ejemplo, dentro del directorio default/flows habrá que
añadir nuestros flujos. Por defecto, esta el fichero ogg-test-theora.xml para hacer pruebas. Su contenido es el
siguiente:

< ?xml version="1.0" ?>
< planet>
  < flow name="default">
    < component name="video-source" type="videotest" worker="localhost">
      < !-- properties -->
      < property name="format">video/x-raw-yuv< /property>
      < property name="framerate">50/10< /property>
      < property name="height">240< /property>
      < property name="pattern">0< /property>
      < property name="width">320< /property>
    < /component>
    < component name="video-encoder" type="theora-encoder" worker="localhost">
      < source>video-source< /source>
      < !-- properties -->
      < property name="bitrate">400< /property>
    < /component>
    < component name="muxer-video" type="ogg-muxer" worker="localhost">
      < source>video-encoder< /source>
    < /component>
    < component name="http-video" type="http-streamer" worker="localhost">
      < source>muxer-video< /source>
      < !-- properties -->
      < property name="bandwidth_limit">10< /property>
      < property name="burst_on_connect">True< /property>
      < property name="mount_point">/< /property>
      < property name="port">8800< /property>
      < property name="user_limit">1024< /property>
    < /component>
  < /flow>
< /planet>

Como puede verse, solo tenemos un flujo que se llama "default". Y luego hay cuatro componentes:

  • video-source: que es de tipo videotest y se le asocia al worker localhost.
  • video-encoder: que es de tipo theora-encoder.
  • muxer-video: de tipo ogg-muxer. Este componente es el contenedor del stream.
  • http-video: de tipo http-streamer, que "saca" el stream por http ap puerto 8800.

El componente video-source es un productor, que genera la carta de ajuste de gstreamer en formato YUV con un ratio de 5
y un tamao de 320x240. El siguiente, video-encoder toma como entrada el stream de video-source y lo codifica en
formato ogg con un bitrate de 400, para posteriormente ser "mezclado" por ogg-muxer. Y finalmente. http-video hace
el streaming final sobre http.

Para probar otras configuraciones podemos utilizar el wizard. Con el wizard podemos tomar streaming a partir de webcams, cmaras
digitales, capturadores de TV, etc. Segn para lo que queramos nuestro servidor seleccionamos uno u otro. Tambin podemos elegir
audio o video, o los dos con overlay incluido; para finalmente pasarlo por http por nuestro puerto preferido. Todo esto configurable
fcilmente mediante la interfaz grfica.

Configuracin intermedia

En el apartado anterior solo hemos visto ejemplos bsicos (y lo que queda por llegar). Ahora es hora de ver todos los componentes
disponibles en la versin 0.3.2. Para ver los componentes disponibles hay que utilizar el comando:

$ flumotion-inspect

El cual nos mostrar los componentes y plugs disponibles en nuestra versin. Si utilizais un versin antiga vereis como disponeis
de menos componentes, como es el caso de la versin empaquetada para debian. Para obtener ms informacin sobre un componente
concreto hacer:

$ flumotion-inspect http-server

por ejemplo. Veremos las propiedades del componente http-server, que es el que voy a utilizar para el próximo ejemplo de
configuración. Este componente te permite tomar como fuente un fichero multimedia (usa ogg/vorbis por dios) y el solito se
encarga de hacer el streaming sobre la url que le especifiquemos. El fichero de flujo nuevo quedará así:

< ?xml version="1.0" ?>
< planet>
  < flow name="default">
    < component name="HTTP" type="http-server" version="0.3.2" worker="localhost">
      < property name="hostname">fulanito< /property>
      < property name="mount-point">/< /property>
      < property name="path">/var/www/video.ogg< /property>
      < property name="port">8800< /property>
    < /component>
  < /flow>
< /planet>

Accediendo a la URL: http://fulanito:8800 veremos nuestro video en HTTP streaming.

Configuración avanzada

Ya lo haré.

Visualizar el streaming

Anteriormente he comentado como se podría ver el video en streaming, bien mediante un browser o bien mediante nuestro reproductor
multimedia favorito. Pero cuando se pretende que el acceso a estos contenidos multimedia sean portables (todo el mundo me entiende)
es necesario buscar otro tipo de alternativas. La mejor sin duda es utilizar un browser y en esto ya han pensado los desarrolladores
de flumotion. Para ello han desarrollado cortado. Cortado es un applet que permite una
fácil visualización de los streams. Utilizarlo es muy sencillo, tan solo hay que añadirlo a nuestra web:

< \applet width="320" height="240" code="com.fluendo.player.Cortado.class"
archive="http://stream.fluendo.com/cortado/cortado-ovt-debug.jar" >

< param value="http://fulanito:8800/" name="url" />
< param value="true" name="seekable" />
< param value="53.9" name="duration" />
< param value="10.0" name="framerate" />
< param value="true" name="keepaspect" />
< param value="true" name="video" />
< param value="false" name="audio" />
< param value="200" name="bufferSize" />< /applet>

Según los requisitos, podemos configurar de una forma u otra los diferentes parametros del applet. Para ello consultar el API del applet.

Referencias

TODO

Instalación distribuida.
Configuración avanzada del server.
Configuración avanzada de cortado.
Otra receta de VideoLAN.
Otra receta de Icecast2.

Comentarios

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.

Consulta sobre el flumotion-manager

Hola Arturo.

Antes que nada, gracias por esta receta.

¿De casualidad te habrás encontrado que al correr el flumotion-manager, el niño te diga que no logra leer la configuración del planet.xml... y que no puede hacer un parsing de los parámetros?

"Could not read configuration from '/ruta/planet.xml' Error: failed to parse %s %s %s"

¡Saludos y gracias!

Imagen de arturo

La verdad es que hace tiempo

La verdad es que hace tiempo que no trabajo con flumotion. Revisa permisos del fichero, contenido del fichero (no vaya a ser que en versiones nuevas haya cambiado el formato del planet.xml), rutas de ficheros, ...

Saludos.

**********************************************************************************
Hay tontos que tontos parecen, hay tontos que tontos son, pero
hay una clase peor de tontos que hacen parecer tontos a los que
listos son.
*****************************

Imagen de brue

Gracias ...

...por la receta

--
·brue
·vigilando

brue

flows

No consigo darme cuenta d donde estan los flows, por ejemplo en la carpeta flows esta el archivo de configuración ogg-test-theora.xml, pero donde está el archivo de video?
Disculpen si es una tonteria. Gracias y saludos.

Imagen de arturo

De nada. Animate a

De nada. Animate a completarla tu que sabes más de esto que yo.

Un saludo, Arturo.

**********************************************************************************
Hay tontos que tontos parecen, hay tontos que tontos son, pero
hay una clase peor de tontos que hacen parecer tontos a los que
listos son.
**********************************************************************************

**********************************************************************************
Hay tontos que tontos parecen, hay tontos que tontos son, pero
hay una clase peor de tontos que hacen parecer tontos a los que
listos son.
*****************************

Imagen de arturo

Espero que esta receta sea

Espero que esta receta sea del agrado del administrador y no la elimine
como ha hecho con otros comentarios mios, para que así mi libertad de
expresión no se vea coartada en este portal.

Un saludo, Arturo.

**********************************************************************************
Hay tontos que tontos parecen, hay tontos que tontos son, pero
hay una clase peor de tontos que hacen parecer tontos a los que
listos son.
**********************************************************************************

**********************************************************************************
Hay tontos que tontos parecen, hay tontos que tontos son, pero
hay una clase peor de tontos que hacen parecer tontos a los que
listos son.
*****************************

Imagen de david.villa

Aclaración

En lo que me toca por alusiones:

La moderación de comentarios es labor de los editores y también de todos los usuarios en menor medida, no del administrador. Y si yo (como editor) he eliminado algún comentario tuyo (o de cualquiera), ha sido por considerarlo "fuera de tema" u ofensivo para otros usuarios, puesto que no he censurado ningún comentario de nadie por otro motivo distinto de esos. Eso no descarta por supuesto que otro editor o administrador aplique criterios diferentes.

Si tienes mucho interés en que alguno de esos comentarios borrados de los que hablas aparezca, se puede someter a moderación pública.

Muy interesante la receta, por cierto.

No soy portavoz de ningún colectivo, grupo o facción. Mi opinión es personal e intransferible.