Documentacion

Arquitectura del Sistema

El Sistema MUAN fue desarrollado para la plataforma Linux  y la parte del software utiliza varias bibliotecas o códigos de programas que son libremente distribuidos, tornando al aplicativo bastante flexible. La idea principal del sistema MUAN es mostrar imágenes capturadas de una cámara de video y permitir al usuario seleccionar las imágenes deseadas. Un grupo de imágenes seleccionadas/capturadas formara una animación. La forma como ese proceso funciona y cuáles son sus necesidades están detalladas abajo.

Descripción del Sistema

El software MUAN posee características muy importantes para la animación cuadro a cuadro, tales como alternar entre una imagen ya capturada y una imagen de la cámara, previa instantánea de la animación, borrar o insertar cuadros (frames), marcar frames y “flip”.

Esta última característica es muy útil para la animación cuadro a cuadro porque permite la comparación del último frame capturado con la imagen proveniente de la cámara (imagen en vivo), para que el usuario pueda verificar si el frame que será capturado es el deseado, permitiendo así el ajuste de la escena. Marcadores de frames son utilizados para modificar la duración, exhibición o aún borrar un intervalo de frames. Por “duración” de un frame, queremos decir el tiempo que éste será repetido dentro de la secuencia de animación, como se demuestra  en la figura de abajo.

Representación de la duración del frame

Para implementar los recursos de animación cuadro a cuadro, creamos una lista de imágenes que guarda los frames de la animación, o sea, las imágenes capturadas con sus propiedades como tiempo de permanencia, marcación, duración y posición en la lista. Con esta lista, podemos manipular las posiciones, visualizando cualquier frame de la animación en cualquier momento. Así, en la interface del usuario son mostrados  componentes para exhibir o detener la animación, volver, avanzar, ir al primer frame, al último o a una posición de frame cualquiera en la lista, borrar toda la lista o remover frames de la lista. Además, el usuario puede elegir si la aplicación está en modo cámara, mostrando la imagen actual vista por la lente, o en el modo memoria, mostrando las imágenes ya capturadas. En ambos modos, las imágenes son mostradas en una ventana OpenGL. Así, una imagen al ser mostrada es un conjunto ordenado (vector) de píxeles en el sistema de colores RGB, aunque en la lista, los frames guardados estén en formato DV. A pesar que ese formato contiene información de imagen y sonido, su tamaño es más comprimido que un simple vector de píxeles.     

Debido al hecho de que la aplicación necesita mostrar las imágenes actuales recibidas de la cámara, trabajamos con procesos paralelos, donde uno de ellos está continuamente recibiendo imágenes de la cámara en tiempo real. Cuando utilizamos una cámara con firewire, la aplicación establece comunicación con la cámara y captura los datos en formato DV. Las imágenes en formato DV tienen la proporción de 3:2, o sea, widescreen. Nuestro propósito no es trabajar con el sonido sino en capturar imágenes, entonces el frame DV capturado tiene una banda sonora de audio apagada. Cuando la conexión con la cámara se activa a través de la entrada RCA/compuesta o S-video, la aplicación abre comunicación directa con el dispositivo, a través del video4linux (v4l), capturando las imágenes como un conjunto ordenado de píxeles en el sistema de colores RGB con 24 bits por píxel. En este caso, las imágenes capturadas están en la proporción 4:3, por eso colocamos barras negras en los laterales de la imagen y convertimos al formato DV para incluirlos en la lista de frames capturados.
Una vez que todos los frames deseados fueron capturados, el usuario podrá guardar la animación generando un  archivo de video. Muan puede grabar archivos de video en los formatos AVI o MPEG. Otra opción es guardar cada frame como un archivo de imagen en formato JPEG. Así, disponemos de  funciones para leer archivos de video en formato AVI o MPEG y archivos de imagen en formato RAS o JPG. El usuario puede abrir uno de esos archivos y editarlos, o puede insertar archivos en estos formatos en una animación que se esté creando.

