El proyecto.
Necesitas:
- Java, obvio no :D
- un IDE, yo utilizo Netbeans 6.0
- el API de Java Media Framework
- 15 minutos de tu tiempo
Creando la Interfaz
El reproductor
2. Crea una nueva clase y llamala mp3.java, esta clase es la encargada de trabajar con los archivos MP3. El codigo necesario esta aqui:
import java.io.IOException;
import java.net.URL;
import javax.media.CannotRealizeException;
import javax.media.Manager;
import javax.media.NoPlayerException;
import javax.media.Player;
import java.util.Timer;
import javax.swing.*;
import java.awt.*;
import java.util.TimerTask;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.filechooser.FileNameExtensionFilter;
/**
* @web http://jc-mouse.blogspot.com/
* @author Mouse
*/
public class mp3{
//el player
private Player mediaPlayer;
//animacion
private Timer tiempo ;
private TimerTask task;
private int speed = 1000;//velocidad
private int frame=0;
//control
boolean run = false;
boolean todo_ok = false;
//archivo
URL mediaURL=null;
String file="";
//otros
String t=null;
//filtro
private static FileNameExtensionFilter filter = new FileNameExtensionFilter("Archivo MP3","mp3","mp3");
//el constructor vacio
public mp3() {}
/* controles de reproduccion */
public String STOP(){
//comprueba que el reproductor tenga un archivo
if (todo_ok){
mediaPlayer.stop();
this.todo_ok=false;
this.run=false;
this.file="";
this.stopAnimation();
}
return "Reproductor mp3 - by Mouse";
}
/* Reproduce un archivo mp3, si no encuentra ninguno devuelve
un string vacio */
public String PLAY(JSlider b){
t ="No existe ningun archivo...";
if (todo_ok){
if(!run){//si ya se esta reproduciendo
mediaPlayer.start();
this.run=true;
t="Reproduciendo";
this.startAnimation(b);
}
}
return t;
}
//para la animacion
public void startAnimation(final JSlider b) {
if (todo_ok) {
tiempo = new Timer();
task = new TimerTask() {
public void run() {
//calculamos el tiempo de la animacion por 100%
frame = (int) Math.round((mediaPlayer.getMediaTime().getSeconds() * 100)/mediaPlayer.getDuration().getSeconds());
//cuando ambos sean iguales quiere decir que el video a alcanzado el final de la reproduccion
if(mediaPlayer.getMediaTime().getSeconds() == mediaPlayer.getDuration().getSeconds()){
frame=100; // 100%
STOP();//SE DETIENE Y DESTRUYE EL MEDIA PLAYER
}
else // sino
{
// se actualiza el nuevo valor del Slider
b.setValue(frame);
//Porcentaja de reproduccion
System.out.println("Tiempo de reproduccion: " + frame + "% de 100%");
}
}
};
//se inicia la animacion
tiempo.schedule(task,0,speed);
}
}
//detiene la animacion
public void stopAnimation() {
tiempo.cancel();
task.cancel();
}
/* Metod que muestra una ventana de dialgo para añadir "archivos" al reproductor
* hace uso del metodo anterior "setvideo"
*/
public String Abrir_mp3(){
JFileChooser fileChooser = new JFileChooser();
fileChooser.setFileFilter(filter);
int result = fileChooser.showOpenDialog(null);
if ( result == JFileChooser.APPROVE_OPTION ){
try {
//si se esta reproduciendo un mp3, se detiene
if(todo_ok){this.STOP();}
//se asigna a mediaURL el archivo de video seleccionado
URL url = fileChooser.getSelectedFile().toURL();
//se coloca el nombre de la cancion en la variable file
this.file= fileChooser.getSelectedFile().getName();
//se asigna el mp3 al reproductor
mediaPlayer = Manager.createRealizedPlayer( url );
//se coloca a true
this.todo_ok=true;
}
catch (NoPlayerException ex) {
Logger.getLogger(mp3.class.getName()).log(Level.SEVERE, null, ex);
} catch (CannotRealizeException ex) {
Logger.getLogger(mp3.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(mp3.class.getName()).log(Level.SEVERE, null, ex);
}
}
return "Reproductor mp3 - " + this.file;
}
}
Explicacion: Como se ve en el codigo, este reproductor tiene los controles basicos para reproducir PLAY y detener STOP el archivo mp3, ademas unos metodos para animar el jSlider y asi ver el avance en la reproduccion, el metodo Abrir_mp3(); te presenta una ventana de dialogo para que puedas buscar tu archivo MP3 y reproducirlo, todo esto desde una interfaz grafica. El codigo esta bastante comentado.
3. Ahora para implementar este codigo en la interfaz, debes hacer lo siguiente:
Creas una instancia a nuestra clase mp3.java y añades los metodos a sus controles correspondientes.
private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent evt) {
//abrir mp3
this.setTitle(mimp3.Abrir_mp3());
}
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
//dale play
jLabel1.setText(mimp3.PLAY(jSlider1));
}
private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {
//detener
this.setTitle(mimp3.STOP());
jLabel1.setText("Detenido");
}
// instancia a la clase mp3.java
mp3 mimp3 = new mp3();
Alguna duda, no dudes en preguntar, pero recuerda que puedo aconsejarte pero no realizar todo el trabajo por ti, como dijo el profe Escalante, solo HAY QUE TENER GANAS
43 comentarios:
Hola de casualidad ya terninaste el reproductor que estabas haciendo me intereso per la interfaz los botonos y todo eso si me podrias explicar como hacerlo te lo agradeceria
muy bueno tu post pero el link esta muerto.. haber si lo resubes,, y ese skin esta chido.. haber si posteas los skin. que usastes..
Buen aporte ya lo habia intentado pero nunca pude darle la funcionalidad al JSlider que cuando cambie de posicion el disco
se adelante o se atrase respectivamente quisiera saber si me puedes ayudar con ello.
Tengo entendido que se puede realizar
Player.setMediaTime(Time time)
pero no se como manejar el evento
Hola, muy bueno el aporte gracias.
Yo tambien estoy interesado en el skin que usas y en la posibilidad de crear uno propio si pudieras guiarme en el proceso te lo agradeceria, gracias.
que bueno que les gusto el skin, su creacion es bastante sencilla y lo colocare mas adelante. saludos
hola amigo disculpa me salen error en esto
import javax.media.CannotRealizeException;
import javax.media.Manager;
import javax.media.NoPlayerException;
import javax.media.Player;
no se por que, tambien aki private Player mediaPlayer;
que puedo hacer audame gracias
mi correo leoooncio@hotmail.com
leoncio, te muestra un error es esa parte porque no estas incluyendo la libreria Java MediaFramework, te sugiero que te pases por este tuto:
http://jc-mouse.blogspot.com/2009/12/reproducir-video-en-java-y-netbeans-con.html
Tengo un pequeño problema con el proyecto que as adjuntado arriba.
Yo lo descargo y lo abro con el Netbeans, le adjunto la libreria JMF que tengo descargada y instalada en Ubuntu pero a la hora de ejecutar-lo, cuando abro un archivo mp3 (solo e probado en este formato) me salta el siguiente error:
Unable to handle format: mpeglayer3, 44100.0 Hz, 16-bit, Stereo, LittleEndian, Signed, 16000.0 frame rate, FrameSize=32768 bits
Failed to realize: com.sun.media.PlaybackEngine@a68fd8
Error: Unable to realize com.sun.media.PlaybackEngine@a68fd8
03-jun-2010 16:45:09 jcmousemp3.mp3 Abrir_mp3
GRAVE: null
javax.media.CannotRealizeException
at javax.media.Manager.blockingCall(Manager.java:2005)
at javax.media.Manager.createRealizedPlayer(Manager.java:528)
at jcmousemp3.mp3.Abrir_mp3(mp3.java:117)
at jcmousemp3.reproductor.jMenuItem1ActionPerformed(reproductor.java:147)
at jcmousemp3.reproductor.access$200(reproductor.java:6)
at jcmousemp3.reproductor$3.actionPerformed(reproductor.java:130)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
at javax.swing.AbstractButton.doClick(AbstractButton.java:357)
at javax.swing.plaf.basic.BasicMenuItemUI.doClick(BasicMenuItemUI.java:1223)
at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(BasicMenuItemUI.java:1264)
at java.awt.Component.processMouseEvent(Component.java:6263)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
at java.awt.Component.processEvent(Component.java:6028)
at java.awt.Container.processEvent(Container.java:2041)
at java.awt.Component.dispatchEventImpl(Component.java:4630)
at java.awt.Container.dispatchEventImpl(Container.java:2099)
at java.awt.Component.dispatchEvent(Component.java:4460)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4574)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
at java.awt.Container.dispatchEventImpl(Container.java:2085)
at java.awt.Window.dispatchEventImpl(Window.java:2478)
at java.awt.Component.dispatchEvent(Component.java:4460)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
Yo creo que el problema esta en la libreria JMF que no consigo que se instale correctamente el linux (en windows no hay problema).
Lo que me parece raro es que de el error aun adjuntando los .jar de la libreria JMF.
Si podeis hechar-me una mano os lo agradecere. Gracias y perdon por la extension.
masip
tu problema esta en los codec, tu linux no esta reconociendo o no tiene el codec correctamente instalado. te sugiero que te pases por aqui:
http://java.sun.com/javase/technologies/desktop/media/jmf/mp3/download.html
en esa pagina te descargas el plugin de java para mp3 y lo instalas
java com.sun.media.codec.audio.mp3.JavaDecoder
fijate que lo tienes bien instalado, para eso ingresa a JMF registry, en la tercera pestaña PLUGINS y ahi en la segunda pestaña CODEC y buscalo
espero te funcione :D
HOLA YO ESTOY TRABAJANDO EN UN PROYECTO QUE USA JMF PERO LO QUE QUIERO HACER ES CAPTURAR UNA IMAGEN DE LA CAMARA DE MI COPUTADOR Y GUARDARLA EN UNA CARPETA AGRADESCO ME DEN UNA ORIENTACION O ALGUNA DOCUMENTACION DE JMF QUE ESTE EN ESPAÑOL CON ALGUNOS EJEMPLOS QUE ME PERMITA ENTERDERLO
Gracias por contestar Mouse.
Bien te comento, e descargado el plugin de mp3 lo e descomprimido y e copiado el .jar a la ruta /usr/lib/jvm/java-6-sun/jre/lib/ext/ tambien lo e copiado a la carpeta de JMF en la parte de lib que tengo en el home por si las moscas.
Una vez hecho esto e ejecutado el comando que me señalaste y no me lo reconoce ja que salta una excepcion de classnotfound.
Respecto al JMF registry, efectivamente no esta el plugin hay y no lo puedo añadir (aparte de que tengo problemas con el programa porque se queda colgado).
No creo que este bien instalado el plugin lo instale siguiendo unas instrucciones de una web que encontre, ya que en la pagina de sun no dan demasiados detalles. Seguire investigando.
Gracias por tu atención y perdona por la extension.
hola si me puedes ayudar que librerias nomas tengo que agregar al proyenco para que funcione lo del mp3.
gracias por tu atencion.
hola un favor si me podrias ayudar a ponerle al reproductor una lista para ir agregando caciones que se bayan a repruducir, que la reproduccion sea continua y botones para cambiar las canciones y el boton de pause gracias por tu ayuda.
hola no tendras uno que pueda cambiar de cacnion hacia adelamte y hacia atras y que cuadno se termine la cacnion empieza la que este adelante??
Hola que hay.
Muchas gracias por el ejemplo, se entiende perfectamente, pero tengo un problema.
¿Como tengo que hacer si en vez de seleccionar una canción y reproducirla, lo que quiero es reproducir las urls de las canciones que tengo guardadas en un ArrayList?.
¿Hay algún ejemplo por ahí?. He intentado de muchas maneras modificando el código que has puesto, y no lo consigo.
Mi dirección de correo es gipuzkoa41@hotmail.com
Un saludo, y muchas gracias.
Hola te comento que yo eh trabajado un reproductor algo mas complejo pero entendible al puro estilo winamp junto con algunas funciones propias te dejo mi direccion ahi deje una version:
http://jonathan-palomino.blogspot.com/
Hola, ps yo tambien ando trabajando en un reproductor de musica y video con la libreria BasicPlayer, sin embargo al igual q con la libreria jmf, solo puedo lograr reproducir ciertos formatos, me gustaria saber como le podria agregar otros codecs o que reconosca los instalados en windows, Gracias :D.
oye muy buena tu pagina
he estado viendo todos tus ejemplos
buen trabajo y gracias por todo esto
Hola como andan? muchachos, intente usar las librerias JMF para reproducir un MP3 y me salio el siguiente mensaje " Unable to handle format: mpeglayer3, 44100.0 Hz, 16-bit, Stereo, LittleEndian, Signed, 16000.0 frame rate, FrameSize=32768 bits
Failed to prefetch: com.sun.media.PlaybackEngine@72f6f1b6
Error: Unable to prefetch com.sun.media.PlaybackEngine@72f6f1b6"
Si bien he bajado e instalado JMF y el plugin de Mp3 no se que podria ser. tienen alguna idea de como orientarme para resolver este problema? saludos.
Martin
hola... yotengo el mismo problema que Martin...
me instale el plugin y me baje el jmf, pero me sigue tirando el mismo error..
Unable to handle format: mpeglayer3, 44100.0 Hz, 16-bit, Stereo, LittleEndian, Signed, 16000.0 frame rate, FrameSize=32768 bits
Failed to realize: com.sun.media.PlaybackEngine@e06703
Error: Unable to realize com.sun.media.PlaybackEngine@e06703
03/12/2010 18:45:37 sonido.mp3 Abrir_mp3
GRAVE: null
javax.media.CannotRealizeException
si alguien me puede ayudar se lo agradeceria..
Ronny
eit ola, me agradan tus aportes e tomado varios ejempos para mis propios programas, bueno a lo que interesa veras estoy trabajando en un software de video rockola en java(netbeans / windows) bueno mi duda seria si existe una manera de reproducir varios tipos de audio y video (flv, mp4, avi, wav, etc)... pues para que este mas completa, usando algun codec o alguna libreria o algo jeje gracias por tu aportes y tu ayuda
Hola viejo, muy buen post, yo soy programador, y queda clarito, saludos y gracias
noc q librerias poner para q funcione
ALGUIEN ME PUEDE AYUDAR
se utliza las liberias de Java Media Framework
http://java.sun.com/javase/technologies/desktop/media/jmf/mp3/download.html
Que hay compa, muy buen blog, tengo un problema con un reproductor, lo que pasa en mi reproductor tengo una lista donde agrego todos los archivos mp3 a reproducir, y al darle doble clic que se cargen, pero pasa algo extraño, me manda este error:
Error: Unable to realize com.sun.media.amovie.AMController@19cc1b
javax.media.CannotRealizeException
t es en esta linea:
mediaPlayer = Manager.createRealizedPlayer( url );
lo extraño esque aveces si lo reproduce, pero otras veces no, alguna idea de por donde pueda ser?, antes de reproducirlos muevo los archivos mp3 a una carpeta temporal, los archivos si se crean bien, ya que los puedo reproducir en el reproductor de windows, bueno por tu atencion gracias.
Ana
Hola buenas tardes.
Una pregunta que metodo o como podria hacer para poder manipular 2JList. Bueno lo que en si quiero, es que cuando yo seleccione un item en un JList al presionar una tecla en especifico, se pocesione el foco en el JList siguiente.
Lo he tratado de hacer con getFocus pero segun que JList no tiene esa propiedad, Pueden ayudarme?
gracias
Hola mouse, tu proyecto me sirvió de gran ayuda, pude hacer un excelente reproductor con miles de metodos que vemos en reproductores comunes, lo que nunca pude encontrar fue como manejar el volumen del audio, me podrías ayudar?? agradecido
Oye Viejo Esta Chido tu Post, Pero Llevo Tiempo Buscando Una Solucion Para Este Error:
Error: Unable to realize com.sun.media.amovie.AMController@78bc3b
Y No Encuentro Una Solucion, Solo Reprodusco Archivos MP3, Pero Cuando La Velocidad De Transmisicion Es De 320kb Se Cae En Este Error, Please Ayuda
Hola queria saber si alguien me puede ayudar necesito un reproductor de audio y video en uno solo pero no consigo hacrlo...estoy utilizando el API JMF.de antemano gracias a JC Mouse
Saludos oie muy buena pagina de verdad excelente una duda tendrás algún tema donde expliques como cambiar la forma de un botón hacerlo circular como aparece en tu imagen tu version personal del reproductor winamp el play es circular
HOLA MOUSE OJALA ME AYUDES TODO IBA BIEN CON EL PROGRA PERO YA PARA SELECCIONAR LA CANCION A REPRODUCIR NO ME LANZA LA VENTANA PARA LOCALIZARLA Y SELECCIONARLA SEGUN YO ESTA BIEN...PERO OVIO NO LO ESTA NO SE SI SEBES EL XQ DE ESTO...TE AGRADECERIA MUCHO GRACIAS
Tengo una pregunta, sobre JMF queria saber si se pueden comparar dos sonidos y que retorne si son iguales o no, es que estoy en medio de un proyecto y necesito realizar la comparacion de dos sonidos.
mi correo es decco_reighan_msku10@hotmail.com
Disculpa soy medio nuevo en esto de java, al escoger una cancion y poner play no me sale el sonido ni se mueve el jSlider se me activa el label q dice q esta reproduciendo pero el resto no.. si me pudieras ayudar con eso
y muchas gracias
Q tal tengo hecho un reproductor pero utilizando la libreria JavaZoom y JavaBasicPlayer pero puedo hacer que se mueva el Jslider pero quiero que cuando muevo en el Jslider se me adelante o retroceda la cancionesta es la manera como hago q se mueva el Jslider
//Creo el timer que entre en el metodo a los 250ms y agrego el evento ActionListener.
Timer tmpActualizar=new Timer(250, new ActionListener() {
public void actionPerformed(ActionEvent e) {
//maxbyte es el numero total de bytes que tiene la cancion
maxByte=(int)reproducir.getTamanoBits();
//changeByte es el numero de bytes que tiene conforme avanza la cancion changeByte=reproducir.getProgresoActual();
//barraAvance es el Jslider y le mando como maximo maxByte
barraAvance.setMaximum(maxByte);
//Y para que se mueva con ChangeByte y se actualiza cada vez que entra al timer
barraAvance.setValue(changeByte);
//cuando el numero total de bytes es igual a los bytes que transcurren es que se termino la cancion y por lotanto le doy a siguiente cancion if(maxByte==changeByte){
numCancion++;
if(!listaDoble.vacia()&&numCancion<=listaDoble.cantidad()){
if(btnAleatorio.isSelected()){
numCancion=rand(contSong);
}
cambiarCancion();
}else
numCancion--;
}
}
});
Que tal amigo me parecio muy bueno tu ejemplo de reproductor. Te cuento que me en encuentro realizando un proyecto parecido y me gustaria que el look and feel se visualizara con los mismos estilos del proyecto winamp que estas trabajando. Es posible que me indiques cuales son las librerias y javadocs necesarios para utilizar ese look and feel(azul oscuro y negro). Quedo atento y muchas gracias por tu colaboracion. siegfried4110@hotmail.com
Hola mouse, muy buenos tus aportes, hace poco que comienzo a visitar tu blog me parece genial!.
Bueno, tengo una cuestión al igual que te comenta Oscar Garcia, sobre como logras establecer el look and feel de tu reproductor, el que muestras al final del vídeo y en la ultima imagen, ¿haces uso de alguna librería en especifico o como es que estableces ese look and feel?, me podrías orientar un poco como logras esa apariencia, te lo agradecería infinitamente...
Muy buen blog.
Saludos desde México!!
sognare.1@hotmail.com
hola mouse
una pregunta ya hice todo como lo pusiste en el codigo que de echo salio perfecto pero ahora lo que quiero es poner 2 botones el de pausa y continuar, pero me fije en los metodos que trae el javax.mediaplayer
y no viene esos 2 metodos
como podria hacer esto ???
Oscar y Thony no utilizo mimgun look and feel para las ventas, sino repinto los componente con imagenes
Cristian segun recuerdo JMF no tiene el metodo PAUSA asi que tendrias que capturar la duraccion del video y cuando se preione un botn pausa capturar en que parte ddel video se detuvo y despues con esa informacion reanudarlo
Gracias por este ejemplo del reproductor, lo probe y si me funciono, ahora lo de pausa, siguiente y anterior creo q es con nodos o listas enlazadas si no estoy mal, Saludos.
GRACIAS!!!!!
YA LO ROBÉ Y ES UNA MARAVILLA... MI PROYECTO SERÁ EL MÁS GENIAL...
Hola, descargo el proyecto pero no me sirve en mi netbeans, quiza es xq tengo la version 7.3... podrias ayudarme?
hola, he descargado el código fuente y traté de utilizarlo, se reproduce, pero no toque. ¿Qué debo hacer?
gracias amigo me sirvió tu programa muy bueno y fácil de entender
Publicar un comentario