Issuu on Google+

16/05/2011

La Java Media Framework (JMF) es un API para la manipulación y procesamiento de medios en Java. Proporciona herramientas para la captura, procesamiento y almacenamiento de datos multimedia. Permite su transmisión y recepción a través de Internet, reproducir ficheros multimedia en applets y aplicaciones, reproducir flujos multimedia recibidos en tiempo real a través de la red, capturar audio y vídeo de un micrófono y una cámara de vídeo. Provee codificadores y decodificadores para los formatos multimedia más relevantes, siendo capaz además, de realizar transcodificación entre dichos formatos

INTRODUCCIÓN A LA JMF

1


16/05/2011

La API del marco de trabajo de medios de Java (JMF, Java Media Framework API) para agregar medios de audio y video a una aplicación. La API de Sonido de Java (Java Sound API) para reproducir, grabar y modificar audio. La API 3D de Java (Java 3D API) para crear y modificar gráficos en 3D. La API de procesamiento avanzado de imágenes de Java (Java Advanced Imaging API) para las herramientas del procesamiento de imágenes, como recortar y escalar. La API de síntesis te voz de Java (Java Speech API) para introducir comandos del usuario, o emitir comandos de voz al usuario. La API 2D de Java (Java 2D API) para crear y modificar gráficos en 2D. La API de E/S de imágenes de Java (Java Image I/O API) para leer y escribir imágenes en archivos.

ALGUNAS API’S (APLICATION PROGRAMMING INTERFACE) DE LA JMF

– javax.media, – javax.media.bean.playerbean, – javax.media.control, – javax.media.datasink, – javax.media.format, – javax.media.protocol, – javax.media.renderer, – javax.media.rtp, – javax.media.rtp.event, – javax.media.rtp.rtcp, – javax.media.util

PAQUETES DEFINIDOS POR LA JMF

2


16/05/2011

MODELO DE PROCESAMIENTO DE LA JMF

ARQUITECTURA DE LA JMF

3


16/05/2011

Existe una gran variedad de formatos de audio, imagen y video. Entre estos formatos podemos destacar:

 .avi (Microsoft Audio/Video Interleave),  .swf (pelíulas de Macromedia Flash),  .spl (Future Splash),  .mp3 (Audio MGEP nivel 3),  .mid o .midi (Interfaz Digital de Instrumentos Musicales),  .mpeg y .mpg (Videos MPEG-1),  .mov (QuickTime),  .au (Formato de archivo Sun Audio)  .aif o .aiff (Formato de archivo Macintosh AIFF).

FORMATOS SOPORTADOS POR LA JMF

Para mantener un registro de los paquetes que pueden tener clases JMF como Players, Processors, DataSources y DataSinks se utiliza el PackageManager. CaptureDeviceManager mantiene registro de los dispositivos de captura de datos multimedia del sistema. Por último existe el PlugInManager que lleva la cuenta de los plug-ins existentes en el sistema.

CLASE MANAGER

4


16/05/2011

javax.media.protocol Representa el origen de datos multimedia. En Java Media Framework los datos multimedia pueden proceder de diversas fuentes, como archivos locales o remotos y video y audio en tiempo real o bajo demanda. Una fuente de datos multimedia se modela mediante un objeto DataSource. Podemos crear una DataSource directamente a través de una URL (Universal Resource Locator) o bien mediante un objeto de tipo MediaLocator.

CLASE DATASOURCE

javax.media Actúa como gestor de datos multimedia. En Java Media Framework un reproductor será el encargado de reproducir un determinado contenido multimedia a través del hardware existente en nuestro equipo. Para reproducir un flujo de datos multimedia, se ha de construir una instancia de la clase de Java Media Framework Player cuya entrada sea dicho flujo de datos. Podemos construir un objeto Player indirectamente a través del método createPlayer() de la clase de Java Media Framework Manager. El flujo multimedia de entrada al Player constituye un parámetro del método createPlayer() admitiendose una DataSource, un MediaLocator o una URL.

INTERFAZ PLAYER

5


16/05/2011

Creación de un Player. Métodos createPlayer() de la clase Manager Player createPlayer (DataSource dataSource) Player createPlayer (MediaLocator sourceLocator)

Ejemplo de creación de un Player

Player createPlayer (java.net.URL sourceURL)

