Taller imagenio Guía para el desarrollo de aplicaciones

Página creada Ubaldo Alcasser
 
SEGUIR LEYENDO
Taller imagenio Guía para el desarrollo de aplicaciones
Taller imagenio
Guía para el desarrollo de aplicaciones
Taller imagenio Guía para el desarrollo de aplicaciones
Taller imagenio                                                                              Guía para el desarrollo de aplicaciones

INDICE DE CONTENIDOS

1  Introducción ............................................................................................................................ 3
2  Desarrollo de aplicaciones para Imagenio.............................................................................. 5
 2.1    Navegador Web ............................................................................................................................ 5
 2.2    Reproducción de vídeo................................................................................................................ 6
 2.3    Teclado virtual ............................................................................................................................... 6
 2.4    Librerías Imagenio........................................................................................................................ 7
 2.5    Servidor de aplicaciones ............................................................................................................. 7
 2.6    Diferencias entre aplicaciones TV y PC.................................................................................... 8
3 Despliegue y prueba de aplicaciones ..................................................................................... 9
4 Ejemplos............................................................................................................................... 10
 4.1    Estructura principal de las aplicaciones.................................................................................. 10
 4.2    Zona visible de la aplicación ..................................................................................................... 12
 4.3    Manejo del mando a distancia.................................................................................................. 14
 4.4    Precarga de imágenes............................................................................................................... 16
 4.5    Diseño de pantallas.................................................................................................................... 18
 4.6    Navegación por foco y entre pantallas.................................................................................... 19
 4.7    Manejo de objetos de vídeo...................................................................................................... 24
 4.8    Integración con servicios de Internet....................................................................................... 28
 4.9    Introducción de datos y teclado virtual.................................................................................... 32

                                                                           2
Taller imagenio Guía para el desarrollo de aplicaciones
Taller imagenio                                                   Guía para el desarrollo de aplicaciones

1 Introducción
Con el auge de la IP-TV las aplicaciones en la televisión aún son un mundo por explorar completamente.
Un mundo con sus propias reglas y sus propias necesidades. Por ese motivo, os presentamos el taller
Imagenio, el cual incluye una competición de desarrollo de aplicaciones para el entorno de la TV.

La idea de esta competición es dar rienda suelta a los campuseros para que desarrollen una aplicación para
la televisión durante los días que dura la Campus Party 2008 y sobre una plataforma Imagenio reducida,
que ofrezca cualquier funcionalidad que se os ocurra.

La temática de la aplicación a desarrollar será libre, aunque se valorará positivamente si incluye contenidos
de vídeo e integra algún servicio de Internet ya existente.

Los grupos inscritos en la competición podrán hacer uso de un entorno de pruebas formado por dos
descodificador de Imagenio y dos televisores, así como sus respectivos mandos a distancia. También se les
creará una cuenta en el servidor de aplicaciones de Imagenio para que puedan testear su proyecto, al cual
podrán acceder mediante FTP. También podrán hacer uso de una base de datos en MySQL.

La maqueta también incluirá un servidor de vídeo en donde los participantes en las competición podrán
desplegar sus contenidos de vídeo, pero teniendo en cuenta que deben estar en el formato adecuado para su
correcta visualización en un STB de Imagenio. En cualquier caso, se ofrecerá a los participantes un
conjunto de vídeos que podrán utilizare en sus aplicaciones si no desean recodificar vídeos.

Adicionalmente se les proporcionará una aplicación de ejemplo que trata de recoger todos los aspectos más
importantes a tener en cuenta para la creación de aplicaciones para Imagenio.

La siguiente figura muestra el esquema de la maqueta de Imagenio que se ofrece a los campuseros para el
desarrollo de sus aplicaciones.

                                                     3
Taller imagenio Guía para el desarrollo de aplicaciones
Taller imagenio       Guía para el desarrollo de aplicaciones

                  4
Taller imagenio                                                   Guía para el desarrollo de aplicaciones

2 Desarrollo de aplicaciones para Imagenio
El desarrollo de aplicaciones en Imagenio se basa en el uso de tecnologías web, tanto en el servidor como
en el cliente. La lógica de la aplicación se ejecuta en un servidor de aplicaciones, mientras que la capa de
presentación e interacción con el usuario se ejecuta en el navegador web embebido en el STB
(descodificador) de Imagenio.

En la competición Imagenio se utilizarán descodificadores ADB 3100, que es uno de los modelos más
extendidos actualmente en las casas de los usuarios que cuentas con Imagenio.

2.1 Navegador Web
Actualmente, los fabricantes de descodificadores integrados en Imagenio incluyen como navegador web
versiones del conocido “Mozilla”. Por lo tanto, un aspecto clave para el desarrollo de las aplicaciones de
usuario es conocer y aprovechar las características de este browser. Asimismo, es una gran ayuda disponer
de la versión PC de dicho browser, ya que muchos aspectos son funcionalmente idénticos y es posible
obtener una idea general de cómo se van a comportar las aplicaciones posteriormente en el browser del
decodificador.

La versión del Mozilla es variable, pero en todo caso superior a la 1.5. Algunas de las características
técnicas comunes de ambas versiones son:
        •    HTTP 1.1 [RFC2068, RF 2616], con soporte de ciertos tipos MIME

                                         Nombre           Tipo MIME
                                 Texto               text/plain
                                 HTML                text/plain
                                 Imagen GIF          Image/gif
                                 Imagen JPEG         Image/jpeg
                                 Imagen PNG          Image/png

        •    HTTPS [RFC2818 http over TLS]
        •    HTML 4.01 [RFC2616] (GIF, JPEG, PNG, GIF animado)
        •    CSS1 [RFC2381], CSS2 y CSS3 (sólo parcialmente)
        •    DOM 1, DOM 2 y DOM 3 (sólo parcialmente)
        •    Javascript 1.5
        •    XML 1.0 con CSS

                                                     5
