Java Media Framework

 

Tutorial

 

Índice
Introducción
Conceptos básicos
Ejemplo 1
Reproducción
Ejemplo 2
Procesamiento
Ejemplo 3
   

Reproducción de contenidos multimedia



En esta pagina

Abordaremos la reproducción de contenidos multimedia de diversos formatos y procedencia haciendo uso de las fuentes de datos que pone a nuestra disposición Java Media Framework.

Creando un reproductor (player)

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.

Grafico 1 - Esquema de funcionamiento de un Player


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.

Tabla 1 - 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)

Listado 1 - 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!)
Codigo fuente completo de ReproduccionJMF.java


El Player creado a través de createPlayer se encuentra en estado Unrealized, en este estado el Player no está capacitado para reproducir su flujo de datos multimedia de entrada. En el apartado siguiente "Estados de un player", se profundizará acerca de los diferentes estados en los que se puede encontrar un Player a lo largo de su vida.

La mayoría de los métodos que pueden ser llamados en un Player requieren que éste esté en el estado Realized. Como se verá, se puede promocionar a este estado llamando al método realize() del Player. Java Media Framework también permite la creación de un Player directamente en estado Realized mediante el método createRealizedPlayer() de la clase Manager. Nótese que este método bloquea hasta que el Player es realizado[PTE: Peligro]

Un Player ha de pasar al estado Realized antes de que se pueda iniciar y controlar la reproducción propiamente dicha del contenido multimedia.

Estados de un Player y métodos disponibles

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.

Grafico 2 - Estados de un player a lo largo de su vida


La siguiente tabla recoge los métodos fundamentales que pueden ser llamados en un Player para intervenir sobre la reproducción, junto a información acerca de el/los estado/s en los que se encuentran disponibles:

Tabla 2 - 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

 

Creando la interfaz 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.

  • El componente visual es el que permite reproducir la componente visual (pista de video) del contenido multimedia, si la hubiere. Es donde el player renderiza la representación visual correspondiente a su reproducción. Para obtenerlo llamamos al método del Player getVisualComponent(), el componente visual devuelto ha de ser añadido a continuación a nuestro interfaz gráfico.
  • El componente de control es el que permite al usuario controlar la reproducción del contenido multimedia. Permite actuar sobre el Player iniciando o deteniendo la reproducción, o bien intervenir sobre el volumen del audio y obtener infomación acrca del estado de la reproducción. Para obtenerlo llamamos al método del Player getControlPanelComponent(), añadiendo a continuación a nuestra interfaz el componente de control devuelto.
Listado 2 - 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);
} ...
Codigo fuente completo de ReproduccionJMF.java

 

Los eventos de la reproducción: como atenderlos

Durante la reproducción se pueden producir diversas circunstancias previstas o imprevistas que requieran de nuestro conocimiento y atención. Se nos informa de ellas a través de los eventos.

Los eventos que se generan en el proceso de reproducción de un contenido multimedia son de tipo asíncrono, lo que significa que pueden producirse en cualquier momento (no respetan un sincronismo). Así pues, han de atenderse cuando se produzcan. Para atender a los eventos de la reproducción debemos:

  1. Implementar el interfaz ControllerListener en toda aquella clase que queramos que sea notificada de los eventos. Cada una de las clases que implementen este interfaz deberán contener el método controllerUpdate()
  2. Registrar cada una de las instancias de las clases anteriores para ser notificada de los eventos de la reproducción. A tal efecto se llamará al método del Player addControllerListener() tantas veces como instancias queramos registrar para ser notificadas de los eventos, indicando en cada llamada cada una de las instancias.
Listado 3 - Ejemplo de registro de diversos listener para ser notificados de eventos
...
player = Manager.createPlayer(url);
player.addControllerListener(listener1); player.addControllerListener(listener2); ...
Codigo fuente completo de ReproduccionJMF.java


De esta forma cada vez que se genera un evento, se llama al método controllerUpdate de cada una de las instancias registradas. La implementacion del método controllerUpdate consiste en una serie de sentencias if-else, que pretenden proporcionar una atención específica a cada tipo de evento.

Listado 4 - Ejemplo de creación de una interfaz básica para controlar un Player
public synchronized void controllerUpdate(ControllerEvent event) {
  if (event instanceof TipoDeEvento){
...
} else if (event instanceof OtroTipoDeEvento){
...
} ...
Codigo fuente completo de ReproduccionJMF.java


Se recogen a continuación los eventos más importantes que pueden producirse en la reproducción:

Grafico 3 - Eventos

 

     

Copyright Universidad de Málaga 2003