Bueno, vamos a por la publicación del cuarto y ultimo ejercicio que trata de JMF, la verdad es que no tenia ni idea (y todavía ahora hay alguna) pero con este ejercicio me han quedado algo más claros los conceptos…..o al menos eso espero…jajaja…
Ejercicio 4
En esta ocasión se trata de realizar un reproductor de contenidos multimedia usando para ello los conocimiento básicos que de JMF hemos ida adquiriendo.
Para la realización del ejercicio deberemos de suponer dos cosas:
1º) Si al reproducir un fichero de audio le pido al placer que me dé la componente de video me devolverá un null.
2º) Para averiguar cuanto tiempo dura la reproducción de un fragmento de audio o de video lo haremos por el camino cutre para no tener que preguntar a la API de JMF; reproduciremos dicho fragmento, sin visualizarlo, y por medios ajenos al JMF mediremos cuanto tiempo ha tardado en reproducirse.(en mi caso lo he hecho llamando al getDuration de la clase duration porque no he conseguido saber como hacer para reproducir un fragmento sin que éste se vea, quizás porque tampoco he llegado a entender muy bien en que momento real se empieza a reproducir un archivo en las líneas de código que he podido ver de JMF).
Este reproductor, además, recibirá una lista de archivos por línea de comandos como argumentos de entrada y deberá imprimir por consola el nombre de cada archivo, si es de video o de audio y la duración.
Los archivos se pasarán de la siguiente manera a la hora de compilar:
Y a continuación la lista de archivos:
Después de esto deberá reproducir de forma cíclica (cuando pare deberá volver a empezar) el de menor duración, ya sea de audio o de video.
Para la realización de este ejercicio puede ayudarse de los siguientes métodos del API de JMF.
java.net
Class URL
java.lang.Objectjava.net.URL
All Implemented Interfaces:
getFile
public String getFile()
Gets the file name of this URL. The returned file portion will be the same as getPath(), plus the concatenation of the value of getQuery(), if any. If there is no query portion, this method and getPath() will return identical results.
Returns:
the file name of this URL, or an empty string if one does not exist
javax.media
Class Time
java.lang.Object | +--javax.media.Time
getSeconds
public double getSeconds()
Gets the time value in seconds.
Returns:
time value in seconds.
javax.xml.datatype
Class Duration
java.lang.Objectjavax.xml.datatype.Duration
javax.media
Interface Duration
All Known Subinterfaces:
Controller, Demultiplexer, Player, Processor, Track
All Known Implementing Classes:
getDuration
public Time getDuration()
Get the duration of the media represented by this object. The value returned is the media’s duration when played at the default rate. If the duration can’t be determined (for example, the media object is presenting live video) getDuration returns DURATION_UNKNOWN.
Returns:
A Time object representing the duration or DURATION_UNKNOWN.
Conocimientos empleados:
Basicamente en este ejercicio se trabaja casi en exclusiva con el API de JMF, asique es eso principalmente lo que hemos aprendido con este ejercicio, aunque he de decir, que al menos por mi parte no me ha quedado claro del todo, asique espero que con un par de cuestiones quede la cosa resuelta. ¿Alguien sabe por ejemplo como hacer que lea los archivos pero que no los reproduzca? Ahi queda eso por si alguien se anima a responder.
Bueno, a continuación os escribo mi solución de este ejercicio que consta unicamente de una clase:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.lang.String;
import java.net.URL;
import java.net.MalformedURLException;
import java.io.IOException;
import javax.media.*;
public class Reproductor extends JFrame implements ControllerListener{
String archivo;
long tiempo;//se intentara hacer con TimeMilliSecond
double duracion;
double duracionMin==10.000;//lo inicializo a un valor grande
Player player=null;
String tipoArchivo;
Component visualComponent=null;
Component controlComponent=null;
Component progressBar=null;
public Mi_Reproductor(String [] args) {
this.getContentPane().setLayout(new BorderLayout());
URL url = null;
try{
//Vamos leyendo uno a uno los elementos del array con los nombres de los //archivos y creando las url´s
for(int i =0 ; i<args.length; i++){
if ((url = new URL(args[i])) == null)
System.err.println(“No se puede construir URL para el archivo”);
archivo=url.getFile();
duracion=url.getDuration().getSeconds(); //getDuration() devuelve un objeto de la //clase Time
if(player().getVisualComponent()==null){
tipoArchivo=”audio”;
}else tipoArchivo=”video”;
System.out.println(“El nombre del archivo de”+tipoArchivo+”es:”+archivo+”, y su duración es: “+duracion+” segundos”);
if(duracion<duracionMin)
duracionMin=duracion;
}
//Aqui se busca cual es el archivo más corto para reproducirlo
for(int i=0; i<args.length; i++){
url=new URL(args[i]);
duracion=url.getDuration().getSeconds();
if(duracion==duracionMin){
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();
this.addWindowListener(new ManejadorVentana());
}
//Manejador de los eventos
public synchronized void controllerUpdate(ControllerEvent event){
if (player == null) return; //Miramos si el player está “vivo”
if (event instanceof RealizeCompleteEvent){ //Si el reproductor ha entrado correctamente en estado realizado
if((visualComponent = player.getVisualComponent()) != null){
this.getContentPane().add(“Center”,visualComponent);
}else this.getContentPane.remove(visualComponent); //quita la componente visual //cuando devuelve null(audio)
if ((controlComponent = player.getControlPanelComponent()) != null)
this.getContentPane().add(“South”,controlComponent);
validate();
}else if (event instanceof EndOfMediaEvent){ //Si se ha alcanzado el final de contenidoMM que está reproduciendo
player.setMediaTime(new Time(0)); //”Rebobinamos” el contenidoMM
player.start(); //Volvemos a reproducir
}else if (event instanceof ControllerErrorEvent){ //Si se produce un error //indeterminado en la reproducción.
player = null;
System.err.println(((ControllerErrorEvent)event).getMessage());
}
}
public class ManejadorVentana extends windowAdapter{
public void windowClosing(WindowEvent e){
if(player!=null){
player.stop();
player.deallocated();
}
System.exit(0);
}
}
}
Pues hasta aqui los ejercicios veraniegos. Esperemos que nos sirvan para mucho y que tengamos todos la suficiente suerte como para que no nos echen de la carrera, hay que joderse, tanto sufrimiento ¿para qué?…..algún día lo sabremos….SUERTE!!!!