Taller imagenio                                                      Guía para el desarrollo de aplicaciones

        •    Cookies (no persistentes, ya que el equipo no tiene medio de almacenamiento local)
        •    Flash 4.0 (versiones posteriores no se soportan).

El navegador del descodificador soporta el cacheo de páginas e imágenes lo que cobra especial importancia
en un entorno limitado en recursos hardware y software como es el propio descodificador. Adicionalmente
debe tenerse en cuenta que la propia caché es un recurso limitado también y es aconsejable hacer de ella un
uso económico

2.2 Reproducción de vídeo
Los descodificadores de Imagenio incluyen un HW específico para la reproducción de video.

Actualmente, los formatos soportados son:

   •   Diferentes transportes: IGMP (multicast para TV) y RTSP (unicast para VoD).

   •   Formatos de codificación: MPEG-1 y MPEG-2.

2.3 Teclado virtual
El teclado virtual que el usuario puede activar para la introducción de caracteres alfanuméricos en las cajas
de edición, presenta dos modos diferentes:
        •    Completo: se trata de un teclado alfanumérico completo al estilo del de un PC. Donde la
             introducción de datos se basa en el movimiento de un foco con las flechas de dirección entre
             las “teclas virtuales” (dibujadas en pantalla) y la selección del carácter con la tecla OK del
             mando.
        •    SMS: teclado numérico tipo móvil. En este caso la introducción de datos se realiza
             directamente mediante la pulsación de las teclas numéricas del mando a distancia y el carácter
             seleccionado se modifica automáticamente en base al número pulsado y la secuencia temporal
             de repetición.

El teclado virtual se puede desplegar solamente cuando el cursor se encuentra seleccionando una caja de
entrada de caracteres (etiquetas de tipo INPUT y TEXTAREA de HTML).

Inicialmente, el teclado virtual que aparece en pantalla es del tipo SMS. La aparición del teclado virtual se
consigue con la pulsación de la tecla del mando a distancia correspondiente.

                                                         6
Taller imagenio                                                   Guía para el desarrollo de aplicaciones

2.4 Librerías Imagenio
El acceso a las características especiales de Imagenio desde las aplicaciones se realiza por medio de
librerías javascript que se ejecutan en el navegador web del descodificador.

Para la competición Imagenio, se ofrecen las siguientes APIs javascript de Imagenio:

   •   Funciones generales (main_ial.js).

   •   Control de la interacción del usuario mediante el mando a distancia (keycodes_ial.js).

   •   Reproducción de contenidos de video (VideoObject_ial.js).

En este documento, más adelante, se incluyen ejemplos de código que explican el uso y funcionamiento de
estas librerías.

2.5 Servidor de aplicaciones
La parte servidora de las aplicaciones se puede ejecutar en cualquier servidor de aplicaciones web, y por
tanto, se puede desarrollar en diversos lenguajes de programación, sobre distintos sistemas operativos y en
distintos entornos de desarrollo.

Para la competición Imagenio, se pone a disposición de los participantes el siguiente entorno:

           •   Plataforma LAMP:
                    Ubuntu 7.10
                    Apache2
                    MySQL
                    PHP5
           •   Servidor de vídeo
                    Unicast-RTSP
                    Multicast-IGMP
                    MPEG-2 TS y CBR
           •   Servidor de arranque (OPCH)
           •   Servidor FTP

                                                     7
Taller imagenio                                                   Guía para el desarrollo de aplicaciones

2.6 Diferencias entre aplicaciones TV y PC
Si bien el entorno de desarrollo y ejecución descrito en las secciones anteriores es muy parecido al que
habitualmente se utiliza en el desarrollo de aplicaciones web para PC, hay una serie de características que
deben tenerse en cuenta a la hora de desarrollar aplicaciones para Imagenio.

   •   La capacidad del procesador y de la memoria del descodificador es mucho más limitada que la de
       un PC, y las aplicaciones deben adaptarse a estas limitaciones.

   •   Al diseño las interfaces de usuario de la aplicación se debe tener en cuenta que se visualizará en un
       televisor y no en una pantalla de ordenador. Las aplicaciones desarrolladas para definición estándar
       de TV suelen usar resolución PAL (660x576) y hay que tener en cuentas las bandas de guarda
       (bandas en los bordes de la pantalla del televisor que no son visibles y que varían según el modelo).

   •   No es posible utilizar los medios de interacción habituales en el PC (teclado y ratón). La interacción
       de los usuarios con las aplicaciones de TV es a través de un mando a distancia.

   •   En las aplicaciones de TV es recomendable ofrecer una navegación por la aplicación basada en
       foco, es decir, que en la pantalla siempre haya un elemento activo fácilmente distinguible por el
       usuario, que el cambio del elemento activo se realice mediante el uso de la flechas y que se pueda
       seleccionar un elemento mediante el botón de OK del mando a distancia.

   •   La disposición corporal de los usuarios es distinta cuando utilizan una aplicación en la TV y cuando
       usan una aplicación en el PC. Frente al televisor se suelen colocar a dos metros de distancia y su
       posición suele ser sentado en un sofá. Estos aspectos también se deben tener en cuenta.

Por todo lo dicho anteriormente, los aspectos de usabilidad de las aplicaciones de TV deben adaptarse a los
factores arriba indicados. La disposición de los elementos y su comportamiento ante la interacción de los
usuarios debe favorecer el uso intuitivo y simple de las distintas funcionalidades implementadas. Y siempre
hay que tener en cuenta que las aplicaciones deben ser fáciles de utilizar mediante el mando a distancia.

                                                     8
