Upload
manuelle-murillo
View
296
Download
1
Tags:
Embed Size (px)
DESCRIPTION
Una breve explicación sobre la JMF que ofrece Oracle.
Citation preview
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
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
16/05/2011
3
MODELO DE PROCESAMIENTO
DE LA JMF
ARQUITECTURA DE LA JMF
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.
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.
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.
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
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
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.
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.
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.
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.