Multimedia en JAVA

12
16/05/2011 1 INTRODUCCIÓN A LA JMF 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

description

Una breve explicación sobre la JMF que ofrece Oracle.

Transcript of Multimedia en JAVA

Page 1: Multimedia en JAVA

16/05/2011

1

INTRODUCCIÓN A LA

JMF

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

Page 2: Multimedia en JAVA

16/05/2011

2

ALGUNAS API’S

(APLICATION PROGRAMMING INTERFACE) DE LA JMF

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.

PAQUETES

DEFINIDOS POR 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

Page 3: Multimedia en JAVA

16/05/2011

3

MODELO DE PROCESAMIENTO

DE LA JMF

ARQUITECTURA DE LA JMF

Page 4: Multimedia en JAVA

16/05/2011

4

FORMATOS SOPORTADOS

POR LA JMF

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).

CLASE MANAGER

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.

Page 5: Multimedia en JAVA

16/05/2011

5

CLASE

DATASOURCE

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.

INTERFAZ PLAYER

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.

Page 6: Multimedia en JAVA

16/05/2011

6

PLAYER (CONT.)

Ejemplo de creación de un Player

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)

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

Player createPlayer (DataSource dataSource)

Player createPlayer (MediaLocator sourceLocator)

Player createPlayer (java.net.URL sourceURL)

ESTADOS DE UN PLAYER

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.

Page 7: Multimedia en JAVA

16/05/2011

7

MÉTODOS FUNDAMENTALES

DE UN PLAYER

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

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

Page 8: Multimedia en JAVA

16/05/2011

8

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.

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.

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

Page 9: Multimedia en JAVA

16/05/2011

9

PROCESAMIENTO

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.

ESTADOS DE UN PROCESSOR

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.

Page 10: Multimedia en JAVA

16/05/2011

10

CONSTRUCCIÓN DE UN

PROCESSOR

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)

ENTRADAS PARA LOS DATOS

PROCESADOS

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.

Page 11: Multimedia en JAVA

16/05/2011

11

DESTINOS PARA LOS DATOS

PROCESADOS

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

CLASE DATASINK

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.

Page 12: Multimedia en JAVA

16/05/2011

12

CREACIÓN DE DATASINK

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.