Taller imagenio                                                  Guía para el desarrollo de aplicaciones

3 Despliegue y prueba de aplicaciones
Los equipos participantes en la competición Imagenio tendrán a su disposición un servidor que incluirá:
Apache, MySQL y PHP, y dos TVs y dos STBs para realizar las pruebas de las aplicaciones desarrolladas,
y que están situadas en el stand de Telefónica I+D de la Campus Party.

Para cada equipo se creará una cuenta FTP y una base de datos MySQL en el servidor de Imagenio.

El desarrollo y prueba de las aplicaciones se podrá hacer completamente en los PCs de los participantes,
para posteriormente subir las aplicaciones al servidor de Imagenio y hacer las pruebas oportunas en las TVs
y STBs que están a su disposición.

Otra opción es hacer el desarrollo directamente en el servidor Imagenio, utilizando FTP para enviar los
ficheros al servidor de aplicaciones y algún mecanismo (por ejemplo phpMyAdmin) para crear las tablas
de la BD y gestionar sus datos.

En cualquier caso, se recomienda que las pruebas iniciales se realicen en un navegador web de PC, y
posteriormente, hacer las pruebas finales el la TV y el STB.

Para las pruebas de las aplicaciones de Imagenio en PC se recomienda utilizar Firefox 2.

                                                    9
Taller imagenio                                                   Guía para el desarrollo de aplicaciones

4 Ejemplos
A continuación se muestran distintos ejemplos de código que tratan de cubrir los principales aspectos a
tener en cuenta para el desarrollo de aplicaciones de Imagenio.

4.1 Estructura principal de las aplicaciones
Es recomendable que las aplicaciones de Imagenio contengan una página principal en la cual se realice la
carga de las librerías de Imagenio y que contenga un frame en el cual se cargarán el resto de las páginas de
la aplicación. En este ejemplo, llamaremos main.php a la página principal.

Fichero 1: main.php

         Seminario Imagenio CampusParty 2008
         
             function initiate() {
                 try {
                     RTGUI.init();
                 } catch(e) {
                     alert(e);
                 }
             }

             function finish() {
             }

                                                    10
Taller imagenio                                                   Guía para el desarrollo de aplicaciones

De esta forma la carga de las librerías se realiza una única vez y quedan disponibles para el resto de las
páginas de la aplicación.

Observad que al principio de esta página se realiza la comprobación del navegador web que se utiliza. Más
adelante en el código, se puede ver que si se utiliza el navegador de PC, se carga una versión de la librería
de teclas y, se utiliza un navegador de STB, se carga otra. De esta forma se pueden hacer pruebas de las
aplicaciones en el PC y en el STB.

La carga de las librerías se materializa mediante al funcion javascript initiate(), dentro de la cual se hace
una llamada a la función RTGUI.init(), la cual pertenece a las librerías de Imagenio. La llamada a la
función initiate() se realiza durante el evente onload del frameset de esta página principal.

Actualmente hay una versión única de la librería de manejo de objetos de vídeo. Esta versión es sólo para
STB. Esto significa que la reproducción de vídeos sólo se puede probar en el STB, no en el PC.

En el Fichero 1 se observa que se carga la página menu.php en el frame contenido en main.php. A
continuación se muestra una página muy sencilla de ejemplo para menu.php.

Fichero 2: menu.php (version 1)

        Seminario Imagenio CampusParty 2008
    
              Hello World!
          
                                                    11
Taller imagenio                                                  Guía para el desarrollo de aplicaciones

Y el resultado en un navegador web de main.php y menú.php es el siguiente.

                                 Figura 1: menu.php (primera version)

4.2 Zona visible de la aplicación
Ya se ha comentado en esta guía que las aplicaciones para definición estándar de televisión deben tener
resolución de 660x 576 píxeles. Generalmente se utilizan fondo de pantalla de un tamaño similar a este. En
el ejemplo desarrollado en esta guía, el fondo es un fichero jpg que tiene un tamaño de 720x576.

Además de considerar esta resolución, se deben tener en cuentas las bandas de guarda de los televisores.
Estas bandas de guarda son bordes de la pantalla del televisor que no son visibles y que varían según el
modelo.

Por otra parte, los textos no deben estar muy pegados a los bordes de la pantalla, para conseguir una
experiencia de usuario más positiva.

Después de tener en cuenta todo esto, el área realmente disponible se reduce notablemente en aplicaciones
de TV para resolución estándar. Por supuesto, este tipo de problemas se superarán cuando la alta definición
esté completamente implantada y las aplicaciones puedan hacer uso de áreas mucho mayores.

A continuación se muestra un ejemplo de menú.php al que se le ha añadido una capa que sirve para mostrar
el área visible y disponible para las aplicaciones de TV.

                                                   12
Taller imagenio                                                 Guía para el desarrollo de aplicaciones

Fichero 3: menu.php (version 2)

        Seminario Imagenio CampusParty 2008
    
              Hello World!
          
En la hoja de estilos main.css se ha definido el estilo area_tv que pinta un recuadro que delimita el área
visible del televisor.

Fichero 4: main.css
.area_tv{
    position:absolute;
    left:55px;
    top:25px;
    width:605px;
    height:525px;
    border:1px solid white;
}

El resultado en un navegador web es el siguiente:

                                                    13
Taller imagenio                                                    Guía para el desarrollo de aplicaciones

                                     Figura 2: menu.php (versión 2)

4.3 Manejo del mando a distancia
Pare realizar el manejo del mando a distancia, primero hay que hacer la carga de las librerías de Imagenio.
Dicha operación se realiza en la página principal de la aplicación, tal y como se ha descrito en el apartado
4.1.

