tag:blogger.com,1999:blog-31073360794415579082024-03-08T07:40:07.821-08:00ArgosDistribución de flujos multimedia en sistemas heterogéneos en redJosé-Luis Segurahttp://www.blogger.com/profile/01330405590078064402noreply@blogger.comBlogger23125tag:blogger.com,1999:blog-3107336079441557908.post-52560839807849444182010-07-28T09:46:00.000-07:002010-07-28T10:26:33.216-07:00Conectar dos MMDevices desde consola: argos_configPara poder probar todo lo contado en las anteriores entradas era necesario tener un elemento externo a los ya explicados que fuera el encargado de realizar la conexión entre los MMDevices.<div><br /></div><div>Para ello, desarrollé un pequeño (¡58 líneas!) programa en Python que únicamente solicitaba la conexión entre dos MMDevices, que eran pasados en forma de <i>stringfied proxies</i> al programa mediante argumentos.</div><div><br /></div><div>Además, siguiendo las directrices de AVStreams, también se debía crear un objeto de la clase StreamCtrl (control del flujo), que a su vez debería estar accesible públicamente. Esto último se ha "obviado" en cierto modo, ya que el programa termina nada más establecer la conexión entre los dos extremos, por lo que el objeto de tipo StreamCtrl desaparece al poco de ser creado. A fin de cuentas, este programa es el que pretendo utilizar para realizar algunas pruebas automáticas a los elementos del sistema (cosa que entrará, si FSM quiere, en otro post).</div><div><br /></div><div>Ahora, vamos a utilizarlo...</div><div><br /></div><div><span class="Apple-style-span" style="font-size: large;">Descarga de <b>argos_config</b></span></div><div><span class="Apple-style-span" style="font-size: medium;">Como el resto de Argos, se puede encontrar en el repositorio Mercurial:</span></div><div><span class="Apple-style-span" style="font-size: medium;"><br /></span></div><div><span class="Apple-style-span" style="font-size: medium;">$ hg clone http://arco.esi.uclm.es/~josel.segura/pfc</span></div><div><span class="Apple-style-span" style="font-size: medium;"><br /></span></div><div><span class="Apple-style-span" style="font-size: medium;">Dentro del directorio software/src/CliConfigurator está el ejecutable, que a la vez es el fichero de código fuente al tratarse de Python.</span></div><div><span class="Apple-style-span" style="font-size: medium;"><br /></span></div><div><span class="Apple-style-span" style="font-size: large;">Ejecución de <b>argos_config</b></span></div><div><span class="Apple-style-span" style="font-size: medium;">Para ejecutarlo deberemos tener en cuenta que la sintaxis correcta para el comando es la siguiente:</span></div><div><span class="Apple-style-span" style="font-size: medium;"><br /></span></div><div><span class="Apple-style-span" style="font-size: medium;">./argos_config [ICE options] A-Side-Proxy B-Side-Proxy</span></div><div><span class="Apple-style-span" style="font-size: medium;"><br /></span></div><div><span class="Apple-style-span" style="font-size: medium;">Los argumentos A-Side-Proxy y B-Side-Proxy son intercambiables, ya que la conexión entre ellos se realiza igual independientemente de quien tenga el rol de sumidero y quien el de fuente.</span></div><div><span class="Apple-style-span" style="font-size: medium;"><br /></span></div><div><span class="Apple-style-span" style="font-size: medium;">Los argumentos opcionales de Ice son los habituales vistos en los anteriores posts. Si no se pasa ninguno, <b>argos_config</b> intentará cargar el fichero de configuración Ice por defecto de Argos, que deberá estar en $HOME/.argos/ice_config (el equivalente a pasar como opción --Ice.Config=~/.argos/ice_config).</span></div><div><span class="Apple-style-span" style="font-size: medium;"><br /></span></div><div><span class="Apple-style-span" style="font-size: medium;">Sobra decir que para poder probar esta herramienta de configuración será necesario tener dos MMDevices funcionando. Por ejemplo, se podría conectar una <a href="http://argos-m.blogspot.com/2010/06/receta-desplegar-mediaserver-para.html">cámara Axis</a> o un <a href="http://argos-m.blogspot.com/2010/07/servir-una-camara-video4linux-2-con.html">dispositivo V4L2</a> con un <a href="http://argos-m.blogspot.com/2010/07/sumidero-en-tu-escritorio-renderapplet.html">sumidero de vídeo en escritorio</a>.</span></div><div><span class="Apple-style-span" style="font-size: medium;"><br /></span></div><div><span class="Apple-style-span" style="font-size: medium;"><br /></span></div><div><span class="Apple-style-span" style="font-size: medium;"><br /></span></div>José-Luis Segurahttp://www.blogger.com/profile/01330405590078064402noreply@blogger.com1tag:blogger.com,1999:blog-3107336079441557908.post-27475879146929539122010-07-25T02:20:00.001-07:002010-07-25T10:58:48.074-07:00Servir una cámara Video4Linux 2 con ArgosTras un parón en mis entradas, vuelvo a la carga para contar como servir cámaras (o cualquier otro dispositivo) que funcionen utilizando la librería Video4Linux 2 (v4l2). Dentro de este grupo se engloban tanto cámaras USB, tarjetas capturadoras de televisión, TDT...<div><br /></div><div>Para desarrollar este servicio me he vuelto a apoyar del ya archi-comentado <a href="http://argos-m.blogspot.com/2010/07/servicio-de-negociacion.html">MMDeviceCreator</a>. La implementación del <b>V4L2Server </b>se ha realizado en Python.</div><div><br /></div><div>El flujo multimedia del dispositivo V4L2 se sirve utilizando un servidor RTSP proporcionado por el proyecto <a href="http://www.gstreamer.net/">Gstreamer</a>. La implementación del servidor RTSP de Gstreamer, a día de hoy, es algo tosca, ya que no está integrado al 100% con el resto del <i>framework</i>, y además, a pesar de proveer unos <i>bindings</i> para Python que hubieran sido muy útiles para mi implementación, estos están poco/nada documentados y, por lo que he probado, son inusables a día de hoy.</div><div><br /></div><div>A pesar de ello he decidido utlizarlo en detrimento de otras alternativas como <a href="http://www.videolan.org/vlc/">VideoLan VLC</a>, ya que su servidor RTSP no era configurable tan a medida como promete, en un futuro, el de Gstreamer.</div><div><br /></div><div>Tras esta entrada sobre las tecnologías utilizadas, vamos al meollo del asunto:</div><div><br /></div><div><b><span class="Apple-style-span" style="font-size: x-large;">Servir un dispositivo V4L2 utilizando Argos</span></b></div><div><span class="Apple-style-span" style="font-size: large;"><br /></span></div><div><span class="Apple-style-span" style="font-size: medium;">Lo primero será obtener los ejecutables. Para ello y como siempre, debes descargar el código desde el respositorio:</span></div><div><span class="Apple-style-span" style="font-size: medium;"><br /></span></div><div><span class="Apple-style-span" style="font-size: medium;"><span class="Apple-style-span" >$ hg http://arco.esi.uclm.es/~josel.segura/pfc</span></span></div><div><span class="Apple-style-span" style="font-size: medium;"><span class="Apple-style-span" ><br /></span></span></div><div><span class="Apple-style-span" style="font-size: medium;"><span class="Apple-style-span" >En el directorio software/src encontraréis, entre otros, los directorios <b>GstRTSPLaunch</b> y <b>v4l2Server</b>. El primero de ellos contiene el código del servidor RTSP que vamos a utilizar, mientras que el segundo es la fuente de V4L2 de Argos.</span></span></div><div><span class="Apple-style-span" style="font-size: medium;"><span class="Apple-style-span" ><br /></span></span></div><div><span class="Apple-style-span" ><span class="Apple-style-span" style="font-size: large;"><b>Compilar e instalar el servidor RTSP</b></span></span></div><div><span class="Apple-style-span" ><span class="Apple-style-span" style="font-size: medium;">Para compilar el servidor RTSP necesitaremos tener instaladas las librerías de desarrollo siguientes:</span></span></div><div><ul><li><span class="Apple-style-span" ><span class="Apple-style-span" style="font-size: medium;">Gstreamer 0.10 (en Debian y similares, paquete <b>libgstreamer0.10-dev</b>)</span></span></li><li><span class="Apple-style-span" ><span class="Apple-style-span" style="font-size: medium;">Gst-RTSP-Server 0.10 (en Debian y similares, paquete <b>libgstrtspserver-0.10-dev</b>)</span></span></li></ul><div><span class="Apple-style-span" ><span class="Apple-style-span" style="font-size: medium;">Con ellos instalados, dentro del directorio GstRTSPLaunch indicado anteriormente, ejecutaremos:</span></span></div></div><div><span class="Apple-style-span" ><span class="Apple-style-span" style="font-size: medium;"><br /></span></span></div><div><span class="Apple-style-span" ><span class="Apple-style-span" style="font-size: medium;">$ make</span></span></div><div><span class="Apple-style-span" ><span class="Apple-style-span" style="font-size: medium;">$ make install</span></span></div><div><span class="Apple-style-span" ><span class="Apple-style-span" style="font-size: medium;"><br /></span></span></div><div><span class="Apple-style-span" ><span class="Apple-style-span" style="font-size: medium;">Es posible que para el segundo paso (la instalación) hagan falta permisos de super-usuario.</span></span></div><div><span class="Apple-style-span" ><span class="Apple-style-span" style="font-size: medium;"><br /></span></span></div><div><span class="Apple-style-span" ><span class="Apple-style-span" style="font-size: medium;">Otro modo de conseguirlo es a través del paquete Debian que se puede descargar desde el repositorio de Gnesis, añadiendo la siguiente línea al fichero /etc/apt/sources.list:</span></span></div><div><span class="Apple-style-span" ><span class="Apple-style-span" style="font-size: medium;"><br /></span></span></div><div><span class="Apple-style-span" ><span class="Apple-style-span" style="font-size: medium;">deb http://babel.esi.uclm.es/gnesis sid main</span></span></div><div><span class="Apple-style-span" ><span class="Apple-style-span" style="font-size: medium;"><br /></span></span></div><div><span class="Apple-style-span" ><span class="Apple-style-span" style="font-size: medium;">Tras añadir la línea solo hará falta hacer:</span></span></div><div><span class="Apple-style-span" ><span class="Apple-style-span" style="font-size: medium;"><br /></span></span></div><div><span class="Apple-style-span" ><span class="Apple-style-span" style="font-size: medium;"># aptitude update</span></span></div><div><span class="Apple-style-span" ><span class="Apple-style-span" style="font-size: medium;"># aptitude install gst-rtsp-server</span></span></div><div><span class="Apple-style-span" ><span class="Apple-style-span" style="font-size: medium;"><br /></span></span></div><div><span class="Apple-style-span" ><span class="Apple-style-span" style="font-size: large;"><b>Ejecutando la fuente Argos de V4L2</b></span></span></div><div><span class="Apple-style-span" ><span class="Apple-style-span" style="font-size: large;"><b><span class="Apple-style-span" style="font-family: Georgia, serif; font-weight: normal; font-size: 16px; "><div><span class="Apple-style-span" ><span class="Apple-style-span" style="font-size: medium; ">Para ello vayamos al directorio v4l2Server comentado anteriormente.</span></span></div><div><span class="Apple-style-span" ><span class="Apple-style-span" style="font-size: medium; "><br /></span></span></div><div><span class="Apple-style-span" ><span class="Apple-style-span" style="font-size: medium; ">Dentro de ese directorio está el fichero ejecutable "v4l2server.py". Al ejecutarlo podremos pasarle el fichero de configuración Ice de la forma habitual (con el argumento --Ice.Config=fichero) o bien dejarlo sin poner (toma por defecto el fichero de configuración de $HOME/.argos/ice_config).</span></span></div><div><span class="Apple-style-span" ><span class="Apple-style-span" style="font-size: medium; "><br /></span></span></div><div><span class="Apple-style-span" ><span class="Apple-style-span" style="font-size: medium; ">Dentro del fichero de configuración se deberán definir las siguientes variables de configuración:</span></span></div><div><span class="Apple-style-span" ><span class="Apple-style-span" style="font-size: medium; "><br /></span></span></div><div><ul><li><span class="Apple-style-span" ><span class="Apple-style-span" style="font-size: medium;">Ice.Default.Locator: el <i>locator</i><b> </b>por defecto para la aplicación. Se utilizará para resolver nombres de proxies indirectos.</span></span></li><li><span class="Apple-style-span" ><span class="Apple-style-span" style="font-size: medium;">Adapter.Endpoints: el endpoint que tomará el adaptador de objetos de la aplicación.</span></span></li><li><span class="Apple-style-span" ><span class="Apple-style-span" style="font-size: medium;">Argos.MMDeviceDeployer: el proxy al servicio de negociación/creación de MMDevices comentado con anterioridad.</span></span></li></ul><div><span class="Apple-style-span" ><span class="Apple-style-span" style="font-size: medium;">En el repositorio podéis ver un ejemplo de este fichero de configuración guardado con el (original) nombre de "config".</span></span></div></div><div><span class="Apple-style-span" ><span class="Apple-style-span" style="font-size: medium;"><br /></span></span></div><div><span class="Apple-style-span" ><span class="Apple-style-span" style="font-size: medium;">Para ejecutar:</span></span></div><div><span class="Apple-style-span" ><span class="Apple-style-span" style="font-size: medium;"><br /></span></span></div><div><span class="Apple-style-span" ><span class="Apple-style-span" style="font-size: medium;">$ ./v4l2server.py --Ice.Config=config</span></span></div><div><span class="Apple-style-span" ><span class="Apple-style-span" style="font-size: medium;"><br /></span></span></div><div><span class="Apple-style-span" ><span class="Apple-style-span" style="font-size: medium;">Por ahora, y a falta de más pruebas, se supone que el dispositivo a servir es el ubicado en /dev/video0. A no mucho tardar añadiré la posibilidad de configurar esto desde el propio fichero de configuración.</span></span></div><div><span class="Apple-style-span" ><span class="Apple-style-span" style="font-size: medium;"><br /></span></span></div><div><span class="Apple-style-span" ><span class="Apple-style-span" style="font-size: large;"><b>¿Qué está ocurriendo tras todo esto?</b></span></span></div><div><span class="Apple-style-span" ><span class="Apple-style-span" style="font-size: medium;">Detrás de todo este "lío" lo que está ocurriendo es que el programa v4l2server.py está notificando al servicio MMDeviceCreator indicado su capacidad para servir un dispositivo v4l2. MMDeviceCreator creará un MMDevice y demás objetos asociados a las negociaciones de AVStreams.</span></span></div><div><span class="Apple-style-span" ><span class="Apple-style-span" style="font-size: medium;"><br /></span></span></div><div><span class="Apple-style-span" ><span class="Apple-style-span" style="font-size: medium;">Cuando alguien "conecte" este MMDevice con otro que tenga la capacidad de renderizar un flujo (por ejemplo, el <a href="http://argos-m.blogspot.com/2010/07/sumidero-en-tu-escritorio-renderapplet.html">RenderApplet</a>), ambos MMDevices comenzarán el proceso de configuración del flujo. Cuando le toqué, el MMDevice creado para nuestro v4l2Server preguntará a éste la cadena de conexión RTSP (u otro tipo de protocolo streaming que se implementara) y se la pasará al sumidero multimedia para que sea capaz de consumir dicho flujo.</span></span></div></span></b></span></span></div>José-Luis Segurahttp://www.blogger.com/profile/01330405590078064402noreply@blogger.com0tag:blogger.com,1999:blog-3107336079441557908.post-9236192339055630572010-07-05T11:22:00.000-07:002010-07-07T10:44:05.328-07:00Sumidero en tu escritorio: RenderApplet<div style="text-align: justify;">Siguiendo la veda iniciada en las dos entradas del blog anteriores, en esta entrada voy a presentaros RenderApplet.</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;"><b>RenderApplet</b> es un programa escrito en Python que utiliza el servicio <a href="http://argos-m.blogspot.com/2010/07/servicio-de-negociacion.html">MMDeviceCreator de negociación</a>. El programa está escrito en forma de applet de escritorio para Gnome: al activarlo se registrará en el servicio de negociación y, a partir de ese momento, dicho servicio negociará en su nombre las conexiones AVStreams, pasándole a <b>RenderApplet </b>la cadena de conexión resultado de dicha negociación.</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">La utilización como veis es bastante sencilla. Para poderlo probar sin necesidad de añadir el applet de escritorio también puede ejecutarse como aplicación "independiente" (aunque queda mucho peor :P).</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">Al estar escrito en Python, el código fuente y el ejecutable es el mismo. Para obtenerlo, descargad mi repositorio con Mercurial:</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">$ hg http://arco.esi.uclm.es/~josel.segura/pfc</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">Explorar en el directorio pfc/software/src/RenderApplet/RenderApplet y encontraréis el código de la aplicación.</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-size: large;"><b>Dos sabores</b></span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-size: medium;">Como he comentado anteriormente, el programa puede ejecutarse tanto como aplicación GTK normal y corriente y como <i>applet</i> de escritorio de Gnome.</span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-size: medium;"><br /></span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-size: medium;">Si eliges utilizar esta segunda opción, deberás realizar, antes de instalar, una configuración para que Gnome sea capaz de encontrar el <i>applet</i> en la ruta de instalación. No instalo directamente en la ruta por defecto dónde lo encontraría por no ensuciar los directorios que gestiona muy bien tu sistema gestor de paquetes ;)</span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-size: medium;"><br /></span></div><div style="text-align: justify;"><b><span class="Apple-style-span" style="font-size: large;">Argos Render como <i>applet</i></span></b></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-size: medium;">Si te decides a instalarlo como <i>applet</i>, deberás realizar lo siguiente antes de instalar:</span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-size: medium;"><br /></span></div><div><ol><li style="text-align: justify;"><span class="Apple-style-span" style="font-size: medium; ">Instala el programa bonobo-activation-sysconf. En sistemas Debian-based se encuentra en el paquete libbonobo2-bin.</span></li><li style="text-align: justify;"><span class="Apple-style-span" style="font-size: medium; ">Ejecuta, como super-usuario, lo siguiente:</span></li></ol><span class="Apple-style-span" style="font-size: medium;"><span class="Apple-style-span"># bonobo-activation-sysconf --add-directory=/usr/local/lib/bonobo/servers</span></span></div><div><span class="Apple-style-span" style="font-size: medium;"><span class="Apple-style-span"><br /></span></span></div><div><span class="Apple-style-span" style="font-size: medium;"><span class="Apple-style-span">Deberéis cambiar esta línea si habéis cambiado la ruta de instalación en el Makefile del prorgama</span></span></div><div><span class="Apple-style-span" style="font-size: medium;"><br /></span></div><div><b><span class="Apple-style-span" style="font-size: large;">Instalando</span></b></div><div><span class="Apple-style-span" style="font-size: medium;">Para instalar Argos Render Applet deberás ir, dentro del repositorio Mercurial, al directorio software/src/RenderApplet y ejecutar simplemente:</span></div><div><span class="Apple-style-span" style="font-size: medium;"><br /></span></div><div><span class="Apple-style-span" style="font-size: medium;"><span class="Apple-style-span">$ make install</span></span></div><div><span class="Apple-style-span" style="font-size: medium;"><span class="Apple-style-span"><br /></span></span></div><div><span class="Apple-style-span"><span class="Apple-style-span" style="font-size: medium;">Esto copiará todos los ficheros a sus rutas correspondientes.</span></span></div><div><span class="Apple-style-span"><span class="Apple-style-span" style="font-size: medium;"><br /></span></span></div><div><span class="Apple-style-span"><span class="Apple-style-span" style="font-size: medium;">EDITO: Es importante, pero se me había olvidado. Los programas Python que utilizan Ice pueden cargar los ficheros de definición de interfaces en tiempo de ejecución. Esto obliga a que, para ejecutar el applet, tengáis los ficheros Slice de Argos en una ubicación concreta. Para ello si me dio tiempo a realizar un paquete Debian que podéis encontrar en el siguiente repositorio:</span></span></div><div><span class="Apple-style-span"><span class="Apple-style-span" style="font-size: medium;"><br /></span></span></div><div><span class="Apple-style-span"><span class="Apple-style-span" style="font-size: medium;">deb http://babel.esi.uclm.es/gnesis unstable main</span></span></div><div><span class="Apple-style-span"><span class="Apple-style-span" style="font-size: medium;"><br /></span></span></div><div><span class="Apple-style-span"><span class="Apple-style-span" style="font-size: medium;">El paquete se llama <b>argos-slice</b>. Si no tenéis Debian o no queréis instalarlo, tendréis que bajarlos del repositorio Mercurial mencionado anteriormente. Se encuentran en el directorio software/src/slice y, si queréis copiarlos a la ubicación dónde el <i>applet</i> los buscará, deberéis hacer lo siguiente desde el directorio software/src/slice:</span></span></div><div><span class="Apple-style-span"><span class="Apple-style-span" style="font-size: medium;"><br /></span></span></div><div><span class="Apple-style-span"><span class="Apple-style-span" style="font-size: medium;"># make install</span></span></div><div><span class="Apple-style-span"><span class="Apple-style-span" style="font-size: medium;"><br /></span></span></div><div><span class="Apple-style-span"><span class="Apple-style-span" style="font-size: medium;">Esto copiará los ficheros en /usr/share/argos/slice, con lo que <b>Render Applet</b> será capaz de localizarlos.</span></span></div><div><span class="Apple-style-span"><span class="Apple-style-span" style="font-size: medium;"><br /></span></span></div><div><span class="Apple-style-span"><b><span class="Apple-style-span" style="font-size: large;">Haciendo que Gnome encuentre el <i>applet</i></span></b></span></div><div><span class="Apple-style-span"><span class="Apple-style-span" style="font-size: medium;">Si vas a usar el <i>applet</i> deberás reiniciar el servicio de búsqueda de <i>applets</i> de Gnome para que busque los nuevos recién instalados y puedas añadirlos a los paneles. Para ello hay dos opciones:</span></span></div><div><ul><li><span class="Apple-style-span"><span class="Apple-style-span" style="font-size: medium;">Reiniciar la sesión de tu usuario</span></span></li><li><span class="Apple-style-span"><span class="Apple-style-span" style="font-size: medium;">"Matar" los procesos "bonobo-activation-server" y "gnome-panel". Durante unos instantes desaparecerán todos tus paneles, pero a los pocos segundos volverán, tranquilo :)</span></span></li></ul><div><span class="Apple-style-span"><b><span class="Apple-style-span" style="font-size: large;">Fichero de configuración</span></b></span></div></div><div><span class="Apple-style-span"><span class="Apple-style-span" style="font-size: medium;">Como aplicación Ice que se precie, lo habitual es pasarle los parámetros de funcionamiento (como el <i>default locator</i> o proxys que necesite utilizar la aplicación a través de un fichero de configuración. Si lanzamos la aplicación como programa (no como <i>applet</i>) tan solo deberemos pasarle cualquier opción en la forma habitual que Ice la "parsearía" (--Ice.Config=... --Ice.Default.Locator=...).</span></span></div><div><span class="Apple-style-span"><span class="Apple-style-span" style="font-size: medium;"><br /></span></span></div><div><span class="Apple-style-span"><span class="Apple-style-span" style="font-size: medium;">Sin embargo, si se trata de un <i>applet</i> no podemos ejecutar y elegir que parámetros se le pasan al ser ejecutado, ya que esta ejecución la realizará el panel de Gnome. Por ello, el programa por defecto buscará en el directorio <i>home</i> del usuario un directorio que se llame .argos y, dentro de él, el fichero ice_config.</span></span></div><div><span class="Apple-style-span"><span class="Apple-style-span" style="font-size: medium;"><br /></span></span></div><div><span class="Apple-style-span"><span class="Apple-style-span" style="font-size: medium;">Todas las aplicaciones de usuario que voy a desarrollar cogerán su configuración de ese fichero si no la encuentran entre los parámetros de ejecución, sí que sería recomendable que esté escrito desde ya con parámetros que puedan utilizar todos los programas. Un ejemplo mínimo sería el siguiente:</span></span></div><div><span class="Apple-style-span"><span class="Apple-style-span" style="font-size: medium;"><br /></span></span></div><div><span class="Apple-style-span"><span class="Apple-style-span" style="font-size: medium;"><div>Ice.Default.Locator=IceGrid/Locator -t:tcp -h peter -p 4061</div><div>Argos.MMDeviceDeployer = MMDeviceCreator -t:tcp -h peter -p 15000</div><div><br /></div><div><span class="Apple-style-span" style="font-size: large;"><b>Ejecución del programa</b></span></div><div><ul><li><b>Ejecución como </b><i><b>applet</b></i><b>:</b> Sobre alguno de los paneles de Gnome pulsamos con el botón derecho del ratón en una zona libre y seleccionamos la opción "Añadir al panel". Se abrirá una ventana dónde podremos encontrar el "Argos Media Render Applet". Lo seleccionamos y le damos a "Añadir" y debería aparecernos un círculo rojo en nuestro panel (el <i>applet</i>).</li><li><b>Ejecución como programa externo:</b> vamos a la ruta del código fuente dónde está el programa o bien a la ruta de instalación (por defecto /usr/local/share/argos-render-applet) y ejecutar como un programa normal desde la terminal el fichero RenderApplet.py, pasándole como primer argumento la palabra "window". Aparecerá una nueva y pequeña ventana que incluye el mismo icono que podríamos ver en el panel si hubiéramos realizado la otra opción.</li></ul><div>En ambos casos, una vez hecho esto, si pulsáis en el círculo rojo (o el icono que aparezca, depende del tema de iconos de Gnome) éste pasará a ser verde y significará que, si las configuraciones son correctas, el programa se ha comunicado con el MMDeviceCreator para que cree un MMDevice y el resto de elementos AVStreams necesarios para gestionar la configuración. Una forma de comprobar que todo ha ido bien es, en el programa icegrid-gui, conectar con el <i>registry</i> y observar los objetos bien conocidos: debería aparecer un nuevo objeto, de tipo ::AVStreams::MMDevice, llamado $USER_render (dónde $USER es el nombre de tu usuario en tu máquina).</div><div><br /></div><div>En la próxima entrada explicaré brevemente como utilizar un pequeño programa de configuración para poder conectar entre si un sumidero y una fuente multimedia, y poderle así dar un uso visual al <i>applet</i>.</div><div><br /></div><div>Hasta pronto :)</div><div><br /></div></div><div><br /></div></span></span></div>José-Luis Segurahttp://www.blogger.com/profile/01330405590078064402noreply@blogger.com0tag:blogger.com,1999:blog-3107336079441557908.post-87214236718582472712010-07-03T12:24:00.000-07:002010-07-06T09:19:15.524-07:00MMDeviceCreator: instalación y puesta en marchaComo comenté en mi <a href="http://argos-m.blogspot.com/2010/07/servicio-de-negociacion.html">entrada anterior (Servicio de negociación)</a>, he escrito un servicio IceBox que proporciona, a aquellos clientes que lo necesiten, toda la negociación que puedan necesitar para realizar conexiones AVStream.<div><br /></div><div>En este post detallaré como instalar dicho servicio y como ponerlo en marcha. Allá vamos.</div><div><br /></div><div><span class="Apple-style-span" style="font-size: large; "><b>Instalación</b></span></div><div><span class="Apple-style-span" style="font-size: medium; ">Para instalarlo, en entornos Debian, solo habrá que tener esta línea en el fichero /etc/apt/sources.list</span></div><div><span class="Apple-style-span" style="font-size: medium; "><br /></span></div><div><span class="Apple-style-span" style="font-size: medium; ">deb http://babel.esi.uclm.es/gnesis/ unstable main</span></div><div><span class="Apple-style-span" style="font-size: medium; "><br /></span></div><div><span class="Apple-style-span" style="font-size: medium; ">y realizar lo siguiente:</span></div><div><span class="Apple-style-span" style="font-size: medium; "><br /></span></div><div><span class="Apple-style-span" style="font-size: medium; "># aptitude update</span></div><div><span class="Apple-style-span" style="font-size: medium; "># aptitude install libmmdevicecreator</span></div><div><span class="Apple-style-span" style="font-size: medium; "><br /></span></div><div><span class="Apple-style-span" style="font-size: medium; ">Para el resto de entornos GNU/Linux, <a href="http://arco.esi.uclm.es/~josel.segura/argos/libmmdevicecreator-0.5.tar.gz">libmmdevicecreator.tar.gz</a>: este fichero contiene tanto la librería (fichero .so) como dos ficheros, nombrados "config" y "config_MMDCS", que serán explicados en el siguiente punto.</span></div><div><span class="Apple-style-span" style="font-size: medium; "><br /></span></div><div><b><span class="Apple-style-span" style="font-size: large;">Puesta en marcha</span></b></div><div><span class="Apple-style-span" style="font-size: medium;">Como el resto de servicios implementados utilizando las ventajas de IceBox, para lanzarlo solamente hará falta escribir un par de ficheros de configuración: en uno de ellos, que será el que acepte el ejecutable de IceBox, se describirá como debe lanzarse el servicio (nombre de la librería, versión, orden en el caso de lanzarse varios servicios a la vez...). El otro fichero de configuración se le pasará al servicio propiamente dicho, y tendrá las variables que necesite para su ejecución. Estos ficheros se corresponden, respectivamente, con los que encontramos en el tarball.</span></div><div><span class="Apple-style-span" style="font-size: medium;"><br /></span></div><div><span class="Apple-style-span" style="font-size: medium;">Para lanzar el servicio, lo primero, deberemos tener la librería en una ubicación bien conocida para el ejecutable de IceBox. En el caso del paquete Debian no habrá ningún problema, pero en el caso del tarball deberemos copiar el fichero .so a /usr/local/lib o bien hacer que la variable de entorno LD_LIBRARY_PATH contenga el directorio dónde se encuentre el fichero.</span></div><div><span class="Apple-style-span" style="font-size: medium;"><br /></span></div><div><span class="Apple-style-span" style="font-size: medium; ">El fichero "config" tiene tan solo la configuración del "Default Locator" de nuestro entorno y la configuración de carga de la librería:</span></div><div><span class="Apple-style-span" style="font-size: medium;"><br /></span></div><div><span class="Apple-style-span" style="font-size: medium;">Ice.Default.Locator=IceGrid/Locator:tcp -h peter -p 4061</span></div><div><span class="Apple-style-span" style="font-size: medium;">IceBox.Service.MMDCS=MMDeviceCreator:createService --Ice.Config=config_MMDCS</span></div><div><span class="Apple-style-span" style="font-size: medium;"><br /></span></div><div><span class="Apple-style-span" style="font-size: medium;">Con esa configuración definimos un servicio IceBox llamado "MMDCS", el cual intentará cargar la librería "libMMDeviceCreator" a través de su punto de entrada "createService", pasándole la configuración del fichero config_MMDCS.</span></div><div><span class="Apple-style-span" style="font-size: medium;"><br /></span></div><div><span class="Apple-style-span" style="font-size: medium;">Este otro fichero es el que configura realmente el servicio, y además de la configuración del Default Locator, deberá incluir la configuración del endpoint para el MMDeviceCreatorAdapter, el proxy al PropertySetDefFactory, que nos proporciona el servicio de propiedades, y un par de variables Registry.username y Registry.password que contendrán, si los hubiera, el nombre de usuario y la password administrativa del Registry al que estamos conectados.</span></div><div><span class="Apple-style-span" style="font-size: medium;"><br /></span></div><div><span class="Apple-style-span" style="font-size: medium; "><span class="Apple-style-span" style="font-size: 16px; "><div><span class="Apple-style-span" style="font-size: medium; ">Para lanzarlo:</span></div><div><span class="Apple-style-span" style="font-size: medium; "><br /></span></div><div><span class="Apple-style-span" style="font-size: medium; ">$ icebox --Ice.Config=config</span></div><div><span class="Apple-style-span" style="font-size: medium; "><br /></span></div><div><span class="Apple-style-span" style="font-size: medium;">Al lanzarlo, obtendremos por la salida en el terminal algo como lo siguiente:</span></div><div><span class="Apple-style-span" style="font-size: medium;"><br /></span></div><div><span class="Apple-style-span" style="font-size: medium;"><div>[INFO] [MMDevice Creator] Starting service</div><div>[INFO] [MMDevice Creator] PropertySetDefFactory proxy: PropertySetFactory -t @ AutoPropertyService.Adapter</div><div>[INFO] Negotiator -t:tcp -h 192.168.1.2 -p 15000</div><div><br /></div><div>Esa última línea es la que los clientes deberán utiliazr para poder utilizar el servicio. Si se realizara un despliegue a a través de IceGrid, este último proxy sería un objeto bien conocido, por lo que el acceso para los clientes sería más sencillo aún.</div><div><br /></div><div>En la próxima entrada os contaré como utilizar el primer cliente que hice para este servicio: un sumidero que se activa a través de un applet de escritorio y que, por ahora, podréis probar con una cámara Axis, si es que la tenéis claro :P</div><div><br /></div><div>Edición: Por recomendación de mi director de Proyecto os doy las instrucciones para descargar desde el repositorio el código fuente:</div><div><br /></div><div>hg clone http://arco.esi.uclm.es/~josel.segura/pfc</div><div><br /></div><div>Por si no lo conocéis, el comando "hg" se corresponde al CVS Mercurial. Podéis encontrar información sobre él en http://mercurial.selenic.com/ y en esta recete en Crysol: <a href="http://crysol.org/es/node/919">Mercurial, por favor</a>.</div><div><br /></div><div>Una vez tengáis el repositorio en vuestra máquina, podréis encontrar todo el código fuente en el directorio software/src. En concreto, el MMDeviceCreator está en software/src/MMDeviceCreator</div><div><br /></div></span></div></span></span></div>José-Luis Segurahttp://www.blogger.com/profile/01330405590078064402noreply@blogger.com0tag:blogger.com,1999:blog-3107336079441557908.post-68411212389025099992010-07-01T08:28:00.000-07:002010-07-02T02:24:44.320-07:00Servicio de negociación<div style="text-align: justify;">Durante el desarrollo de Argos, poco a poco, me he ido dando cuenta que ciertas partes del código se repetían en los diferentes elementos que conforman el sistema. En concreto, todo el algoritmo de</div><div style="text-align: justify;"><b>negociación de AVStreams</b> se repetía en cada elemento fuente o sumidero, lo cual implicaba la re-escritura del código en diferentes lenguajes y, además, tener duplicado dicho algoritmo en diferentes ubicaciones.</div><div style="text-align: justify;"><br /></div><div><div style="text-align: justify;">A raíz de este "descubrimiento" empecé a pensar en simplificarlo: si la negociación siempre se hace de la misma forma, dando los mismos pasos, ¿por qué no hacer un servicio que se encargara de ella? Empecé así a escribir un servicio que permitiera a cualquier sumidero ser anunciado/publicado en el sistema y realizar la negociación sin escribir una sola línea de AVStreams en el mismo, delegando todo ello en ese servicio.</div></div><div style="text-align: justify;"><br /></div><div><div style="text-align: justify;">Tras realizarlo, observé que la idea era fácilmente adaptable para acoger no solo a los elementos que quisieran actuar como sumideros, si no también a aquellas fuentes que así lo quisieran.</div></div><div style="text-align: justify;"><br /></div><div><div style="text-align: justify;">De esta idea, surgió poco a poco el servicio que por ahora llamo <b>MMDeviceCreator</b> (se admiten sugerencias en el nombre :D). </div></div><div style="text-align: justify;"><br /></div><div style="text-align: justify;"><div style="text-align: justify;">Este servicio proporciona a sus clientes la posibilidad de delegarle totalmente la negociación de la conexión AVStream. El programador de un elemento solamente tendrá que preocuparse de escribir como proporcionar el flujo multimedia (o como consumirlo, en el caso de los sumideros) y "decirle" al servicio que capacidades tiene (de la misma forma que AVStreams hace para negociar</div><div style="text-align: justify;">entre dos extremos de conexión). Con ello, y solamente definiendo un nuevo fichero de interfaz <i>slice</i>, se desacoplaba la negociación del flujo propiamente dicho, y de paso, se permite que la implementación final esté realizada en el lenguaje que queramos (siempre que sea compatible con Ice, por supuesto).</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;"><div style="text-align: justify;">El servicio ya está "terminado", aunque en fase de pruebas. Ya he realizado la puesta en marcha de algunos casos de uso y he implementado un sumidero y una fuente que utilizan el servicio, pero estos serán material para próximas entradas.</div></div></div>José-Luis Segurahttp://www.blogger.com/profile/01330405590078064402noreply@blogger.com0tag:blogger.com,1999:blog-3107336079441557908.post-4346018611227340662010-06-01T00:54:00.000-07:002010-06-03T09:33:20.824-07:00[RECETA] Desplegar MediaServer para cámaras Axis<blockquote></blockquote><blockquote></blockquote><blockquote></blockquote>En esta receta explicaré como poner en funcionamiento uno de los elementos de Argos: el MediaServer especializado para las <a href="http://www.axis.com/es/">cámaras IP de marca AXIS</a>.<div><br /></div><div><span class="Apple-style-span" style="font-size: large;"><b>Instalación</b></span></div><div><span class="Apple-style-span" style="font-size: medium; ">Como ya comenté en otras entradas, el MediaServer está implementado como servicio IceGrid. Por ello, he distribuido un binario en forma de paquete DEB para Debian. Para poder instalarlo, añade lo siguiente en tu archivo <span class="Apple-style-span">/etc/apt/sources.list</span></span></div><div><span class="Apple-style-span" style="font-size: medium;"><span class="Apple-style-span"><br /></span></span></div><div><span class="Apple-style-span" style="font-size: medium;"><span class="Apple-style-span"><blockquote></blockquote> deb http://babel.esi.uclm.es/gnesis/ unstable main</span></span></div><div><span class="Apple-style-span" style="font-size: medium;"><span class="Apple-style-span"><br /></span></span></div><div><span class="Apple-style-span" style="font-size: medium;"><span class="Apple-style-span">Una vez hecho esto tan solo hará falta hacer lo siguiente:</span></span></div><div><span class="Apple-style-span" style="font-size: medium;"><span class="Apple-style-span"><br /></span></span></div><div><span class="Apple-style-span" style="font-size: medium;"><span class="Apple-style-span"> # aptitude update;</span></span></div><div><span class="Apple-style-span" style="font-size: medium;"><span class="Apple-style-span"> # aptitude install libaxismediaserver</span></span></div><div><span class="Apple-style-span" style="font-size: medium;"><span class="Apple-style-span"><br /></span></span></div><div><span class="Apple-style-span" style="font-size: medium;"><span class="Apple-style-span">Dicho paquete instalará las dependencias necesarias para hacer funcionar "el invento" y, además, incluye un fichero XML con la configuración mínima para poder cargarlo en IceGrid-GUI y ver como configurarlo. Dicho fichero se encuentra en </span><span class="Apple-style-span">/usr/share/doc/libaxismediaserver/template.xml</span></span></div><div><span class="Apple-style-span" style="font-size: medium;"><span class="Apple-style-span"><br /></span></span></div><div><span class="Apple-style-span"><span class="Apple-style-span" style="font-size: large;"><b>Puesta en marcha</b></span></span></div><div><span class="Apple-style-span" style="font-size: medium; ">Para la puesta en marcha supondré que tenemos una cámara Axis en la IP 192.168.0.5. El servicio se puede arrancar de dos formas: a mano, ejecutando <span class="Apple-style-span">icebox</span> y pasándole un fichero de configuración con los parámetros correctos o bien utilizando IceGrid-GUI y la plantilla suministrada con el paquete.</span></div><div><span class="Apple-style-span"><span class="Apple-style-span" style="font-size: medium;"><br /></span></span></div><div><span class="Apple-style-span"><span class="Apple-style-span" style="font-size: large;"><b>Usando icebox y dicheros de configuración</b></span></span></div><div><span class="Apple-style-span" style="font-size: medium; ">Para arrancar el servicio "a mano" necesitaremos dos ficheros de configuración diferentes:</span></div><div><ul><li><span class="Apple-style-span"><span class="Apple-style-span" style="font-size: medium;">El primero será en el que le especifiquemos a IceBox que librería cargar y una serie de configuraciones de administración de los servicios ejecutándose en ese IceBox.</span></span></li></ul><ul><li><span class="Apple-style-span"><span class="Apple-style-span" style="font-size: medium;">El segundo es el que IceBox pasará a la librería y que contendrá parámetros que utilizará el MediaServer para Axis para funcionar.</span></span></li></ul><div><span class="Apple-style-span"><span class="Apple-style-span" style="font-size: medium;">Ejemplo del primer fichero de configuración:</span></span></div></div><div><span class="Apple-style-span"><span class="Apple-style-span" style="font-size: medium;"><br /></span></span></div><div><span class="Apple-style-span"><span class="Apple-style-span" style="font-size: small;">IceBox.Service.AxisMediaServer=AxisMediaServer:createAxisMediaServer --Ice.Config=config_AxisMediaServer</span></span></div><div><span class="Apple-style-span"><span class="Apple-style-span" style="font-size: small;">IceBox.InstanceName=AXIS.192.168.0.5</span></span></div><div><span class="Apple-style-span"><span class="Apple-style-span" style="font-size: small;">IceBox.LoadOrder=AxisMediaServer</span></span></div><div><span class="Apple-style-span"><span class="Apple-style-span" style="font-size: small;">Ice.Default.Locator=IceGrid/Locator:tcp -h locator.ip -p 4061</span></span></div><div><span class="Apple-style-span"><span class="Apple-style-span" style="font-size: small;"><br /></span></span></div><div><span class="Apple-style-span"><span class="Apple-style-span" style="font-size: medium;">En este fichero deberíamos configurar el nombre del fichero pásado en la primera línea a nuestro servicio, si tuviera otro diferente, y el proxy del Ice.Default.Locator de la última línea. El nombre de instancia de IceBox no es problemático, pero si convendría adaptarlo a nuestro escenario.</span></span></div><div><span class="Apple-style-span"><span class="Apple-style-span" style="font-size: medium;"><br /></span></span></div><div><span class="Apple-style-span"><span class="Apple-style-span" style="font-size: medium;">El segundo fichero de configuración contendría información relativa a nuestro entorno:</span></span></div><div><span class="Apple-style-span"><span class="Apple-style-span" style="font-size: medium;"><br /></span></span></div><div><span class="Apple-style-span"><span class="Apple-style-span" style="font-size: medium;"><div><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span">AxisMediaServerAdapter.Endpoints=default</span></span></div><div><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span">AxisMediaServer.IP=192.168.0.5</span></span></div><div><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span">AxisMediaServer.User=user</span></span></div><div><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span">AxisMediaServer.Password=pass</span></span></div><div><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span">PropertySetFactory.Proxy=PropertySetFactory @ AutoPropertyService.Adapter</span></span></div><div><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span">Ice.Default.Locator=IceGrid/Locator:tcp -h locator.ip -p 4061</span></span></div></span></span></div><div><span class="Apple-style-span" style="font-size: medium; "><span class="Apple-style-span"><br /></span></span></div><div><span class="Apple-style-span" style="font-size: medium;"><span class="Apple-style-span">Al igual que en el ejemplo anterior deberemos adaptar la configuración del Default Locator y, en este casi, de la propiedad "PropertySetFactory.Proxy". Para tener funcionando este servicio de propiedades podemos recurrir a la documentación del paquete libpropertyservice33.</span></span></div><div><span class="Apple-style-span" style="font-size: medium;"><span class="Apple-style-span"><br /></span></span></div><div><span class="Apple-style-span"><span class="Apple-style-span"><span class="Apple-style-span" style="font-size: large;"><b>Usando IceGrid y plantillas</b></span></span></span></div><div><span class="Apple-style-span" style="font-size: medium; ">Utilizando ZeroC Ice, existe la posibilidad de utilizar IceGrid. Esta utilidad es un servicio avanzado del middleware para la administración de <i>grids</i> de nodos que ejecuten diferentes servicios.</span></div><div><span class="Apple-style-span"><span class="Apple-style-span" style="font-size: medium;"><br /></span></span></div><div><span class="Apple-style-span"><span class="Apple-style-span" style="font-size: medium;">En el paquete <span class="Apple-style-span">libaxismediaserver</span> se incluye un fichero <span class="Apple-style-span">template.xml</span>. Este fichero puede abrirse utilizando IceGrid-Gui y utilizar las plantillas en él definidas para copiarlas a una aplicación dentro de nuestro registry.</span></span></div><div><span class="Apple-style-span"><span class="Apple-style-span" style="font-size: medium;"><br /></span></span></div><div><span class="Apple-style-span"><span class="Apple-style-span" style="font-size: medium;">La ubicación de dicha plantilla es la siguiente:</span></span></div><div><span class="Apple-style-span"><span class="Apple-style-span" style="font-size: medium;"><br /></span></span></div><div><span class="Apple-style-span" style="font-size: medium; "><span class="Apple-style-span">/usr/share/doc/libaxismediaserver/samples/template.xml</span></span></div><div><span class="Apple-style-span"><span class="Apple-style-span"><span class="Apple-style-span" style="font-size: large; "><b><br /></b></span></span></span></div>José-Luis Segurahttp://www.blogger.com/profile/01330405590078064402noreply@blogger.com0tag:blogger.com,1999:blog-3107336079441557908.post-10224162451772680202010-04-28T07:23:00.000-07:002010-04-28T07:28:57.378-07:00Final en Albacete y ¡premio!Esta mañana nos hemos venido mi bien y fiel amigo Manuel y yo a Albacete a la final del Concurso y a las actividades relacionadas. Un día de software libre en plan hermandad, comilona por la cara y claro, la presentación del proyecto.<div><br /></div><div>He sido el primero, rompiendo el hielo, con dos.... y ha ido bien, pero siempre se puede mejorar. Como primera exposición con bastante gente delante de mi vida no me puedo quejar, aunque me dejé un par de cosas en el titnero que me hubiera gustado decir.</div><div><br /></div><div>Me llevo para casa un premio, el de mejor utilidad. ¡Me siento muy orgulloso!</div><div><br /></div><div>El ganador ha sido el proyecto Tivio de otro culipardo (Ángel Guzmán, a.k.a. Shakaran). ¡Felicidades amijo!</div><div><br /></div><div>Por el Twitter llevo todo el día actualizando, así que para enteraros de algo... allí estoy</div>José-Luis Segurahttp://www.blogger.com/profile/01330405590078064402noreply@blogger.com0tag:blogger.com,1999:blog-3107336079441557908.post-54315788319462587312010-04-23T01:18:00.000-07:002010-04-23T01:22:12.498-07:00¡Finalista!Escribo hoy, festivo en Ciudad Real, para deciros que <a href="http://ceslcam.com/concurso/node/72">me han seleccionado como finalista del Concurso Universitario de Software Libre de Castilla-la Mancha</a>.<div><br /></div><div>Es todo un honor y una alegría poder ir a Albacete a pasar un día con amigos del Software Libre. Además, las charlas que han preparado tienen muy buena pinta.</div><div><br /></div><div>Las presentaciones de los 6 proyectos finalistas empezarán a eso de las 12, pero la mañana estoy seguro de que empezará mucho antes con algunas charlas que seguro que me encantan (Android, ¡allá voy! :D)</div><div><br /></div><div>Bueno, solo pido que me deseéis suerte con la presentación de Argos. ¡Espero no ponerme muy nervioso!</div>José-Luis Segurahttp://www.blogger.com/profile/01330405590078064402noreply@blogger.com1tag:blogger.com,1999:blog-3107336079441557908.post-78528326502933212022010-04-20T01:58:00.000-07:002010-04-20T02:32:36.845-07:00MediaRender: en dos saboresCuando terminé el MediaServer, que comenté hace unas cuantas entradas, empecé a desarrollar el MediaRender.<br /><br />MediaRender pretendía ser algo muy parecido al MediaServer y que lo complementa: el MediaRender representaría de alguna forma en otro sitio lo que el MediaServer estaba distribuyendo.<br /><br />Empecé a programarlo siguiendo una estructura casi igual que la del MediaServer: un servicio IceBox que, por un lado, anunciara en un canal de eventos al objeto y, por otro, lidiara con la representación del flujo. Conseguí hacerlo en poco tiempo, reutilizando mucho código del que estaba escrito para el MediaServer (aunque con bastantes arreglos menores) y conseguí poner en marcha un MediaRender basado en <a href="http://http//gstreamer.freedesktop.org/">Gstreamer</a> que fuera capaz de crear una ventana a pantalla completa y representar el flujo enviado por el MediaServer de Axis que ya tenía.<div><br /></div><div>Tras verlo en funcionamiento, y a sugerencia de mi director de proyecto David Villa, empecé a desarrollar algo similar en Python: un MediaRender que también iba a usar Gstreamer pero que sería completamente diferente en cuanto a utilización por parte del usuario.</div><div><br /></div><div>A diferencia del primer MediaRender, escrito en C++ como servicio IceBox, este nuevo sería en Python y la parte relacionada con Ice sería más simple. La forma de utilizar uno y otro se diferencian de forma drástica: mientras el servicio IceBox estaba pensado para ejecutarse en la sesión del usuario, de forma transparente para él (y sin ningún control por su parte), el MediaRender hecho en Python sería un applet de escritorio de <a href="http://www.gnome.org/">Gnome</a>, de forma que ofreciera al usuario algún tipo de control sobre el programa (por ejemplo, arrancar o detener el servicio, tiempo entre anunciamientos, modo ventana/pantalla completa...).</div><div><br /></div><div>Ambos sabores de MediaRender están disponibles, aunque por razones de tiempo, para el Concurso de Software Libre no pude realizar la parte de applet de escritorio para Gnome como tenía pensado, así que por ahora se trata tan solo de una aplicación de escritorio sin demasiadas posibilidades de configuración.</div><div><br /></div><div>Ésta será una de las líneas a seguir durante los próximos días en el desarrollo de Argos, así que no os extraéis si en pocos días tengo novedades al respecto.</div><div><br /></div><div>¡Saludos!</div>José-Luis Segurahttp://www.blogger.com/profile/01330405590078064402noreply@blogger.com0tag:blogger.com,1999:blog-3107336079441557908.post-30394071185824994952010-04-14T09:57:00.000-07:002010-04-14T10:00:50.800-07:00Documentación para el ConcursoDentro de la evaluación del Concurso Universitario de Software Libre se pide una documentación sobre el proyecto, en la que se explique su filosofía, objetivos, puesta en marcha...<br /><br />Publico aquí la documentación, por si alguien además de los evaluadores quisiera verla. Estoy abierto a todo tipo de comentarios. ¡Participad!<br /><br /><a href="http://arco.esi.uclm.es/~josel.segura/doc_cusl">Documentación de Argos</a>José-Luis Segurahttp://www.blogger.com/profile/01330405590078064402noreply@blogger.com0tag:blogger.com,1999:blog-3107336079441557908.post-9812907887536580542010-04-14T09:13:00.000-07:002010-04-14T09:38:24.833-07:00Vídeo demostrativo<div style="text-align: auto;"><span class="Apple-style-span" style="font-family:'Times New Roman';"><span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; font-size:medium;">He aprovechado hoy para hacer un vídeo demostrativo del funcionamiento de mi proyecto para ayudar a los evaluadores. Soy consciente de que, debido al estado de desarrollo actual, muchas de las herramientas que permiten utilizar de forma sencilla mi proyecto aún no están hechas, por lo que he pensado que sería un buen material de apoyo.<br /><br /></span></span></div><div style="text-align: auto;"><span class="Apple-style-span" style="font-family:'Times New Roman';"><span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; font-size:medium;">Enlace al <a href="http://arco.esi.uclm.es/~josel.segura/video.flv">vídeo en más calidad</a></span></span></div><br /><script src="http://arco.esi.uclm.es/flowplayer/flowplayer-3.1.4.min.js"></script><br /><a href="http://arco.esi.uclm.es/~josel.segura/video.flv" style="display:block;width:400px;height:300px;border: 1px solid #aaa" id="argos"></a><br /><script language="JavaScript">flowplayer("argos", "http://arco.esi.uclm.es/flowplayer/flowplayer-3.1.5.swf", { clip: { autoPlay: false, autoBuffering: true } });</script><br /><div style="text-align: auto;"><span class="Apple-style-span" style="font-family:'Times New Roman';"><span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; font-size:medium;"><br />En el transcurso del vídeo, primero se observa el canal de anunciamientos, dónde tanto un sumidero como una fuente están enviando sus mensajes de anuncio.<br /></span><br /><span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; ">Tras ello, se utiliza la propia herramienta como sumidero de vídeo para conectarse con la fuente que está funcionando. Por último, el vídeo muestra como conectar la fuente a otro sumidero, que se está ejecutando en la misma máquina, representando el flujo de vídeo en una ventana independiente.</span></span></div><div style="text-align: auto;"><span class="Apple-style-span" style="font-family:'Times New Roman';"><span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; font-size:medium;"><br /></span></span></div><div style="text-align: auto;"><span class="Apple-style-span" style="font-family:'Times New Roman';"><span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; font-size:medium;">En el vídeo se puede observar que se utiliza una herramienta gráfica, llamada <a href="http://twinpanel.blogspot.com/">Twinpanel</a>, para inspeccionar el canal de eventos y como sumidero multimedia. Esta herramienta ha sido fruto de varios años de trabajo de varios miembros del laboratorio ARCO entre los que me incluyo.</span></span></div>José-Luis Segurahttp://www.blogger.com/profile/01330405590078064402noreply@blogger.com0tag:blogger.com,1999:blog-3107336079441557908.post-16925495341379445342010-04-13T15:37:00.001-07:002010-04-13T15:40:21.986-07:00Y a última hora...Justo para la evaluación del concurso ha llegado la primera versión del "configurador" de flujos de Argos. Desde luego, no es ni mucho menos lo que espero que llegue a ser (por ahora solo es un programa en terminal), pero es el primer paso.<div><br /></div><div>El programa permite, dados los proxies de dos objetos MMDevice (un "source" y un "sink", como por ejemplo el Media Server y el Media Render), que ambos se conecten y tener el objeto de control de dicho flujo fuera de ambos extremos...</div><div><br /></div><div>Aunque bueno, quizá me he metido a detalles muy "profundos". Espero que, si me seleccionan para la fase final, pueda llevar algo menos "tedioso" de utilizar que esta primera aproximación para poder realizar una demo "in situ" en condiciones.</div><div><br /></div><div>P.S. Mañana es la evaluación de los proyectos en el concurso de Castilla-la Mancha. ¡Deseadme suerte!</div>José-Luis Segurahttp://www.blogger.com/profile/01330405590078064402noreply@blogger.com0tag:blogger.com,1999:blog-3107336079441557908.post-69132595344673040822010-04-10T11:12:00.000-07:002010-04-13T10:22:08.412-07:00Media Renderaunque se me ha olvidado comentarlo, de forma paralela al desarrollo del Media Server se ha realizado el del Media Render.<div><br /></div><div>Las diferencias entre ambos son pocas, ya que según el estándar de OMG AVStreams que estoy utilizando, los dos extremos de un flujo tienen las mismas interfaces y, a grandes rasgos, se comportan de forma muy parecida.</div><div><br /></div><div>Para el Media Render una de las cosas que he debido tener en cuenta ha sido, ante todo, la posibilidad de tener diferentes "Renderers" que hagan diferentes cosas (representar el vídeo, guardar a fichero...).</div><div><br /></div><div>Por ahora he implementado un Media Render que utiliza Gstreamer para representar el flujo recibido, pero he dotado al sistema de una especie de sistemas de plugins (usando el patrón <i>factory method</i>) para tener más fácil el desarrollo futuro de otros Media Renders diferentes.</div><div><br /></div><div>Otra cosa a tener muy en cuenta es el tema de despliegue; en la entrada anterior comenté que el despliegue del Media Server lo realizo gracias a IceGrid y IceGrid-Gui. Por desgracia, el MediaRender es muy dependiente del usuario que lo ejecuta, por lo que la automatización de la puesta en marcha del Media Render habrá que estudiarla un poco más despacio.</div>José-Luis Segurahttp://www.blogger.com/profile/01330405590078064402noreply@blogger.com0tag:blogger.com,1999:blog-3107336079441557908.post-66954402401355058242010-04-09T10:03:00.000-07:002010-04-13T10:15:07.349-07:00Despliegue de MediaServer en IceGridComo ya comenté hace algunas entradas, gracias a mi trabajo descubrí algunas herramientas avanzadas de Ice. Entre ellas está <a href="http://www.zeroc.com/doc/Ice-3.3.1/manual/IceGrid.html#22064">IceGrid</a>, que permite realizar despliegues de aplicaciones de una forma sencilla. Además, aporta transparencia de localización y la activación automática de servidores.<div><br /></div><div>Gracias a IceGrid, el Media Server se puede lanzar en un nodo del sistema, configurándolo todo de forma remota desde el editor gráfico Icegrid-Gui.</div><div><br /></div><div>IceGrid además permite tener plantillas para las aplicaciones, por lo que he podido definir un servicio IceBox para mi Media Server configurable a través de unos pocos parámetros, lo que permite su rápido despliegue en cualquier entorno.</div><div><br /></div>José-Luis Segurahttp://www.blogger.com/profile/01330405590078064402noreply@blogger.com0tag:blogger.com,1999:blog-3107336079441557908.post-72446684540629936452010-03-03T11:12:00.000-08:002010-04-07T01:07:17.951-07:00Gran hito gran: MediaServerHoy voy a hacer una pequeña introducción al que va a ser uno de los grandes hitos de mi proyecto: el <b>MediaServer.</b><div><b><br /></b></div><div>Se tratará de un servicio "icebox", desplegable usando "icegrid", que permitirá anunciar en el entorno todo tipo de fuentes de vídeo. Por ejemplo, servirá para anunciar al entorno cámaras IP que no puedan anunciarse por si mismas, webcams o incluso servir ficheros de vídeo.</div><div><br /></div><div>La idea es hacerlo suficientemente genérico para que pueda abarcar toda esta cantidad de dispositivos.</div><div><br /></div><div>¿Qué no sabes que es icegrid ni icebox y esta entrada te suena un poco a chino? Tranquilo, ya explicaré con más detalle este tema, solo quería dejar constancia de que el proyecto sigue viento en popa :)</div>José-Luis Segurahttp://www.blogger.com/profile/01330405590078064402noreply@blogger.com0tag:blogger.com,1999:blog-3107336079441557908.post-86643325736873360592010-02-12T18:32:00.000-08:002010-02-24T06:16:02.598-08:00Asuntos laboralesComo ya comenté, compagino la elaboración de mi PFC con mi trabajo dentro del grupo <a href="http://arco.esi.uclm.es/">ARCO</a>, lo cual hace que, en ocasiones, pueda dedicarle menos tiempo del deseado al proyecto.<div><br /></div><div>Pero en otras muchas ocasiones este trabajo me permite aprender sobre herramientas que me pueden ser de muchísima utilidad en el proyecto, cómo ha ocurrido en estos días pasados con <b>IceGrid</b>.</div><div><br /></div><div><a href="http://www.zeroc.com/doc/Ice-3.3.1/manual/IceGrid.html#22064">IceGrid</a> es uno de los servicios avanzados que proporciona ZeroC dentro de su middleware Ice. Según el manual de Ice, IceGrid es un servicio importante para construir herramientas robustas.</div><div><br /></div><div>De una forma más coloquial, se puede decir que IceGrid es un servicio que permite desplegar aplicaciones en una serie de nodos de forma transparente, sin tenerte que preocupar nada más que de tener lista la aplicación, su configuración y poco más. </div><div><br /></div><div>Claro, decir esto es simplificar en demasía: para que esto fuera así deben entrar en juego otros "actores" como IcePatch2 (que permite enviar los ejecutables a los nodos desde un servidor) o "icegrid-gui", que es una aplicación que permite configurar el nodo "registriy" (una suerte de director de orquesta) y decidir que aplicaciones se despliegan y dónde de una forma rápida e intuitiva.</div><div><br /></div><div>De todos modos esto es un claro ejemplo que nunca se pierde el tiempo si aprovechas para aprender cosas por el camino. Está claro que para mi PFC IceGrid va a desempeñar una función principal para simplificarme la distribución de los nodos de mi sistema por la red.</div>José-Luis Segurahttp://www.blogger.com/profile/01330405590078064402noreply@blogger.com0tag:blogger.com,1999:blog-3107336079441557908.post-61686324350841932502010-02-01T11:56:00.000-08:002010-02-25T01:30:22.911-08:00Anteproyecto aceptadoBueno, parece que he tenido suerte y entregué el anteproyecto justo cuando la comisión académica iba a reunirse para estudiar las solicitudes.<div><br /></div><div>Ya tengo el anteproyecto aceptado, por lo que en teoría ya puedo ponerme con él (aunque ya estuviera puesto).</div><div><br /></div><div>[ironic]</div><div>¡Ah! Estos temas burocráticos que tanto me gustan... </div><div>[/ironic]</div><div><br /></div>José-Luis Segurahttp://www.blogger.com/profile/01330405590078064402noreply@blogger.com0tag:blogger.com,1999:blog-3107336079441557908.post-73262115853700563392010-01-14T13:04:00.000-08:002010-02-24T03:59:31.649-08:00Anteproyecto presentadoTras un par de semanas escribiendo el anteproyecto para presentarlo en mi facultad, ya está hecho y presentado. La solicitud de estudio del mismo la presenté el 14 de Enero.<div><br /></div><div>En el anteproyecto he hecho una presentación del estado general de la cuestión: la necesidad tener mejores mecanismos de interacción y <span class="blsp-spelling-error" id="SPELLING_ERROR_0">comunicación</span> entre dispositivos multimedia, debido al crecimiento que ha sufrido el mundo en este ámbito durante los últimos años (teléfonos, <span class="blsp-spelling-error" id="SPELLING_ERROR_1">videoconsolas</span> o hasta despertadores...).</div><div><br /></div><div>En el anteproyecto también he querido darle una utilidad práctica dentro del mundo de la enseñanza, ya que al fin y al cabo este documento trata sobre "vender la moto" para que valoren de forma positiva que tu "pierdas" tu tiempo en hacer ese trabajo.</div><div><br /></div><div>En el documento también explico la metodología de trabajo que voy a seguir. En principio, <a href="http://es.wikipedia.org/wiki/RUP">RUP</a>, aunque debido a la naturaleza modular del proyecto, que estará compuesto de muchas "piezas" que funcionarán juntas, puede que en alguna de esas "piezas" se utilice alguna otra metodología (como <a href="http://es.wikipedia.org/wiki/Desarrollo_guiado_por_pruebas">TDD</a>, que personalmente a mi director de proyecto y a mi nos gusta bastante, pero no es aplicable en algunos de los elementos del proyecto).</div><div><br /></div><div>Cómo ya hice en <a href="http://argos-m.blogspot.com/2009/10/primeros-pasos-seleccion-de.html">mi post sobre selección de herramientas</a>, en el anteproyecto también he hablado de los lenguajes y herramientas que voy a utilizar.</div><div><br /></div><div>Dado que el PFC lo estoy haciendo en mi ámbito de trabajo (el grupo de investigación <a href="http://arco.esi.uclm.es/">ARCO</a>) voy a disponer de algunos recursos, sobre todo hardware, que me permitirán desarrollar algunas cosas interesantes, como un servidor de medios de cámaras AXIS, otro para cámaras web que usen <a href="http://linux.bytesex.org/v4l2/">Video For Linux</a>... y en fin, muchos aparatitos donde implementar partes de mi sistema de cara a una buena demostración.</div><div><br /></div><div>¡Ah! Se me olvidaba. El anteproyecto está hecho usando <a href="http://es.wikipedia.org/wiki/LaTeX">LaTeX</a>, y la futura documentación del PFC también lo estará...</div>José-Luis Segurahttp://www.blogger.com/profile/01330405590078064402noreply@blogger.com0tag:blogger.com,1999:blog-3107336079441557908.post-83163721891353295222009-11-10T19:22:00.000-08:002009-11-10T10:24:35.821-08:00Estado del MediaRenderLa primera herramienta del proyecto va viento en popa.<br /><br />El plugin del que hablé para usar como prototipo de uso ya está hecho. He utilizado Gstreamer+Gtk, que aunque sus librerías son en C y no son orientadas a objetos, casan bastante bien y me ha permitido poder representar de forma sencilla vídeo a pantalla completa manteniendo la relación de aspecto del original (algo que siempre me gusta mantener, nada de estirar el resultado).<br /><br />El programa ya es capaz de conectarse a un servidor de medios y representar el flujo multimedia que éste nos indique. Ahora, siguiendo con el trabajo, hay que hacer que no siempre se mande dicha información, y que se negocie entre los extremos la calidad de servicio, los tipos de flujos admitidos... en fin, muchas cosas en el futuro y pocas en el pasado: ¡a trabajar!José-Luis Segurahttp://www.blogger.com/profile/01330405590078064402noreply@blogger.com0tag:blogger.com,1999:blog-3107336079441557908.post-80684047605849585302009-11-10T10:24:00.000-08:002009-11-10T10:28:23.987-08:00Otras cosas... PyGTKDurante unos días he tenido parado el proyecto debido a temas de trabajo. Y como bien dicen, no hay mal que por bien no venga: he estado trabajando con PyGTK (un viejo conocido) y he indagado sobre el uso (y disfrute) de UIManager, ActionManager y demás clases relacionadas.<br /><br />Si eres nuevo en el mundillo de GTK quizá todo esto te suene a chino... y si ya conoces GTK y usas Python, muy posiblemente lo encuentres interesante... Lo que he sacado en claro de todo esto lo he reflejado en Cysol.org: una web de usuarios de software libre a la que me enorgullezco de pertenecer.<br /><br />La receta de la que os hablo sobre PyGTK es la siguiente: http://tinyurl.com/ygdm9da<br /><br />¡Espero que la disfrutéis!José-Luis Segurahttp://www.blogger.com/profile/01330405590078064402noreply@blogger.com0tag:blogger.com,1999:blog-3107336079441557908.post-56796158259643815322009-10-18T11:53:00.000-07:002009-10-22T02:53:44.878-07:00MediaRender: representación de flujos multimediaEl primer hito de mi proyecto consistirá en la elaboración de un programa capaz de representar un determinado flujo multimedia a través de la salida habitual de un PC (monitor y altavoces).<br /><br />Para ello usaré C++ como lenguaje de implementación. El middleware, como se comentó en entradas anteriores, será ZeroC Ice, que es completamente libre.<br /><br />El programa tendrá varias formas de representar un flujo multimedia y, alguna de ellas, puede que no use las salidas estándar del PC, ya que por ejemplo se puede querer almacenar lo recibido de dicho flujo multimedia en un fichero. Por ello, el programa deberá permitir tener "plugins" para tener así diferentes maneras de representar el flujo. En principio implementaré alguna para tener un prototipo funcional que represente por el monitor un vídeo usando bien las librería de VLC o la de Gstreamer.José-Luis Segurahttp://www.blogger.com/profile/01330405590078064402noreply@blogger.com0tag:blogger.com,1999:blog-3107336079441557908.post-47770010438475529082009-10-18T10:05:00.000-07:002009-10-22T02:41:48.685-07:00Primeros pasos: selección de herramientasComo cualquier proyecto lo primero debe ser saber de que herramientas dispongo y cuáles de ellas utilizaré para desarrollar el conjunto de Argos.<br /><br />La primera elección, ya que condicionará la elección de los lenguajes de programación y las librerías que podré usar, será la del middleware. Entre los middlewares que conozco (Java RMI, Corba, ZeroC Ice, Webservices) me he decantado por ZeroC Ice.<br /><br />Este middleware es orientado a objetos y, además, tiene bindings para muchos lenguajes de programación (C++, Java, Python...), por lo que es muy adecuado para mi proyecto, ya que me permite las diferentes partes de éste programadas en diferentes lenguajes según las necesidades.<br /><br />Otra ventaja que proporciona ZeroC Ice es que también está soportado en plataformas menos estándares que un PC, como dispositivos pequeños (con Ice Embeded), el iPhone y teléfonos Android, tan de moda ahora.<br /><br />Como he mencionado antes, ZeroC Ice permite el uso de diferentes lenguajes de programación (todos con soporte en GNU), por lo que mis diferentes aplicaciones estarán implementadas, casi con total seguridad, en C/C++ o en Python.<br /><br />Lo siguiente en el proyecto será definir la primera aplicación que escribiré, pero esa es otra historia...José-Luis Segurahttp://www.blogger.com/profile/01330405590078064402noreply@blogger.com0tag:blogger.com,1999:blog-3107336079441557908.post-8418667485863472772009-10-01T10:00:00.000-07:002009-10-22T02:42:28.534-07:00PresentaciónMi nombre es José-Luis. Soy estudiante de Ingeniería Superior Informática en la <a href="http://esi.uclm.es/">Escuela Superior de Informática de Ciudad Real</a>, perteneciente a la <a href="http://www.uclm.es/">Universidad de Castilla-la Mancha</a>. Me falta "poco" para terminar la carrera. Ese "poco" se limita al Proyecto Fin de Carrera. Aprovechando que el proyecto tenía envergadura suficiente y sugerido por mi director de proyecto, David Villa, decidí presentarme con mi PFC al <a href="http://www.concursosoftwarelibre.org/0809/">III Concurso Universitario de Software Libre</a>.<br /><br />La finalidad de este proyecto es crear un sistema distribuido donde los nodos sean productores de flujos multimedia (audio, vídeo, etc.), consumidores de estos o ambas cosas a la vez. Cada uno de estos nodos podrán ser conectados entre ellos, siempre un productor con, al menos, un consumidor.<br /><br />Típicamente, los nodos del sistema serán ordenadores con el software necesario para consumir o producir un flujo multimedia. Por ejemplo, una ventana podrá ser utilizada como fuente de vídeo y ser conectada con algún nodo consumidor, de forma que, por ejemplo, este nodo guarde dicho vídeo en un determinado formato en un fichero en otro ordenador.<br /><br />Otros nodos que se pretenden implementar son aquellos que utilizan un hardware diferente a un ordenador. Por ejemplo, Nintendo DS, Chumby, PSP, cámaras IP, etcétera. Todo ello se implementará de forma opcional para tener más tipos de nodos.<br /><br />El resultado del proyectos será una infraestructura que permita la interconexión de los diferentes nodos mediante un editor gráfico, en el cual se especifiquen los nodos a interconectar.José-Luis Segurahttp://www.blogger.com/profile/01330405590078064402noreply@blogger.com0