jump to navigation

Ejercicio 4 Septiembre 12, 2008

Posted by beceoca in 1.
trackback

César Juárez Megías

ENUNCIADO EJERCICIO 4

 

En este último ejercicio, vamos a trabajar con el JMF.

No es nuestro objetivo andar investigando métodos muy rebuscados de su API, por lo tanto de cara a la realización de este ejercicio vamos a suponer dos cosas:

            -Si al reproducir un fichero de audio le pido al player que me de la componente de vídeo, el player me devolverá null.

- Para averiguar cuanto tiempo dura la reproducción de un fragmento de audio o de vídeo, lo haremos por el camino cutre, para no tenerle que preguntar a la API del JMF: reproduciremos dicho fragmento, sin visualizarlo, y por medios ajenos al JMF mediremos cuánto tiempo ha tardado en reproducirse.

 

Se trata pues, hechas estas aclaraciones, de construir un programa que reciba como argumentos de entrada (por la línea de comandos, es decir el array por defecto args del método main) una lista de archivos de vídeo y de audio indistintamente.

El programa, como resultado de su ejecución, imprimirá por consola el título de cada archivo, si es de audio o de vídeo y su duración.

Después seleccionará el fragmento más corto, ya sea de audio o de vídeo, y lo reproducirá de nuevo, pero esta vez mostrándole la reproducción al usuario.

Esta última reproducción habrá de ser cíclica: cuando el fragmento termine, volverá a empezar desde el principio.

 

CLASES EJERCICIO 4

(para hacer la lectura más fácil he puesto los comentarios en color verde)

 

//Importamos todos los paquetes necesarios

import javax.swing.*;

import javax.media.*;

import java.awt.*;

import java.awt.event.*;

import java.net.URL;

import java.net.MalformedURLException;

import java.io.IOException;

 