En cada una de las páginas secundarias de la aplicación, es decir, las páginas contenidas en el frame
principal de la aplicación, se puede particularizar el comportamiento de los botones del mando y asociarles
distintas acciones. Para realizar esta operación es necesario implementar la función javascript
top.keyPressed (codigo) en las páginas secundaria de la aplicación.

Como se ha visto anteriormente en el apartado 4.1, en la página principal de la aplicación se hace una
llamada a la función RTGUI.init. Dentro de esta función se crea e inicializa un manejador de teclas del
mando que incluye un listener, el cual se ejecuta cada vez que se pulsa una tecla del mando. Dicho listener
hace una llamada a la función keyPressed (codigo), que debe estar implementada en la página secundaria
de la aplicación, tal y como se muestra en el siguiente ejemplo.

Fichero 5: menu.php (version 3)

                                                    14
Taller imagenio                                                  Guía para el desarrollo de aplicaciones

          Seminario Imagenio CampusParty 2008

              top.keyPressed = function (codigo) {
                  try {
                      switch (codigo) {
                          case top.KEY_RED:
                              var elem = document.getElementById("menu_block");
                              if (elem!=null) {
                                  elem.innerHTML = "Bye, Bye!!";
                              }
                              break;
                          case top.KEY_BLUE:
                              document.location.reload();
                              break;
                          case top.KEY_BACK:
                              top.document.location = "../index.html"
                              break;
                          default:
                              alert ("ha pulsado la tecla "+codigo);
                              break;
                  }
                }catch(e) {
                  alert(e);
                }
              }

              Hello World!
          
Generalmente, la estructura de la función javascript keyPressed (codigo) siempre es muy parecida. Suele
incluir un switch que discrimina entre los distintos botones que nos interesan en cada caso, y a cada botón
le asocia una acción.

A continuación se muestra una tabla en donde se indican los botones del mando más usados, el nombre que
se debe usar en código y su correspondencia con las teclas del PC para hacer pruebas en este entorno.

                                                   15
Taller imagenio                                                      Guía para el desarrollo de aplicaciones

Botones                                 Nombre botón en          Correspondencia en
                                        código                   botón en PC
Botones principales                     KEY_UP                   Flecha arriba
                                        KEY_DOWN                 Flecha abajo
                                        KEY_LEFT                 Flecha izquierda
                                        KEY_RIGHT                Flecha derecha
                                        KEY_BACK                 Backspace
                                        KEY_HOME                 Inicio
                                        KEY_SELECT               Enter
Botones de colores                      KEY_RED                  F5
                                        KEY_GREEN                F6
                                        KEY_YELLOW               F7
                                        KEY_BLUE                 F8
Botones de control de vídeo             KEY_PLAY
                                        KEY_PAUSE
                                        KEY_PLAYPAUSE
                                        KEY_STOP
                                        KEY_FWD
                                        KEY_RWD
Botones de números                      KEY_0                    0
                                        KEY_1                    1
                                        KEY_2                    2
                                        KEY_3                    3
                                        KEY_4                    4
                                        KEY_5                    5
                                        KEY_6                    6
                                        KEY_7                    7
                                        KEY_8                    8
                                        KEY_9                    9

Se debe procurar utilizar los siete botones principales para manejar las aplicaciones, si bien, en ciertos
casos puntuales se pueden usar otros botones del mando.

4.4 Precarga de imágenes
Si bien en un navegador de PC los efectos derivados del orden en que se cargan los elementos gráficos son
poco importantes, en el mundo TV cualquier detalle que afecte a la manera en que una página es construida
para su visualización cobra mucha importancia.

La secuencia de carga de una página compleja en un browser de un descodificador es más lenta que en un
PC por razones claras (menor potencia de proceso, versiones recortadas del software…). Para una correcta
visualización de las páginas, se recomienda que se realice un precarga de todas las imágenes que se vayan a
utilizar.

                                                      16
Taller imagenio                                                Guía para el desarrollo de aplicaciones

Para ello, las librerías de Imagenio ofrecen una función para realizar esta operación de precarga de
imágenes. En el siguiente ejemplo se puede observar que en la página menú.php se incluye una llamada a
la función precargaImagenesMenu(), la cual está implementada en el fichero main.js, el cual pertenece a
nuestra aplicación.

Fichero 6: menu.php (version 4)

        Seminario Imagenio CampusParty 2008

             top.keyPressed = function (codigo) {
                 try {
                     switch (codigo) {
                         case top.KEY_RED:
                             var elem = document.getElementById("menu_block");
                             if (elem!=null) {
                                 elem.innerHTML = "Bye, Bye!!";
                             }
                             break;
                         case top.KEY_BLUE:
                             document.location.reload();
                             break;
                         case top.KEY_BACK:
                             top.document.location = "../index.html"
                             break;
                         default:
                             alert ("ha pulsado la tecla "+codigo);
                             break;
                 }
               }catch(e) {
                 alert(e);
               }
             }

             precargarImagenesMenu();

            Hello World!
        
                                                 17
Taller imagenio                                                 Guía para el desarrollo de aplicaciones

Dentro de la función precargaImagnesMenu() se crea una array con todas las imágenes de una página y
luego se pasa dicho array como parámetro de entrada a la función RTGUI.Preload(), que pertenece a la
librería de Imagenio, para hacer la precarga de dichas imágenes.

Fichero 7: main.js

