Introducción a JMF Jose Jesus García Rueda (Extractado y adaptado de http://www.lcc.uma.es/~pinilla/tutorialjmf/index.htm) Qué es JMF? JMF ( Java Media Framework ) proporciona herramientas para la captura, procesamiento y almacenamiento de datos multimedia. Permite su transmisión y recepción a través de Internet. Más concretamente permite: 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. 1
Arquitectura de JMF JMF funciona como una cadena de música con su reproductor de CDs Clases e interfaces de JMF Cualquier aplicación JMF puede ceñirse al siguiente esquema: 2
DataSource En Java Media Framework los datos multimedia pueden proceder de diversas fuentes: Archivos locales o remotos. Vídeo 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 de javax.media.protocol Encapsula información sobre su ubicación, el protocolo para su transferencia al reproductor y el software para tratarlos. Soporta todo tipo de contenido multimedia. Player Interface de javax.media Actúa como reproductor de datos multimedia. Asegura que lleguen adecuadamente al dispositivo de salida. No hace falta un Player específico para cada tipo de datos. 3
Creación de un Player Se emplea el método createplayer() de la clase Manager. El flujo multimedia de entrada al Player constituye un parámetro del método createplayer() Player createplayer (DataSource datasource) Player createplayer (MediaLocator sourcelocator) Player createplayer (java.net.url sourceurl) Ejemplo: public void abrircontenidomm(string cadenacontenidomm) { //Se crea URL para la cadena URL url = new URL(cadenaContenidoMM); //Se crea el reproductor player = Manager.createPlayer(url); (Se omiten captura de excepciones!) Estados de un Player "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": Conoce el tipo de fuente de datos de entrada que habrá de reproducir, y los recursos que va a necesitar. "Prefetched": Preparado para reproducir los datos multimedia de su fuente de entrada. "Started": Comienza la reproducción. Normalmente bastará con invocar al método start() sobre el Player para que pase automáticamente por todos estos estados. 4
Métodos de un Player start() Inicia la reproducción. stop() Detiene la reproduccion, descendiendo a estado Prefetched. realize() Hace al Player progresar al estado Realized prefetch() Hace al Player progresar al estado Prefetched deallocate() Aborta la actividad del Player y libera los recursos consumidos por éste. setrate(float rate) Establece la velocidad de reproducción del contenido MM setmediatime(time time) Indica a partir de donde continuar/iniciar la reproducción. getvisualcomponent() Devuelve el componente visual de la reproducción. getcontrolpanelcomponent() Devuelve el componente de control de la reproducción. La interfaz visual del Player (I) Un player tiene un componente visual y un componente de control. Componente visual: permite reproducir la pista de vídeo del contenido multimedia, si la hubiere. Para obtenerlo llamamos al método getvisualcomponent(). El componente visual devuelto ha de añadirse a la interfaz gráfica. Componente de control: permite al usuario controlar la reproducción del contenido multimedia. Iniciar o detener la reproducción. Modificar el volumen del audio. Obtener infomación sobre el estado de la reproducción. Para obtenerlo llamamos al método getcontrolpanelcomponent(), añadiendo a continuación a nuestra interfaz el componente de control devuelto. 5
La interfaz visual del Player (II) Ejemplo: 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); } Los eventos de reproducción (I) El escuchador será un ControllerListener. Este escuchador deberá contener el método controllerupdate() Ejemplo: player = Manager.createPlayer(url); player.addcontrollerlistener(listener1); player.addcontrollerlistener(listener2); 6
Los eventos de reproducción (II) Ejemplo: public synchronized void controllerupdate(controllerevent event) { if (event instanceof TipoDeEvento){ } else if (event instanceof OtroTipoDeEvento){ } Algunos eventos tipo ControllerEvent: RealizeCompleteEvent. StartEvent. StopEvent. EndOfMediaEvent. DeallocateEvent. Ejemplo: Un primer programa con JMF Mi_Reproductor.java 7
Processor Es un tipo de Player, subinterfaz de javax.media.player Aporta dos características suplementarias: Puede volcar los datos procesados en un DataSource, en lugar de en un dispositivo de salida. Puede cambiar de formato lo datos. Creació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() Processor createprocessor (DataSource datasource) Procesor createprocessor (MediaLocator sourcelocator) Processor createprocessor (java.net.url sourceurl) 8
Processor (II) Un Processor tiene dos estados más que un Player: DataSink Es una interfaz de javax.media Envía los datos a un destino distinto de los dispositivos de salida, como un fichero o un flujo de salida RTP. 9
Format Es una clase de javax.media Modela el formato de los datos multimedia. Tiene dos subclases: AudioFormat: Encapsula información sobre el formato de datos de audio: Frecuencia de muestreo. Número de bits por muestra. Número de canales. VideoFormat: Encapsula información sobre el formato de datos de vídeo. Manager Es una clase Final de javax.media Contiene métodos estáticos para crear instancias de todas las interfaces y clases anteriores. 10