• No se han encontrado resultados

3.1 SUBRUTINAS IMPLEMENTADAS EN ANDROID

3.1.10 VISUALIZACIÓN DEL MJPEG

Para que sea posible la visualización del video en formato MJPEG trasmitido por la cámara IP es necesario crear una ventana para mostrar en pantalla las imágenes JPEG con una frecuencia tal que aparezcan como un video.

Para que sea posible dibujar en las pantallas de control los fotogramas individuales analizados por la clase Flujo de Datos MJPEG se crea la clase Visualización del MJPEG. Esta clase hereda las propiedades de SurfaceView e implementa SurfaceHolder.Callback para proporcionar en pantalla una superficie de dibujo visible al usuario, de la cual es posible controlar el formato, tamaño y ubicación en pantalla.

Gracias a las propiedades heredadas de SurfaceView el cambio de un fotograma a otro es invisible para el usuario porque ofrece una superficie de dibujo en un hilo secundario de la aplicación de forma que el programa no está obligado a esperar hasta se termine de dibujar un fotograma para empezar a dibujar el siguiente. Se debe implementar la subclase SurfaceHolder.Callback porque es el medio para notificar cuando se crea, modifica o destruye una superficie de dibujo.

Dentro de la clase Visualización del MJPEG se crea la clase Visualizacion_del_MJPEGThread cuyo propósito es proporcionar un hilo secundario para representar una superficie rectangular en la pantalla sobre la cual se llevarán a cabo todos los procedimientos de dibujar los fotogramas en pantalla. Las dimensiones de las pantallas de los dispositivos móviles son diversas por lo tanto, para una correcta visualización, el programador puede elegir entre tres modos de visualización distintos que son: Tamaño Estándar, Mejor Tamaño y Pantalla Completa.

Sin importar el modo de visualización elegido, la primera acción a realizar es obtener el ancho y alto de la pantalla del dispositivo móvil que el usuario esté utilizando para correr la presente aplicación mediante el método EstablecerDimensionesSuperficie().

Si se eligió el modo Tamaño Estándar se construye en el centro de la pantalla un rectángulo en el cual se dibujarán los fotogramas obtenidos por la clase Visualización del MJPEG. En el modo Mejor Tamaño para conseguir una mejor visualización del video por parte del usuario se toma en cuenta la relación de aspecto, cuya fórmula es la siguiente:

ܴ݈݁ܽܿ݅×݊݀݁ܣݏ݌݁ܿݐ݋ ൌܣ݈ݐݑݎܽ݀݁ܲܽ݊ݐ݈݈ܽܽܣ݄݊ܿ݋݀݁ܲܽ݊ݐ݈݈ܽܽ

El rectángulo construido en este modo puede tener dos tamaños:

- El ancho de la pantalla se mantiene para visualizar la imagen pero el alto de la imagen es el producto del ancho de la pantalla con la Relación de Aspecto

- Si el resultado del producto del ancho de la pantalla con la Relación de Aspecto es mayor que la altura de la pantalla, entonces el alto de la pantalla se mantiene para visualizar la imagen pero el ancho de la imagen es el producto del alto de la pantalla con la Relación de Aspecto.

El rectángulo se dibuja en el centro de la pantalla con bordes negros para mejorar el brillo de la imagen en la pantalla y que el usuario mire los colores de los fotogramas más brillantes.

En el modo Pantalla Completa se dibuja un rectángulo que contendrá la visualización de las imágenes del tamaño original de la pantalla empezando a dibujar en la esquina superior izquierda de la pantalla hasta la esquina inferior derecha.

A continuación se crea el método run() que constituye un subproceso para ejecutar el cuerpo del hilo en ejecución y visualización de las imágenes en JPEG. Para dibujar los fotogramas en pantalla se necesita de cuatro componentes básicos que son: un mapa de bits para mantener los píxeles, un lienzo de dibujo, un dibujo primitivo Rectángulo de la clase Visualizacion_del_MJPEGThread y la pintura desde el método LecturaMarcoMJPEG() dentro de la clase Flujo de Datos MJPEG.

Mientras se esté ejecutando la aplicación cada hilo secundario de SurfaceView puede dibujar a su propio ritmo sin tener que esperar a que se haya terminado de dibujar el fotograma anterior, lo cual se logra con el comando lockCanvas() que recupera la superficie creada y dibuja en ella los datos de entrada del video MJPEG obtenidos desde el método Lectura Marco MJPEG. Además, se dibuja un fondo negro para permitir una mejor visualización de los colores del video a la vista del usuario.

Una vez que se ha terminado de dibujar los fotogramas en pantalla se llama a unlockCanvasAndPost() y la superficie en pantalla queda limpia para volver a dibujar en ella si el método se vuelve a llamar.

Los atributos y vínculos de los objetos de visualización son creados y además la superficie dibujada se hace visible mediante el método surfaceCreated() y es posible acceder a ella a través de la interfaz SurfaceHolder. Cuando el usuario sale de cualquiera de las pantallas de control, la superficie de dibujo se oculta con el método surfaceDestroyed hasta una nueva llamada y con el método DetenerVideo() se pone en stop el hilo de ejecución para visualización de los fotogramas en pantalla. Si el usuario desea volver a ingresar a cualquiera de las pantallas de control y visualizar el video, es posible gracias al método Inicio Video() que pone en marcha nuevamente todo el proceso de visualización del MJPEG.

Documento similar