InicioHazlo Tu MismoReproductor mp3 java con ecualizador, balance y listas!

Reproductor mp3 java con ecualizador, balance y listas!

Hazlo Tu Mismo•1/19/2013
Hola, bienvenidos a este post! Mi nombre es Jorge, y me gusta la electrónica, la música y laprogramación, en este post continuaremos mejorando cada vez nuestro propio reproductor de mp3 en java, el que comenzamos en mi post anterior. En mi último post: Reproductor MP3 Java! Vimos como realizar un reproductor de archivos de audio con formato mp3 en java ,Recuerden que java no reconoce el formato mp3 de manera nativa, motivo por el cual cada vez que nos enfrentemos a la necesidad de reproducir un acrchivo de este tipo necesitaremos de alguna librería externa. Entre las librerías externas que permiten leer y reproducir mp3 en java nos encontramos con la mas conocida: JMF (Java Media Framework), que es quizá la mas completa, ya que soporta diversos formatos de audio y video, pero también es (en ocasiones) la mas dificil de manejar al momento de hacer portable nuestra aplicación.La librería que se usé en mi post y la que seguire usando como ejemplo es la misma, BasicPlayer de JavaZoom, la cual esta basada en otras librerías también de JavaZoom(JLayer, MP3SPI). El .jar que contiene las clases necesarias para este proyecto puedes descargarlo de forma libre y gratuita desde aquí: BasicPlayer3.0 No voy a volver repostear mi post así que recordemos: Úna vez que el jar se encuentra en el path de nuestro IDE (NetBeans, Eclipse, Etc.), solo debemos crear una ventana, en este caso un jFrame, y agregarle un par de botones y etiquetas, un menu y listo, kuego para controlar el reproductor debiamos instanciar la clase BasicPlayer, pero como esta es "abstracta" debemos tambier implementar (para si lo deseamos sobreescribir) todos sus métodos. Recordamos los métodos de la libreria BasicPlayer: Opened Muestra información instantanea del fichero que se abre para luego ser reproducido (Nombre, duración, tags ID3, datos técnicos como bitrate Etc.). Progress Sumamente útil para obtener información en tiempo real de la reproducción actual!!! Los datos mas relevantes para nosotros ahora: Posición actual en "frames" y en milisegundos, valores de la ecualización, etc. StateUpdated Como a nuestra clase implementa otra clase llamada "BasicListener", nuestra clase serápasiblede reconocer eventos como: Archivo abierto, pausa puesta, búsqueda realizada, volumen cambiado, en fin, todo cambio que se haga a través del controlador del reproductor. X ejemplo, al cargar un archivo vemos en consola tooodo esto: ene 19, 2013 5:02:36 PM javazoom.jlgui.basicplayer.BasicPlayer open Información: open(Cocuments and SettingsJorgeEscritorioMusicaLed ZeppelinLed Zeppelin - Heartbreaker.mp3) stateUpdated : OPENINGCocuments and SettingsJorgeEscritorioMusicaLed ZeppelinLed Zeppelin - Heartbreaker.mp3 ene 19, 2013 5:02:36 PM javazoom.jlgui.basicplayer.BasicPlayer createLine Información: Create Line ene 19, 2013 5:02:36 PM javazoom.jlgui.basicplayer.BasicPlayer createLine Información: Create Line : Source format : MPEG1L3 44100.0 Hz, unknown bits per sample, stereo, unknown frame size, 38.28125 frames/second, ene 19, 2013 5:02:36 PM javazoom.jlgui.basicplayer.BasicPlayer createLine Información: Create Line : Target format: PCM_SIGNED 44100.0 Hz, 16 bit, stereo, 4 bytes/frame, little-endian opened : {mp3.id3tag.track=32, mp3.crc=false, mp3.copyright=false, album=, audio.length.frames=12216, mp3.channels=2, mp3.version.mpeg=1, date=, mp3.id3tag.genre=Other, mp3.framesize.bytes=413, author=, title=, mp3.version.layer=3, mp3.length.frames=12216, mp3.vbr.scale=0, mp3.bitrate.nominal.bps=128000, mp3.version.encoding=MPEG1L3, audio.type=MP3, [email protected], audio.length.bytes=5094162, vbr=false, mp3.id3tag.v2.version=3, mp3.padding=false, audio.framerate.fps=38.28125, mp3.length.bytes=5094162, audio.channels=2, mp3.framerate.fps=38.28125, duration=319112000, mp3.header.pos=4096, mp3.frequency.hz=44100, basicplayer.sourcedataline=com.sun.media.sound.DirectAudioDevice$[email protected], bitrate=128000, mp3.mode=1, comment= , mp3.vbr=false, audio.samplerate.hz=44100.0, mp3.original=true} stateUpdated : OPENED:8192 Una vez que damos play vemos esto: ene 19, 2013 3:36:02 PM javazoom.jlgui.basicplayer.BasicPlayer startPlayback Información: startPlayback called ene 19, 2013 3:36:02 PM javazoom.jlgui.basicplayer.BasicPlayer initLine Información: initLine() ene 19, 2013 3:36:05 PM javazoom.jlgui.basicplayer.BasicPlayer openLine Información: Open Line : BufferSize=88200 ene 19, 2013 3:36:05 PM javazoom.jlgui.basicplayer.BasicPlayer openLine Información: Master Gain Control : [-80.0,6.0206] 0.625 *** stateUpdated : PLAYING:8192 ene 19, 2013 3:36:05 PM javazoom.jlgui.basicplayer.BasicPlayer openLine Información: Pan Control : [-1.0,1.0] 0.0078125 *** ene 19, 2013 3:36:05 PM javazoom.jlgui.basicplayer.BasicPlayer startPlayback Información: Creating new thread ene 19, 2013 3:36:05 PM javazoom.jlgui.basicplayer.BasicPlayer run Información: Thread Running Propiedades : {mp3.position.microseconds=26122, mp3.equalizer=[[email protected],*** mp3.frame.size.bytes=413, mp3.frame=1, mp3.frame.bitrate=128000, mp3.position.byte=413} *** los valores que tienen el paneo (o balance) ,el master gain (volumen) y la equalización x defecto. Display Algo así como un Debbuger que nos permite mostrar toda la actividad y excepciones (si las hay) en la consola. Bien, vamos a lo que nos interesa, en primer lugar, vamos a implementar un balance en el reproductor (el volumen ya lo implementamos en el post anterior): Lo que haremos es muy similar a lo que hicimos con el volumen, un sencillo jSlider, pero a diferencia de los valores de gain que van desde 0.0 a 0.1 (float) el valor de paneo va desde -1.0 a 1.0 (float) (izquierda y derecha).motivo x el cual nuestro jSlider debe tener un minimo de -100 y un maximo de 100 (int), el cual luego casteremos a float dividiendolo para que nos de valores como: -0.80 o 0,70 Etc. lo que haremos será en el StateChanged del jSlider hacer que el controlador que implementa la clase del reproductor en el constructor, llame al método setPan() el cual recibe como párametro un numero decimal(float o double, originalmente double): El párametro que usaremos será el mismo valor del jSlider pero casteado a float y dividido entre 100: Como en el caso del ejemplo, la clase del reproductor nesecita ser instanciada, al objeto le llamé mizplayer (la clase se llama ZPlayer) mizplayer.control.setPan((float)jSlider2.getValue()/100); Perfecto, ahora como esto no arroja una excepción, estamos obligados a capturarla con un try-catch, así que quedaría así: private void jSlider2StateChanged(javax.swing.event.ChangeEvent evt) { try { mizplayer.control.setPan((float)jSlider2.getValue()/100) ; } catch (BasicPlayerException ex) { Logger.getLogger(ZPlayerFrame.class.getName()).log(Level.SEVERE, null, ex) ; } jLabel3.setText(""+(double)jSlider2.getValue()/100) ; } { Y esto es todo, ya tenemos balance!X su puesto que se pouede poner una etiqueta que muestre el valor, eso es a gusto suyo. Bien, vamos con el plato fuerte, el equalizador!!!! En el método progress notamos que uno de los parámetros en de tipo Map, es decir un mapeo de propiedades, que nos devuelve un objeto del que podemos extraer cadenas, como vimos cada vez que se abre un nuevo threadde reproducción obtenemos los datos así: mp3.equalizer=[[email protected] Eso no es ni mas ni menos que un array de tipo float, para poder convertirlo en un array debemos usar el método get del Map, que en nuestro caso se llama properties: para obtener el arreglo debemos crear dos arreglos, uno en la clase pública (el que le dará los valores al pan) y otro en la clase del reproductor (el que leerá los valores). En la clase del reproductor: En este caso le llamé "equalizer": public float[] equalizer; y en la clase publica: en este caso le llamé "eq" float[] eq = new float[32]; Y aquí ya le doy tamaño ya que las bandas de equalizacion son 32 ( aúnque solo se usan 10). y así lo obtenemos: Con el método arraycopy de System me evito tener que poner: for(int i=0; i
Datos archivados del Taringa! original
121puntos
9,801visitas
0comentarios
Actividad nueva en Posteamelo
0puntos
2visitas
0comentarios
Dar puntos:

Dejá tu comentario

0/2000

Autor del Post

d
diazespina🇦🇷
Usuario
Puntos0
Posts52
Ver perfil →
PosteameloArchivo Histórico de Taringa! (2004-2017). Preservando la inteligencia colectiva de la internet hispanohablante.

CONTACTO

18 de Septiembre 455, Casilla 52

Chillán, Región de Ñuble, Chile

Solo correo postal

© 2026 Posteamelo.com. No afiliado con Taringa! ni sus sucesores.

Contenido preservado con fines históricos y culturales.