public class ProyectoReproductor extends JFrame implements ActionListener, ControllerListener{

 

//Atributos necesarios

Player player=null;

Component visualComponent = null;

Component controlComponent = null;

Component progressBar = null;

String [] args;

Timer t;

URL url;

int [] duracion; //Array para almacenar todas las duraciones de las canciones

int duracionNueva; //Variable que mide la duración del archivo

boolean reproduccionFinal = false; //Nos indicará si tenemos que reproducir el archivo más corto o si solo estamos midiendo la duración de los archivos

int masPequeño = 0; //Variable que nos indicará la posición de la canción más corta

 

 

//Constructor

public ProyectoReproductor(String [] args){

//Ponemos titulo a la ventana

super(“Reproductor”);

this.args = args;

this.getContentPane().setLayout(new BorderLayout());

t = new Timer(1000,this);

//Miramos la duración de todos los archivos

dameDuracionTodos();

//Imprimimos los datos de los archivos

imprimeDatos();

System.out.println(“Ahora se reproducirá el archivo más corto);

reproduccionFinal = true;

//Reproducimos el fichero más corto

reproduceMasCorto();

this.setSize(100, 100);

this.setVisible(true);

} //Fin del método constructor

 

 

// Método imprimeDatos

public void imprimeDatos(){

for (int i = 0; i<args.length(); i++){

System.out.println(“El archivo ”+args[i]+” es de ”+dameTipo(args[i])+” y tiene duración: ”+Integer.toString(duracion[i])+”  segundos.”);

}

} // Fin del método imprimeDatos

 

//Método dameTipo

public String dameTipo (String a, int i){

String tipo;

try{

//Intentamos crear la dirección y el player
 if((url=new URL(a)) == null){
System.out.println(”ERROR, no hay archivo a reproducir”);
}else{

//Si no de error creamos el placer con la dirección del archivo a reproducir
player=Manager.createPlayer(url);

//Miramos a ver si es de tipo audio o video mediante la respuesta al método getVisualComponent

if(player.getVisualComponent == null){

tipo = “audio”

}else{

tipo = “video”

}
}

//Capturamos todas los errores posibles

}

catch(MalformedURLException e){
System.err.println(”La dirección o el nombre del archivo con posición “+Integer.toString(i)+“ en la lista de reproducción no es correcta“);
}catch(IOException e){           
System.err.println(”Error de lectura o escritura”);
 }catch(NoPlayerException e){
System. err.println(”No existe un reproductor para hacer esta operación”);
}

//Devolvemos el tipo de archivo que era en este caso

return tipo;

} //Fin del método dameTipo

 

 

//Método dameDuracionTodos, medimos y almacenamos todos las duraciones de los archivos

public String dameDuracionTodos(){

for int(i=0; i <args.length();i++){

try{

//Intentamos crear la dirección y el player
 if((url=new URL(args[i])) == null){
System.out.println(”ERROR, no hay archivo a reproducir”);
}else{

//Si no de error creamos el placer con la dirección del archivo a reproducir
player=Manager.createPlayer(url);

player.addControllerListener(this);

}

//Capturamos todas los errores posibles

}catch(MalformedURLException e){
System.err.println(”La dirección o el nombre del archivo con posición “+Integer.toString(i)+“ en la lista de reproducción no es correcta“);
}catch(IOException e){           
System.err.println(”Error de lectura o escritura”);
 }catch(NoPlayerException e){
System. err.println(”No existe un reproductor para hacer esta operación”);
}

//Añadimos un manejador a la ventana por si esta se cierra el programa se acabe

this.addWindowListener(new ManejadorVentana());
player.start();
timer.start();

} //Fin del método dameDuracionTodos

 

//Método controllerUpdate

public synchronized void controllerUpdate(ControllerEvent event){

//Comprobamos que el reproductor está “vivo”

if (player == null){

return;

}

//Qué evento se ha producido?

if (event instanceof RealizeCompleteEvent){

//Se añade el componente de visualización del reproductor y el de control si es ya la reproducción final

if (reproduccionFinal == true){

                        if((visualComponent = player.getVisualComponent()) != null)

                        getContentPane().add(“Center”,visualComponent);

                        if ((controlComponent = player.getControlPanelComponent()) != null)

                        getContentPane().add(“South”,controlComponent);

                        validate();

         }

 }

//Si se ha terminado la reproducción del archivo paramos el timer, y almacenamos la duración, y si estamos ya en la reproducción final volvemos a poner en marcha el reproductor

else if (event instanceof EndOfMediaEvent){

player.setMediaTime(new Time(0));

if (reproduccionFinal == false){

t.stop();

duracion [i] = duracionNueva;

duracionNueva = 0;

{else{

//Si es ya la reproducción final volvemos a poner en marcha el reproductor

player.start();

}

}

else if (event instanceof ControllerErrorEvent){

player = null;

System.err.println(((ControllerErrorEvent)event).getMessage());

}

} //Fín del método controllerUpdate

                       

//Método actionPerformed (controlador del timer)

public void actionPerformed(ActionEvent e){
duracionNueva
++;
} //Fin del actionPerformed

 

//Método reproduceMasCorto

public void reproduceMasCorto(){

dimeMasPequeño();

//Ahora reproducimos el archivo más pequeño que haya en la lista de reproducción

try{

         //Se crea URL para el archivo

            if ((url = new URL(args[masPequeño])) == null)

               System.err.println(“No se puede construir URL para el archivo”);

         //Se crea el reproductor

            player=Manager.createPlayer(url);

            player.addControllerListener(this);

}

catch (MalformedURLException e){

System.err.println(“URL no valida”);

}

catch (IOException e){

            System.err.println(“Excepcion de Lectura/Escritura”);

}

catch (NoPlayerException e){

            System.err.println(“No existe reproductor”);

}

player.start();

//Como el escuchador de la ventana ya está añadido anteriormente no lo ponemos de nuevo

//Posteriormente se volverá a visualizar ya que hemos puesto una condición en el método controllerUpdate para saber si debemos o no reproducirlo de nuevo o quedarnos parados

      }//Fin delétodo reproduceMasCorto

 

 

//Método dimeMasPequeño

public void dimeMasPequeño (){

//Recorremos todos los componentes y miramos cuál es el más pequeño comparando el archivo segundo de la lista con el archivo más pequeño por el momento (en un principio el más pequeño por defecto será el cero) y así sucesivamente

for (int i = 1; i<duracion.length(); i++){

if(duracion[masPequeño]>duracion[i]){

masPequeño = i;

}

}

}//Fin del método dimeMasPequeño

 

 

//Método main

public static void main (String [] args){

ProyectoReproductor pr = new ProyectoReproductor(args);

}//Fin del método main

 

 

//Clase interna ManejadorVentana

public class ManejadorVentana extends WindowAdapter {

public void windowClosing (WindowEvent e) {

if (player != null) {

player.stop();

player.deallocate();

}

System.exit(0);

}

} //Fin de la clase interna

 

}  //Fin de la clase

CONCEPTOS USADOS EN EL EJERCICIO 4

 

En este caso los conceptos usados para resolver este ejercicio son los siguientes:

             

            - Conceptos sobre JMF

            - Conceptos de swing (incluidos manejos de eventos)

            - Conceptos de Timer

            - Conceptos de algoritmia básica

 

 

 

Comentarios»

No comments yet — be the first.