Para lograr que la aplicación sea más amigable, también están presentes en la interface con el usuario opciones como:
  • visualización de la ventana imagen en pantalla completa.
  • exhibición de la animación en repetición continua (loop).
  • operación de “flip”, que alterna entre el modo de cámara y el modo memoria, ofreciendo una herramienta auxiliar para el animador analizar/comparar el último con el próximo frame a ser capturado.

Interface do Sistema

Podemos describir las interacciones de nuestro sistema de la siguiente forma:

Para implementar las funcionalidades  mencionadas en la sección “Descripción del Sistema”, usamos algunas bibliotecas comúnmente utilizadas en la plataforma Linux y que son distribuidas libremente.  

Creamos una biblioteca de video que hace la interface de comunicación con los dispositivos de entrada y salida (I/O) utilizando las bibliotecas y drives del propio linux de acuerdo al tipo de conexión (firewire o V4L). En el caso de la conexión firewire, la interface con ieee1394 (ver sección Captura y Exhibición de Imagen en Linux) fue basada en la clase IEEE1394 Reader, que es parte del aplicativo Kino y captura datos DV de forma asíncrona a través de la biblioteca libraw 1394.  Así, los frames que están siendo continuamente capturados por un proceso paralelo van siendo almacenados en la memoria. En el caso de la conexión V4L, la biblioteca de video interactúa  directamente con el driver V4L capturando una imagen cada vez que el aplicativo necesita.

Para implementar las funciones de almacenamiento de animaciones en archivos de video, usamos las bibliotecas libavcodec y libavformat, que hacen parte del proyecto FFmpeg (htto://ffmpeg.mplayer.hu). FFmpeg tiene las funciones de grabar, convertir y hacer stream de audio y video y es desarrollado sobre Linux, aunque pueda ser compilado en la mayoría de los sistemas operacionales, o que incluye el Windows. La biblioteca Libavcodec contiene todos los Codificadores y DECodificadores (codecs) de audio y video del FFmpeg. La mayoría de estos codecs fueron programados desde cero para garantizar una mejor performance y alto re-uso de código. La biblioteca libavformat contiene interpretadores y generadores para todos los formatos comunes de audio y video. Con estas bibliotecas el aplicativo es capaz de leer y escribir archivos MPEG.

Para importar imágenes en JPEG para una animación o exportar los frames de una animación en formato JPEG, utilizamos la biblioteca libjpeg versión 6b que es libre y bastante utilizada para manejar el formato de imagen JPEG. Ella fue escrita y es distribuida por IJG (http://www.ijg.org). Nuestro código para la conversión de ese formato fue basado, en los programas djpeg y cipeg respectivamente, que son incluidos en esta biblioteca.

La clase ImgList implementa la representación de la animación con una lista utilizada para guardar frames. Para representar imágenes o frames de una animación, utilizamos dos clases: una que implementa el frame apenas como una imagen, o sea, un vector de píxeles (colores), y otra que implementa el frame como dato de video digital (DV), con los traídos de dispositivos digitales conectados por firewire. Esa segunda representación también fue implementada con base en el aplicativo Kino, utilizando la clase Frame que ofrece utilitarios para procesar frames de video digital a través de la biblioteca libdv del Linux. El codec Quasar DV (libdv) es un software codec para el formato DV, formato  utilizado por la mayoría de las filmadoras digitales, normalmente aquellas con interface IEEE1394. La Libdv ( http://libdv.sourceforge.net) fue desarrollada de acuerdo a los padrones oficiales para video DV: IEC 61834 y SMPTE 314M.

Otra biblioteca C libre que usamos en MUAN es la libsndfile. Libsndfile es una API simple y fácil de usar para lectura y grabación de un gran número de formatos de archivos de audio que trabajan con muestras de sonido y puede ser utilizado en Unix, Win32, MacOS, entre otros. En Linux, la libsndfile puede trabajar sobre el drive ALSA (Arquitectura Avanzada de Sonido del Linux), que ofrece funciones de audio y MIDI al sistema operacional, y es como estamos trabajando. Como ya se expuso anteriormente, no estamos trabajando con audio para animación, pero a veces necesitamos de audio en la interface con el usuario, lo cual permite una mejor interacción. De esta forma, estamos utilizando la libsndfile y, para tal, necesitamos del drive ALSA en la computadora.
Anima Escola