public void abrirContenidoMM(String cadenaContenidoMM) { //Se crea URL para la cadena URL url = null; url = new URL(cadenaContenidoMM); //Se crea el reproductor player = Manager.createPlayer(url); ... (Se omiten captura de excepciones)

PLAYER (CONT.)

Un Player puede encontrarse a lo largo de su vida en 4 estados fundamentales: • "Unrealized": El estado en el que se encuentra un player cuando es creado por primera vez y no tiene ningún conocimiento acerca de la fuente de datos de entrada. • "Realized": Al pasar a este estado, el player conoce el tipo de fuente de datos de entrada que habrá de reproducir, conoce también los recursos que va a necesitar. • "Prefetched": En este estado, el player está preparado para reproducir los datos multimedia de su fuente de entrada. • "Started": Llamando al método start() del player se pasa a este estado en el que se está reproduciendo el contenido multimedia.

ESTADOS DE UN PLAYER

6


16/05/2011

Métodos fundamentales proporcionados por un Player en función del estado Método

Descripción

Disponible en

start()

Inicia la reproducción, progresando el Player a estado Started desde cualquier estado en que se encontrara

Todos los estados

stop()

Detiene la reproduccion, descendiendo a estado Prefetched

Estado Started

realize()

Hace al Player progresar al estado Realized

Estado Unrealized

prefetch()

Hace al Player progresar al estado Prefetched

Estado Realized

deallocate()

Aborta la actividad del y libera los recursos consumidos por el Player

Todos los estados excepto Started

setRate(float rate)

Establece la velocidad de reproducción del contenido MM

A partir del estado Realized

MÉTODOS FUNDAMENTALES DE UN PLAYER

setMediaTime(Time time)

Indica a partir de donde continuar/iniciar la reproducción

A partir del estado Realized

getVisualComponent()

Devuelve el componente visual de la reproducción

A partir del estado Realized

getControlPanelComponent()

Devuelve el componente de control de la reproducción

A partir del estado Realized

7


16/05/2011

Un player tiene una serie de componentes visuales que se pueden añadir a la aplicación o applet para actuar de interfaz con la reproducción. Los más importantes son el componente visual y el componente de control. Componente visual: muestra la pista de video del contenido multimedia si la hubiera. Se obtiene con el método getVisualComponent() del Player. Componente de control: permite al usuario controlar la reproducción (iniciar, detener, volumen...) Se obtiene llamando al método getControlPanelComponent() del Player.

INTERFAZ GRÁFICA DE USUARIO DE UN PLAYER

Un player tiene una serie de componentes visuales que se pueden añadir a la aplicación o applet para actuar de interfaz con la reproducción. Los más importantes son el componente visual y el componente de control. Ejemplo de creación de una interfaz básica para controlar un Player

... Component componenteControl = player.getControlPanelComponent(); Component componenteVisual = player.getVisualComponent(); //Se añade el componente de visualización y el de control a la UI if (componenteVisual != null){ UI.addComponenteVisual(componenteVisual, this); } if (componenteControl != null) { UI.addComponenteControl(componenteControl, this); } ...

CREACIÓN DEL PLAYER

8


16/05/2011

Un procesador no es más que un tipo especializado de reproductor (player) que permite controlar el procesamiento que se hace sobre la fuente de datos que recibe a su entrada. Un procesador también proporciona a su salida la fuente de datos procesada. Así un Processor recibe a su entrada un flujo de datos multimedia, que representamos como una DataSource de entrada, y produce un nuevo flujo de datos multimedia correspondiente a la entrada procesada y que representamos como una DataSource de salida.

PROCESAMIENTO

Los estados de un Processsor son muy similares a los de un Player (Estados de un Player). Cuando un Processor se encuentra en estado Realized, podemos llamar al método getTrackControls() para obtener sendos objetos TrackControl para cada una de las pistas contenidas en el flujo de datos MM. Estos objetos permiten especificar el procesamiento que se va a efectuar sobre cada una de las pistas.

ESTADOS DE UN PROCESSOR

9


16/05/2011

El método createManager() de la clase Manager devuelve un Processor. El flujo Multimedia de entrada al Processor es un argumento de createProcessor(), puede consistir en una DataSource, un MediaLocator o una URL.

Creación de un Processor. Métodos createProcessor() de la clase Manager Processor createProcessor (DataSource dataSource) Procesor createProcessor (MediaLocator sourceLocator) Processor createProcessor (java.net.URL sourceURL)

CONSTRUCCIÓN DE UN PROCESSOR

El flujo de datos de entrada al procesador puede proceder de: Una URL, que puede localizar: archivos multimedia locales o archivos multimedia alojados en servidores remotos. Una sesión RTP. Una captura de audio y/o video A su vez el flujo de datos procesados puede ser: Almacenado en un archivo Transmitido den tiempo real a través de Internet mediante RTP. Reproducido.

ENTRADAS PARA LOS DATOS PROCESADOS

10


16/05/2011

Los destinos posibles para los datos multimedia de salida de un procesador son: Reproducción: Recordemos que un Processor no es más que un tipo especializado de Player. Por lo tanto podemos obtener el componente visual correspondiente al contenido reproducido así como el componente de control y de esta forma reproducir el contenido multimedia en nuestro equipo como si de un Player se tratase. Almacenamiento en un archivo: Podemos almacenar la salida de un procesador en un archivo, utilizando la clase DataSink

DESTINOS PARA LOS DATOS PROCESADOS

El último paso en el proceso de los datos multimedia puede ser el almacenamiento en algún fichero o la transmisión. Para estos casos JMF proporciona la clase DataSink. Un objeto de esta clase, como en los casos anteriores, se construye a través de la clase Manager usando un DataSource. La función de este objeto es obtener el media stream y almacenarlo en un fichero local, a través de la red o transmitirlo mediante RTP.

CLASE DATASINK

11


16/05/2011

Es necesario crear un URL o MediaLocator del destino, por supuesto también es necesario el DataSource que servirá de fuente. Con estos dos objetos podemos llamar a createDataSink() de Manager obteniendo nuestro objeto destino. Ahora basta con abrirlo mediante open() y , con start(), empezar la operación de almacenamiento. En el caso de que el DataSource sea la salida de un Processor es necesario, para no perder información, llamar antes a la función start() del DataSink que a la función start() del Processor (el cual debe estar en el estado Started para poder sacar datos hacia el DataSource de salida y, por lo tanto, hacia el DataSink). Cuando el flujo de datos termina el DataSink envía un evento EndOfStreamEvent que será necesario atender para destruir el DataSink utilizando su método close(). En el caso de una captura de datos multimedia, al llamar a los métodos stop() y close() del Processor también se lanza el evento. En el supuesto de saber cuando queremos terminar el almacenamiento no es necesario la implementación del Listener.

CREACIÓN DE DATASINK

12


Multimedia en JAVA