function precargarImagenesMenu() {

    try {
    lista_imagenes = new Array(
                "./img/binarycode2",
                "./img/tv_off.png",
                "./img/tv_on.png",
                "./img/vod_off.png",
                "./img/vod_on.png",
                "./img/serv_off.png",
                "./img/serv_on.png");
        top.RTGUI.Preload(lista_imagenes);
    } catch (e) {
        alert(e);
    }

}

4.5 Diseño de pantallas
Para asegurar que la aplicación se visualizará correctamente en la TV, es recomendable definir
explícitamente la dimensión y posición de cada elemento de la página por medio de una hoja de estilos,
evitando dejar dimensiones o posiciones a criterio del browser, dado que éste aplicará unos valores por
defecto que pueden diferir incluso entre versiones idénticas del software. Esta práctica es recomendable,
principalmente, cuando se quiera que una aplicación Web se ejecute en diferentes browsers y STBs de
Imagenio.

También es recomendable especificar el tamaño en píxeles de la fuente mediante hojas de estilo, de otra
forma el texto puede no encajar en el espacio reservado para el mismo. A continuación se muestra un
ejemplo:

          .text-principal {

            font-size: 18px;

            font-weight: bold;

                                                  18
Taller imagenio                                                   Guía para el desarrollo de aplicaciones

             font-color: #ffffff;

        }

Por último, se recomienda redefinir los estilos globales para los tags INPUT y TEXTAREA. De esta
manera, cuando el navegador calcule el tamaño de las cajas no utilizará el tamaño de letra por defecto
como referencia. A continuación se muestra un ejemplo:

         input {
                   font-family: Arial, Helvetica, sans-serif;
                   font-size: 16pt;
                   font-weight: bold;
         }
         textarea {
                   font-family: Arial, Helvetica, sans-serif;
                   font-size: 16pt;
                   font-weight: bold;
         }

4.6 Navegación por foco
Otra importante característica a tener en cuenta cuando se diseñan aplicaciones para Imagenio, es que el
usuario no dispone de un ratón para seleccionar elementos de la pantalla. El usuario deberá utilizar las
teclas de flechas para ir moviendo el foco por la pantalla. Esto implica una “libertad de movimiento” menor
en comparación con el PC. Para alcanzar un elemento, el usuario debe navegar pasando por los elementos
intermedios. Además, los elementos situados en diagonal no resultan alcanzables de una manera intuitiva,
ya que no se corresponden directamente a la dirección de ninguna de las flechas y habría que llegar a través
de algún elemento intermedio.

Se recomienda incluir pocos elementos en pantalla y que el movimiento del foco sea lo más flexible
posible. De esta forma se generará una experiencia de usuario más satisfactoria.

También se recomienda evitar utilizar enlaces HTML de tipo HREF. El browser del STB de Imagenio tiene
un mecanismo estándar para mover el foco entre los distintos elementos de este tipo, pero los resalta de una
manera poco vistoso de cara a los usuarios.

En su lugar se deben utilizar elementos de tipo IMG, teniendo en cuenta lo siguiente:
   • El cambio de foco en la pantalla se debe controlar a través de la función keyPressed ().
   • Se debe cambiar, por javascript, la imagen asociada al elemento que reciben el foco.
   • Se debe controlar, por javascript, en todo momento, el elemento que tiene el foco, es decir, el
       elemento activo de la pantalla.
   • Se debe ejecutar la acción correspondiente cuando se selecciona el elemento activo de la pantalla.

                                                     19
Taller imagenio                                                Guía para el desarrollo de aplicaciones

A continuación se muestra un ejemplo.

Fichero 8: menu.php (version 5)

        Seminario Imagenio CampusParty 2008

                top.keyPressed = function (codigo) {
                  try {
                    switch (codigo) {
                        case top.KEY_BLUE:
                            document.location.reload();
                            break;
                        case top.KEY_RIGHT:
                            siguienteMenu();
                            break;
                        case top.KEY_LEFT:
                            anteriorMenu();
                            break;
                        case top.KEY_SELECT:
                            selectMenu();
                            break;
                        case top.KEY_BACK:
                            top.document.location = "../index.html"
                            break;
                        default:
                            //alert ("ha pulsado la tecla "+codigo);
                            break;
                    }
                  }catch(e) {
                    alert(e);
                  }
                }

                precargarImagenesMenu();

                                                  20
Taller imagenio                                                 Guía para el desarrollo de aplicaciones

En el ejemplo anterior hay una capa que contiene tres elementos, cada uno de ellos representa una opción
distinta.

En el evento onload del body de la página, se resalta el elemento activo, poniendo una imagen distinta que
lo diferencia. Esta operación se hace a través de la función mostrarElemActivoMenu().

Mediante las teclas de flechas izquierda y derecha se hace el cambio del elemento activo, es decir, del
elemento que tiene el foco. Estas operaciones se realizan mediante las funciones siguienteMenu() y
anteriorMenu().

Cuando se pulsa la tecla de SELECT se ejecuta la acción asociada con el elemento activo, a través de la
función selectMenu().

Fichero 9: main.js
var menuElemAtivo = 0;

function mostrarElemActivoMenu () {

    var activo = getURLParam("activo");
    if (activo!=null)
        menuElemAtivo = parseInt(activo);

    switch (menuElemAtivo)   {
        case 0:
            var elemActivo   = document.getElementById("img_tv");
            elemActivo.src   = "./img/tv_on.png";
            break;
        case 1:
            var elemActivo   = document.getElementById("img_vod");
            elemActivo.src   = "./img/vod_on.png";
            break;
        case 2:
            var elemActivo   = document.getElementById("img_serv");
            elemActivo.src   = "./img/serv_on.png";
            break;
        default:

                                                   21
Taller imagenio                                           Guía para el desarrollo de aplicaciones

           var elemActivo = document.getElementById("img_tv");
           elemActivo.src = "./img/tv_on.png";
           menuElemAtivo = 0;
           break;

    }
}

