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.