Home UC3M
Home IT

Práctica 3

Introducción a Java Media Framework (JMF)

Objetivos

En esta práctica empezaremos a trabajar con el API de Java Media Framework, una librería multimedia sencilla adaptada a Java. El trabajo consistirá en la implementación de un reproductor multimedia muy sencillo.

Toma de contacto

Configuración del entorno

Para trabajar con JMF, es necesario configurar tanto el entorno de desarrollo como el entorno de ejecución. Esto es así porque JMF no forma parte de la instalación estándard de Java.

Hay diferencias entre Linux y Windows, vamos a ver cada una.

Windows

Para la instalación en Windows, usaremos este jar:

Copiad el .jar a vuestro directorio para la práctica para tenerlo disponible.

JGRASP tiene una opción para configurar el CLASSPATH del proyecto. Debereis configurar esa opción y añadir el jmf.jar para que el entorno encuentre la librería a la hora de compilar y ejecutar.

Linux

Para que JMF funcione correctamente en Linux, es necesario instalar lo que Sun llama "Linux Performance Pack". Esto es una librería java (un .jar) y una serie de librerías nativas que implementan los codecs.

El siguiente archivo comprimido contiene todo lo necesario para compilar y ejecutar aplicaciones JMF en Linux:

  • jmf-lib.tgz
  • Lo vamos a instalar en vuestro directorio de usuarios para que lo podais usar en prácticas sucesivas.

    En una consola (terminal), escribid el comando "cd". Esto os lleva directamente a vuestro directorio de usuarios. Copiad en ese directorio el fichero jmf-lib.tgz. Podeis hacerlo sencillamente con right-click en el enlace y salvando desde el navegador en el directorio "Home".

    Una vez ahí, si haceis "ls" en la línea de comandos, vereis el fichero tgz. Para descomprimirlo, "tar -xvzf jmf-lib.tgz".

    Esto os creará un directorio llamado jmf-lib en vuestro directorio home. En ese directorio vereis que hay varias librerías .jar (librerías de Java) y varias librerías dinámicas de Linux (.so).

    Hay configurar Eclipse para que sepa dónde están las librerías Java. Esto se hace en Project->Properties->Java Build Path, bajo el tag "Libraries".

    Por último, hay que decirle dónde están las librerías nativas. Esto se hace en Run->Run... , y bajo el tag "Environment" añadimos una variable de entorno: LD_LIBRARY_PATH, que debe apuntar a jmf-lib.

    En mi máquina valdría esto: /usr/lab/asig/labsimitis/practicas/p3/jmf-lib

    Ejemplo

    Antes de empezar a trabajar en una implementación propia, podéis revisar el siguiente ejemplo para ver un reproductor funcionando:

    Este pequeño reproductor permite abrir archivos de audio o vídeo y reproducirlos. Si compiláis y ejecutáis el ejemplo siguiendo las indicaciones del apartado anterior, podréis verificar que JMF está configurado correctamente.

    Nuestro propio reproductor

    A partir de esta práctica, vamos a ir construyendo un reproductor multimedia. En esta sesión empezaremos por las funciones más básicas:

    • abrir un archivo
    • arrancar/parar la reproducción
    • avanzar/retroceder a lo largo del stream
    • controlar el volumen
    • modo repetición
    • velocidad de ejecución

    Al igual que en prácticas anteriores, el punto de partida es un esqueleto que ireis completando con funciones nuevas. Estas son las clases que componen el esqueleto del reproductor:

    • PlayerMain.java: Esta es la clase que arranca el reproductor. Crea la GUI y le asigna un reproductor de los nuestros (PlayerFacade).
    • PlayerGui.java: Implementa la interfaz gráfica (GUI viene de Graphical User Interface). Gestiona los eventos generados por el usuario sobre la interfaz, y llama a los métodos adecuados de la clase PlayerFacade.java, que es quien realmente controla la reproducción.
    • PlayerFacade.java: Esta clase proporciona una interfaz simplificada que permite manejar un player de Java Media Framework. Al concepto de construir un objeto que simplifique la interfaz de otro u otros se conoce como "Facade Pattern".
    • TimeObserver.java: Es una interfaz que le permite a la GUI registrarse a eventos temporales generados por PlayerFacade. Se utiliza para refrescar los relojes de tiempo total y tiempo transcurrido en la interfaz gráfica sin crear una dependencia entre ambos objetos. Este es un concepto se conoce como patrón Observer en programación orientada a objetos, y lo vereis en muchas APIs en forma de objetos Observer o Listener. En JMF podéis ver unas cuantas interfaces de este tipo, por ejemplo ControlerListener que tendréis que usar en esta práctica.

    Vuestra misión en esta práctica es completar la implementación de PlayerFacade para que el media player funcione. Para ello, tenéis a vuestra disposición toda la potencia de JMF.

    Nota: No debería ser necesario tocar código fuera de la clase PlayerFacade.

    Referencias