function siguienteMenu () {

    switch (menuElemAtivo) {
        case 0:
            var elemActivo = document.getElementById("img_tv");
            elemActivo.src = "./img/tv_off.png";

           var nuevoElemActivo = document.getElementById("img_vod");
           nuevoElemActivo.src = "./img/vod_on.png";

            menuElemAtivo = 1;
            break;
        case 1:
            var elemActivo = document.getElementById("img_vod");
            elemActivo.src = "./img/vod_off.png";

           var nuevoElemActivo = document.getElementById("img_serv");
           nuevoElemActivo.src = "./img/serv_on.png";

            menuElemAtivo = 2;
            break;
        case 2:
            var elemActivo = document.getElementById("img_serv");
            elemActivo.src = "./img/serv_off.png";

           var nuevoElemActivo = document.getElementById("img_tv");
           nuevoElemActivo.src = "./img/tv_on.png";

           menuElemAtivo = 0;
           break;
    }
}

function anteriorMenu () {

    switch (menuElemAtivo) {
        case 0:
            var elemActivo = document.getElementById("img_tv");
            elemActivo.src = "./img/tv_off.png";

           var nuevoElemActivo = document.getElementById("img_serv");
           nuevoElemActivo.src = "./img/serv_on.png";

            menuElemAtivo = 2;
            break;
        case 1:
            var elemActivo = document.getElementById("img_vod");
            elemActivo.src = "./img/vod_off.png";

           var nuevoElemActivo = document.getElementById("img_tv");
           nuevoElemActivo.src = "./img/tv_on.png";

                                              22
Taller imagenio                                                     Guía para el desarrollo de aplicaciones

            menuElemAtivo = 0;
            break;
        case 2:
            var elemActivo = document.getElementById("img_serv");
            elemActivo.src = "./img/serv_off.png";

             var nuevoElemActivo = document.getElementById("img_vod");
             nuevoElemActivo.src = "./img/vod_on.png";

             menuElemAtivo = 1;
             break;
    }
}

function selectMenu () {

    switch (menuElemAtivo) {
        case 0:
            document.location = "./tv.php";
            break;
        case 1:
            document.location = "./verVideo.php";
            break;
        case 2:
            document.location = "./serv.php";
            break;
    }
}

El resultado en un navegador web de este ejemplo es el siguiente:

                                                   23
Taller imagenio                                                 Guía para el desarrollo de aplicaciones

                                    Figura 3: menu.php (versión 5)

4.7 Manejo de objetos de vídeo
Como ya se comentado en este documento, las funciones relacionadas con la reproducción de vídeo están
disponibles para las aplicaciones de Imagenio a través de la librería javascript VideoObject_ial.js.

Los descos de Imagenio que se utilizarán en el taller Imagenio permiten la reproducción de vídeo en
streaming.

Las funciones que se ofrecen en esta librería son las siguientes:
   • top.Video.load (URL, tiempo_de_inicio)
       Carga un vídeo y empieza a reproducirlo. Los parámetros de entrada son:
           o URL es la URL donde se encuentra el vídeo.
           o tiempo_inicio es el segundo a partir del cual deseamos empezar a reproducir el vídeo.

       Sólo se permite reproducción por streaming, puesto que los descos utilizados en el taller Imagenio
       no tienen disco duro donde almacenar contenidos.

       Se permite dos tipos de flujos:
           o Unicast: se usa para contenidos de vídeo bajo demanda (videoclub). Se utiliza el protocolo
              de control RTSP. Un ejemplo de reproducción de vídeo por unicast en una aplicación de
              Imagenio sería el siguiente:

                                                  24
Taller imagenio                                                   Guía para el desarrollo de aplicaciones

                 top.Video.load("rtsp://192.168.70.1:5555/cp/narnia.mpg",0);

           o Multicast: se usa para contenidos de vídeo en difusión (televisión). Se utiliza el protocolo
             de control IGMP para la suscripción a canales multicast. Un ejemplo de reproducción de
             vídeo por multicast en una aplicación de Imagenio sería el siguiente:

                 top.Video.load("igmp://239.1.1.7:3500",0)

   •   top.Video.rewind()
       Activa la función rebobinado, que estará activa hasta recibir un stop o un play, o se haya
       rebobinado hasta el principio del contenido.

   •   top.Video.forward()
       Activa la función avance rápido, que estará activa hasta recibir un stop o un play, o se haya
       rebobinado hasta el final de un contenido.

   •   top.Video.play()
       Activa la función play desde un estado forward, rewind o pause.

   •   top.Video.pause()
       Activa la función pause.

   •   top.Video.stop()
       Detiene la reproducción en curso del video

   •   top.Video.destroy()
       Libera los recursos de video

La librería de reproducción de video dispara ciertos eventos ante ciertas circunstancias relacionadas con la
reproducción de un vídeo. Estos eventos son: inicio de la reproducción, fin de la reproducción y error
durante la reproducción o antes de iniciarse.

Para realizar las acciones que se consideren oportunas, se deben implementar las siguientes funciones en la
página que desarrollemos:
   • atBegin()
   • atEnd()
   • atError()

De especial interés en el caso del video son las teclas del mando para controlar la reproducción del vídeo.
Se indica a continuación la funcionalidad que se suele asociar a dichas teclas:
    • top.KEY_FWD:                      Avance rápido
    • top.KEY_RWD:                      Rebobinado”
    • top.KEY_PLAY:                     Reproducción normal

                                                    25
