Você está na página 1de 10

UNIVERSIDAD CARLOS III DE MADRID ESCUELA POLITCNICA SUPERIOR

Ingeniera Tec. Telec.: Sonido e Imagen

Servidores de Informacin Multimedia

Prctica 5: Introduccin a la JMF (Java Media Framework)

Fernando Alonso Martn NIA: 100033362 Ana Beln Alonso Martn NIA: 100048581 Mayo 2005

PRCTICA 5: INTRODUCCIN A LA JMF 1. INTRODUCCIN En esta prctica trataremos de utilizar el API de Java relativo a la manipulacin y Java Media Framework) mediante la creacin de un procesamiento de medios (JMF reproductor multimedia capaz de reproducir audio y/o video. Nuestro reproductor ha de ser capaz de parar y reiniciar la reproduccin, as como de pausarla, adelantarla de 5 en 5 segundos y retrasarla en igual medida. Adems ha de tener la opcin de reproduccin lenta, normal y rpida, as como la opcin de silenciar el audio o repetir la ejecucin del archivo a su finalizacin si as lo desea el usuario. De esta forma nuestro reproductor multimedia tendr 5 clases: MD.java: ser la clase que contenga el mtodo main del programa. MDInterfaz.java: ser la encargada de construir la interfaz del programa y controlar todos los eventos que sobre ella se produzcan (tales como la pulsacin de botones o seleccin de opciones en el men).
MDReproductor.java: se encargar de controlar la ejecucin del archivo multimedia as como de diferenciar si ste se trata de un archivo de audio o video (y si es video crear un objeto que lance la ejecucin del visor del video). Adems implementar el escuchador de la clase Player y por lo tanto se encargar de tratar los eventos que ste produzca.

cumplir con funciones de interfaz relativas a mostrar la duracin del archivo que se est reproduciendo as como de mostrar el instante por el va la ejecucin del archivo. ser la encargada de mostrar en una ventana aparte (un nuevo Frame) el visor del video cuando el archivo que estemos reproduciendo sea un video. El aspecto del reproductor que nos piden realizar ha de tener ms o menos este aspecto:
ReproductorVideo:

MDReloj:

Concretamente, en esta prctica se nos pide implementar las funciones que vienen indicadas en los botones as como las que aparecen en los mens Archivo, Reproducir y Opciones. Adems se nos da cierta libertad para realizar ciertos cambios o ampliacin de funcionalidades. Respecto a este ltimo punto nosotros nos hemos tomado ciertas libertades como aadir imgenes a los botones y a ciertas opciones del men a fin de mejorar la interfaz de nuestro reproductor. Tambin hemos decidido (a sugerencia del profesor en el cdigo facilitado como base para la prctica) lanzar el visor del video en un frame nuevo.

2. ASPECTO DE NUESTRO REPRODUCTOR MULTIMEDIA En la reproduccin de un archivo de audio tan solo se visualizar la ventana de arriba, mientras que en la reproduccin de un archivo de video se visualizar la ventana de arriba y la de abajo conjuntamente. Reproduccin de un archivo de audio

Reproduccin de un archivo de video

3. FUNCIONAMIENTO DEL PROGRAMA: Puesto que se nos facilitaba un cdigo base sobre el cual realizar modificaciones e implementar los mtodos relativos a la reproduccin de archivos multimedia, tan solo comentaremos las modificaciones que hemos aadido respecto al cdigo que se nos facilit. 3.1. Clase MDPlayer Mtodo para crear el Player inicializar (URL url) Este mtodo ser el encargado de crear el Player para poder reproducir y controlar la ejecucin de un archivo multimedia. Tambin crear el MediaPlayer para poder controlar el volumen.
/** * Mtodo que se ejecuta al abrir un archivo y sirve para crear e * inicializar el player que lo reproducir, asi como de crear los * objetos necesarios para controlarlo (control de volumen => * MediaPlayer volumenPlayer) y visualizar la reproduccin en el caso * de los videos (ReproductorVideo reproductor) * @param URL url => url del archivo que vamos a reproducir */ public void inicializar(URL url) { this.url = url; //Paramos el audio si esta ejecutndose algun archivo if (mdPlayer != null) { mdPlayer.stop(); mdPlayer.setMediaTime(new Time(0)); } //Si est abierto el visor del video lo ocultamos antes de abrir //otro archivo if (reproductor != null) { reproductor.setVisible(false); reproductor = null; } //Crear una instancia del player para la URL dada //Tratamos todas las posibles excepciones al crear el Player try { //Creamos el reproductor mdPlayer = Manager.createPlayer(url); //Aadimos al player su escuchador de eventos mdPlayer.addControllerListener((ControllerListener)this); //Imprimimos mensaje en consola si no se ha creado el Player //de forma adecuada (mdPlayer==null) if (mdPlayer == null) { System.out.println( "El player no se ha creado de forma adecuada"); } //Esperamos a que el plyaer est en el estado mdPlayer.realize();
Controller.Started

//capturamos todas las excepciones que hayan podido producirse } catch (MalformedURLException me) { System.out.println("No puedo acceder al fichero multimedia"); } catch (IOException ie) { System.out.println("No puedo crear el reproductor"); } catch (NoPlayerException np) { System.out.println( "Excepcin NoPlayerException me impide crear el reproductor"); } /** * Creamos el objeto de la clase MediaPlayer que nos servir para * controlar el volumen de la reproduccin. */ volumenPlayer = new MediaPlayer(); volumenPlayer.setPlayer(mdPlayer); }

Mtodos para controlar la reproduccin: iniciar ( ): se invoca al pulsar el botn Play o la opcin homnima del men Reproducir. Se encarga de reiniciar la ejecucin del archivo en el instante en que el que fue detenido a una velocidad de reproduccin normal.
/** * Se invoca cuando se pulsa el boton "Play". * Se trata de reiniciar la ejecucion del archivo multimedia. * Arranca el player. */ public void iniciar() { mdPlayer.stop(); //Para la reproduccin mdPlayer.start(); //Reinicia la reproduccin mdPlayer.setRate(1.0f); //Reinicia la velocidad de reproduccin a //1 (Rep.normal) }

parar ( ): se invoca al pulsar el botn Stop o la opcin homnima del men Reproducir. Se encarga de detener la ejecucin del archivo en el instante en el que fue invocado, vuelve al comienzo del archivo y reinicia la velocidad de reproduccin a 1 (velocidad normal).
/** * Se invoca cuando se pulsa el boton "Stop". * Simplemente para la ejecucin, solo se podra arrancar o abrir un * nuevo archivo. */ public void parar() { //Para la reproduccin mdPlayer.stop(); //Reinicia la velocidad de reproduccin a 1 (Rep.normal) mdPlayer.setRate(1.0f); //Vuelve al comienzo del archivo a reproducir mdPlayer.setMediaTime(new Time(0)); }

esperar ( ): se invoca al pulsar el botn Pause o la opcin homnima del men Reproducir. Se encarga de parar la ejecucin en el instante en que fue invocado este mtodo.
/** * Se invoca cuando se pulsa el boton "Pause". * Para la ejecucin en el instante en que es pulsado (el pause de * toda la vida). */ public void esperar() { mdPlayer.stop(); //Para la reproduccin }

avanzar ( ): se invoca al pulsar el botn Palante o la opcin homnima del men Reproducir. Se encarga de avanzar la ejecucin del archivo en 5 segundos.
/** * Se invoca cuando se pulsa el boton "Palante". * Avanza la ejecucin del archivo en 5s. */ public void avanzar() { //Para la reproduccin mdPlayer.stop(); //Obtenemos el instante de reproduccin
double instanteActual = (double) mdPlayer.getMediaTime().getSeconds();

//Avanzamos la reproduccin en 5 segundos respecto al instante //actual de reproducin mdPlayer.setMediaTime(new Time(instanteActual + 5)); //Reinicia la reproduccin mdPlayer.start(); }

retroceder ( ): se invoca al pulsar el botn Patras o la opcin homnima del men Reproducir. Se encarga de retrasar la ejecucin del archivo en 5 segundos.
/** * Se invoca cuando se pulsa el boton "Patras". * Retrasa la ejecucin del archivo en 5s. */ public void retroceder() { //Para la reproduccin mdPlayer.stop(); //Obtenemos el instante de reproduccin
double instanteActual = (double) mdPlayer.getMediaTime().getSeconds();

//Retrasamos la reproduccin en 5 segundos respecto al instante //actual de reproducin mdPlayer.setMediaTime(new Time(instanteActual - 5)); //Reinicia la reproduccin mdPlayer.start(); }

setTiemp (int segundos): se invoca al mover manualmente el scroll de Tiempo. Su misin es situar la ejecucin en el instante en el que el usuario ha determinado manualmente en la barra de tiempo (esta barra devuelve un porcentaje respecto del total del archivo segn donde se pinche).

/** * Se invoca cuando se mueve el scroll de Avance. * Situa el la ejecucion en un segundo determindado. * @param int segundos => numero que indica el instante en el que * quieres reproducir el archivo */ public void setTiempo(int segundos) { //Para la reproduccin mdPlayer.stop(); //Continua la reproduccin en el instante de tiempo que se le pasa //por parmetros al mtodo mdPlayer.setMediaTime(new Time((double) segundos)); //Reinicia la reproduccin mdPlayer.start(); }

setRepetir (boolean modo): se invoca al pulsar la opcin Repetir del men Opciones. Al pulsar esta opcin estaremos modificando un testigo (boolean) que nos servir para saber si a la conclusin de la ejecucin de un archivo queremos o no que se vuelva a reproducir.
/** * Se invoca cuando se pulsa el submen "Repetir" del men "Opciones". * Modifica el testigo para saber si hay que repetir o no. * @param boolean modo => indica si hay que repetir el archivo * (modo=true => hay que repetir) ; (modo=false => no hay que repetir) */ public void setRepetir(boolean modo) { repetir = modo; }

setCallar (boolean valor): se invoca al pulsar la opcin Callar del men Opciones. Al pulsar esta opcin estaremos modificando un testigo (boolean) que nos servir para saber si queremos que se escuche el audio del archivo que estemos reproduciendo o no.
/** * Se invoca cuando se pulsa el submen "Callar" del men "Opciones". * Apaga el sonido hasta que se vuelva a pulsar. * @param boolean valor => indica si queremos escuchar el audio o no * (valor=true => silencio) ; (valor=false => audio) */ public void setCallar(boolean valor) { if (valor) { volumenPlayer.setVolumeLevel("0"); //Volumen 0 = Silencio } else { volumenPlayer.setVolumeLevel("4");//Volumen de 1 a 5=Audio con //- o + volumen } }

setRate (flota valor): se invoca al pulsar una opcin del submen Velocidad del men Opciones. Al pulsar una de estas opciones estaremos asignando un valor de 0.5, 1 o 2 a una variable Double que nos servir para indicarnos la velocidad de reproduccin a la que el usuario quiere ejecutar el archivo.

/** * Se invoca cuando se pulsa una de las opciones del submen * "Velocidad" del men "Opciones". * Modifica la velocidad de ejecucin del archivo multimedia, los * valores a entrar son 0.5, 1 y 2. * @param float valor => toma valores 0.5, 1 o 2 e indica la velocidad * de reproduccin. valor=0.5 => rep.lenta);(valor=1 => rep.normal); * (valor=2 => rep.rapida); */ public void setRate(float valor) { //Para la reproduccin mdPlayer.stop(); //Establece como velocidad de reproduccin la que se le pasa por //parmetros al mtodo mdPlayer.setRate(valor); //Reinicia la reproduccin mdPlayer.start(); }

setVolumen (int porcentaje): se invoca al pulsar manualmente el scrall de Volumen. Su misin es establecer el volumen en el nivel al que el usuario ha seleccionado en la barra de Volumen. Este nivel solo podr variar de 0 a 5 (0=silencio, 5=max volumen) puesto que, aunque la barra de tiempo da porcentajes de volumen, con un objeto MediaPlayer solo podemos modificar el volumen con valores 0, 1, 2, 3, 4 o 5.
/** * Se invoca cuando se pulsa el control del volumen. * Modifica el volumen de la aplicacin. * @param int porcentaje => numero de 0 a 100 que indica el volumen al * que se est reproduciendo el archivo (0=silencio, 100=max volumen) */ public void setVolumen(int porcentaje) { //Hacemos que los valores del volumen sean un valor entero entre 0 // y 5 siendo 0 el silencio y 5 el maximo volumen String nivelDeVolumen = Integer.toString((int) (porcentaje / 20)); //Ponemos como volumen del player 'nivel de volumen' volumenPlayer.setVolumeLevel(nivelDeVolumen); }

Escuchador Player: Ser el encargado de controlar los eventos que se puedan producir en la creacin y ejecucin del archivo multimedia tales como creacin del placer, fin de la reproduccin de un archivo, errores, etc.
/** * Mtodo para controlar los eventos del Player=>Escuchador dl Player. */ public void controllerUpdate(ControllerEvent ce) { if (ce instanceof RealizeCompleteEvent) { mdPlayer.prefetch(); } else if (ce instanceof PrefetchCompleteEvent) { reloj.setPlayer(mdPlayer); /** * Obtenemos el visor y la botonera del player, y si es un * video, lanzamos un frame nuevo con el visor del player */

// Inicializamos visor a null por si se haba creado un visor // con anterioridad visor = null; // Inicializamos botonera a null por si se haba creado un // visor con anterioridad botonera = null; //Obtenermos el visor del player (si es un video visor!= null) visor = mdPlayer.getVisualComponent(); //Obtenemos la botonera del player botonera = mdPlayer.getControlPanelComponent(); //Si es un video creamos un objeto de la clase //ReproductorVideo que lanzar un frame con el visor del //player que se encargar de reproducir el video. if (visor != null && botonera != null) { reproductor = new ReproductorVideo("VISOR VDEO: Ana Beln Alonso Martn & Fernando Alonso Martn", visor, botonera); //Hacemos que se vea el visor del video reproductor.setVisible(true); } } else if (ce instanceof EndOfMediaEvent) { /**Cuando finaliza la ejecucin de un archivo se genera un * objeto EndOfMediaEvent escuchador.En ese momento(fin de * reproduccin de un archivo), en el caso de que no queramos * repetir la cancin(repetir=false), liberaremos recursos. *En el caso de que queramos repetir la cancin (repetir=true) * la reinicializaremos y la volveremos a reproducir cuando se * termine la reproduccin del archivo */ if (repetir == true) { //parar la reproduccin mdPlayer.stop(); //ir al principio del archivo a reproducir mdPlayer.setMediaTime(new Time(0)); //iniciar la reproduccin mdPlayer.start(); mdPlayer.setRate(1.0f); } if (repetir == false) { mdPlayer.addControllerListener( new ControllerAdapter () { public void endOfMedia(EndOfMediaEvent e) { Controller controller =(Controller) e.getSource(); if (repetir ==false){ //detenemos el reproductor controller.stop(); // iniciamos el tiempo controller.setMediaTime(new Time(0)); // liberamos los recursos controller.deallocate(); } } }); } } else if (ce instanceof ControllerErrorEvent) { //Comprobamos si se ha producido un error al generar el evento System.out.println("ERROR"); } }

3.2. Clase ReproductorVideo Esta clase tiene la finalidad de visualizar en un nuevo frame el visor del video cuando el archivo que queramos ejecutar sea un video.
/** * Clase ReproductorVideo. * Autores: Ana Beln Alonso Martn y Fernando Alonso Martn * Definicin: clase que se encargar de visualizar en un nuevo frame * el visor del Player mdPlayer cuando estemos reproduciendo un video. * Nota: si seleccionamos un video este es conveniente que tenga la * extensin mpeg, de todas formas adjuntamos los archivos de audio y * video que se dan como ejemplo para poder probar la prctica. */ public class ReproductorVideo extends JFrame { //Constantes static final int ANCHURA = 570; static final int ALTURA = 410; //Atributos grficos: //Container private Container contenedor; //Constructor public ReproductorVideo(String nombreReproductor, Component visor, Component botonera) { super(nombreReproductor); if (visor != null) { //Obtenemos el panel contenedor del JFrame contenedor = getContentPane(); contenedor.setLayout(new BorderLayout()); //Hacemos visibles el visor y la botonera del player visor.setVisible(true); botonera.setVisible(true); //Aadimos los Component al Container del Frame contenedor.add("Center", visor); contenedor.add("South", botonera); // Forzamos que se visualicen los componentes validate(); //Da un tamao a la ventana y la situa en el monitor setSize(ANCHURA, ALTURA); setLocation(200,250); } } }

10

Você também pode gostar