Taller imagenio                                                 Guía para el desarrollo de aplicaciones

   •     top.KEY_PAUSE:               Pausa la reproducción
   •     top.KEY_STOP:                Detiene la reproducción

A continuación se muestra una página de ejemplo que recoge todos los conceptos tratados en este apartado.

Fichero 10: verVideo.php

    Seminario Imagenio CampusParty 2008

          var mensErr="Video no disponible";

          function init() {
              try {

                  top.Video= new top.VideoObject(2);
                  top.Video.initObject();
                  top.Video.load("rtsp://192.168.70.1:5555/cp/narnia.mpg",0);
                  //top.Video.load("igmp://239.1.1.7:3500",0);
                  top.Video.play();
                  playing = true;
              } catch (e) {
                  alert ("Error en la inicializaci??"+e);
              }
          }

          top.keyPressed = function (codigo) {
              try {
                  switch (codigo) {
                      case top.KEY_BLUE:
                          finish();
                          document.location.reload();
                          break;
                      case top.KEY_FWD:
                          top.Video.forward();
                          playing=false;
                          break;
                      case top.KEY_RWD:
                          top.Video.rewind();
                          playing=false;
                          break;
                      case top.KEY_PLAY:
                          top.Video.play();
                          break;
                      case top.KEY_PAUSE:
                          top.Video.pause();
                          break;
                      case top.KEY_PLAYPAUSE:
                          if(playing){

                                                  26
Taller imagenio                                             Guía para el desarrollo de aplicaciones

                              top.Video.pause();
                              playing =false;
                         }
                         else {
                             top.Video.play();
                             playing = true;
                         }
                         break;
                     case top.KEY_BACK:
                     case top.KEY_STOP:
                     case top.KEY_HOME:
                         finish();
                         setTimeout("document.location = './menu.php?activo=1'", 2000);
                         break;
                     default:
                         //alert ("ha pulsado la tecla "+codigo);
                         break;
                  }
              }catch(e) {
                  alert(e);
              }
          }

          function finish() {
              try {
                  if(top.Video)
                      top.Video.destroy();
                  top.Video=null;
              }
              catch(exc) {}
          }

          top.atVideoBegin = function() {
                  //alert("atBegin")
          };

          top.atVideoEnd= function() {
              finish();
              setTimeout("document.location = './menu.php?activo=1'", 2000);
          };

          top.atVideoError= function() {
              alert(mensErr);
              document.location = "./menu.php?activo=1";
          };

                                                   27
Taller imagenio                                                  Guía para el desarrollo de aplicaciones

Como se puede observar, a través del evento onload del body de la página, se llama a la función init() que
crea e inicializa el objeto de vídeo que se va a utilizar para reproducir vídeo.

Mediante las teclas del mando se controla la reproducción del vídeo. Este control se implementa en la
funcion keyPressed().

En la función finish() se destruye el objeto de vídeo cuando se ha terminado la reproducción del mismo.

Finalmente, se han implementado las funciones atBegin(), atEnd() y atError(), para controlar dichos
eventos y realizar la acción correspondiente en cada caso.

Hay que destacar que, dentro del body de la página, se puede incluir código HTML. Este contenido HTML
quedará superpuesto a la imagen del vídeo que se reproduce en segundo plano.

4.8 Integración con servicios de Internet
Una de las funcionalidades más interesantes que permiten las aplicaciones de Imagenio es la posibilidad de
integrar servicios de Internet ya existentes.

Para ofrecer a los usuarios una alta interactividad de las aplicaciones de este tipo, se recomienda (aunque
no es obligatorio) utilizar llamadas asíncronas a los servicios de Internet. Estas llamadas asíncronas se
pueden implementar mediante:
   • iframes
   • XMLHttpRequest (Ajax)

A continuación se muestra un ejemplo que utiliza el API de Flick para buscar fotos y mostrarlas en la
televisión.

Fichero 11: flickr_js.php

        Seminario Imagenio CampusParty 2008

             top.keyPressed = function (codigo) {
               try {
                     switch (codigo) {

                                                   28
Taller imagenio                                           Guía para el desarrollo de aplicaciones

                      case top.KEY_BLUE:
                          document.location.reload();
                          break;
                      case top.KEY_BACK:
                          document.location = "./serv.php?activo=0";
                          break;
                      case top.KEY_HOME:
                          document.location = "./menu.php?activo=2";
                          break;
                      case top.KEY_SELECT:
                          if (!inputVisible)
                              showInput();
                          break;
                      case top.KEY_RED:
                          if (inputVisible)
                              hideInput();
                          break;
                      case top.KEY_GREEN:
                          if (inputVisible)
                              reloadPhotos();
                          break;
                      default:
                          //alert ("ha pulsado la tecla "+codigo);
                          break;
                   }
             }catch(e) {
               alert(e);
             }
         }

         var inputVisible = false;
         var txtFocused = false;

         var   texto = "campus%20party%202007";
         var   perpage = 5;
         var   data;
         var   fotoActiva = 0;
         var   imgActiva = 1;
         var   timeout = 4000;
         var   divWidth = 605;
         var   divHeight = 525;

         function togglePhotos () {

               var img1 = document.getElementById('foto1');
               var img2 = document.getElementById('foto2');

               if (imgActiva==1) {
                   img1.style.visibility   = 'hidden';
                   img2.style.visibility   = 'visible';
                   imgActiva==2;
               } else {
                   img2.style.visibility   = 'hidden';
                   img1.style.visibility   = 'visible';
                   imgActiva==1;
               }
         }

         function showPhoto (photo) {

                                               29
Taller imagenio                                            Guía para el desarrollo de aplicaciones

                var urlPhoto = 'http://farm' + photo.farm + '.static.flickr.com/' + photo.server
+ '/' + photo.id + '_' + photo.secret + '.jpg';

               if (imgActiva==1) {
                   var img2 = document.getElementById('foto2');
                   img2.src = urlPhoto;
               } else {
                   var img1 = document.getElementById('foto1');
                   img1.src = urlPhoto;
               }
               setTimeout("togglePhotos()",2000);
           }

           function jsonFlickrApi(rsp){

               data = rsp;
               if (rsp.stat == "ok"){
                       showPhoto(rsp.photos.photo[fotoActiva++]);

                        if (fotoActiva >= rsp.photos.perpage || fotoActiva >=
rsp.photos.photo.length) {
                            fotoActiva = 0;
                            if (rsp.photos.page >= rsp.photos.pages)
                                setTimeout("callFlickr(0)", timeout);
                            else
                                setTimeout("callFlickr (data.photos.page+1)", timeout);
                        } else {
                                setTimeout("jsonFlickrApi(data)", timeout);

                       }
               }
           }

           function callFlickr (pag) {
               if (pag==0)
                   pag = Math.round(Math.random() * 500) + 1;

               var params = "";
               params += "?method=flickr.photos.search";
               params += "&api_key=aecda1edd2a368dab707daf0f2d4e9a5";
               params += "&text=" + texto;
//             params += "user_id=49578859@N00";
               params += "&sort=relevance";
               params += "&page=" + pag;
               params += "&per_page=" + perpage;
               params += "&format=json";

               var urlFlickr = 'http://api.flickr.com/services/rest/' + escape(params);
               var urlProxy = './proxy.php?url=' + urlFlickr;

               var myAjax = new Ajax.Request(
                       urlProxy,
                       {
                           method: 'get',
                           evalJS: 'force',
                           onFailure: errorFotos
                       }
               );

                                              30
Taller imagenio                                              Guía para el desarrollo de aplicaciones

             }

             function errorFotos (request) {
                 alert("ERROR = " + request.responseText);
             }

             function reloadPhotos () {
                 var input = document.getElementById('txt_buscar');
                 var inputBlock = document.getElementById('input_block');
                 if (input!=null && inputBlock!=null) {
                     //alert(escape(input.value));
                     if (input.value.length>2) {
                         texto=escape(input.value);
                         callFlickr(0);
                     }
                     inputBlock.style.display = 'none';
                     inputVisible=false;
                 }
             }

             function showInput () {
                 var input = document.getElementById('txt_buscar');
                 var inputBlock = document.getElementById('input_block');
                 if (input!=null && inputBlock!=null) {
                     inputBlock.style.display = 'block';
                     input.focus();
                     inputVisible=true;
                 }
             }

             function hideInput () {
                 var inputBlock = document.getElementById('input_block');
                 if (inputBlock!=null) {
                     inputBlock.style.display = 'none';
                     inputVisible=false;
                 }
             }

          Introduce el texto:
          
                  Cancelar 
              
                                               31
Taller imagenio                                                    Guía para el desarrollo de aplicaciones

                      Aceptar
                  
Vamos a explicar resumidamente el funcionamiento de esta página.

En el evento onload del body de la página se hace una llamada a la función callFlickr(). De esta forma se
inicia el proceso de búsqueda de fotos en Flickr y su visualilzación en la televisión.

La función callFlickr() es la responsable de hacer la llamada al API REST de Flickr (ver la
documentación de Flickr para más detalle) y obtener los datos en formato JSON. En esta aplicación se usa
el método flicker.photos.search del API de Flickr. Este método devuelve una lista paginada de metadatos
de fotos que cumplen un determinado criterio de búsqueda.

Esta llamada al API de Flickr se hace mediante Ajax, usando para ello la librería prototype. Cuando la
petición HTTP asíncrona se completa de forma correcta, se evalúa el resultado automáticamente, lo cual
conlleva llamar a la función jsonFlickrApi() de nuestra aplicación (la implementación de la función
jsonFlickrApi() es un requisito impuesto por el API de Flickr).

Dentro de la función jsonFlickrApi() se realiza la visualización, una a una, de las fotos obtenidas de Flickr.
La URL de cada una de las fotos se genera a partir de los metadatos correspondientes, según especifica
Flickr.

Una vez completada la visualización de todas las fotos obtenidas en una lista paginada de metadatos, se
realiza una nueva petición asíncrona a Flickr para obtener la siguiente página de resultados, y así repetir el
proceso.

4.9 Introducción de datos y teclado virtual
Ya se ha comentado anteriormente en esta guía que el teclado virtual de los descodificadores de Imagenio
se utiliza para la introducción de texto en las cajas de edición de la aplicación, es decir, en los objetos de
tipo INPUT y TEXTAREA de una aplicación de Imagenio.

En el fichero Fichero 11: flickr_js.php, dentro del body de la página, se ha incluido una caja de edición
de tipo INPUT. La capa que contiene dicho objeto de edición se muestra al pulsar el botón SELECT del
mando y, automáticamente, este objeto recibe el foco de la aplicación.

Si a continuación se pulsa la tecla de mando correspondiente al teclado virtual, dicho teclado se muestra en
pantalla.

                                                     32
Taller imagenio                                                  Guía para el desarrollo de aplicaciones

Este comportamiento de visualización del teclado virtual y edición de texto no es necesario controlarlo por
aplicación, puesto que es comportamiento por defecto que tiene de forma implícita del descodificador de
Imagenio.

El teclado virtual de los descodificadores de Imagenio no es muy fácil de usar, y se pueden pensar en
distintas formas de mejorar la introducción de text, mediante la implementación de otros mecanismos en
nuestras aplicaciones.

                                                   33
También puede leer