Graficar espectros de audio en tiempo real
Buen día a todos, en esta oportunidad les quiero presentar un artículo dedicado al procesamiento de audio en tiempo real. A raíz de este post y con la finalidad de responder a las preguntas que me llegan de los lectores de este blog es que escribo este artículo en el cual les muestro la manera de graficar archivos mp3 en tiempo real, con la posibilidad de poder cambiar la forma mediante la cual se renderiza el espectro tanto en su forma como en su color. Mediante la biblioteca kj_dsp1.1.jar y algunas otras adicionales (que se encuentran agregadas en el proyecto adjunto) podemos graficar espectros de audio como lo hacen reproductores de música como Amarok o Winamp. Las dos imagenes siguientes muestran la manera en que se grafica el espectro
de un archivo de música mientras ésta es reproducida. Lograr algo como esto
parece ser una tarea tediosa pero gracias al proyecto que les presento
en este post, obtener una interfaz como la mostrada es relativamente
sencillo.
En primer lugar necesitamos tener una clase que se encargue de manejar todo lo relacionado con los controles de nuestro pequeño reproductor. Dicha clase sería similar a la siguiente:
package com.blogspot.rolandopalermo.gui; import java.util.Map; import javazoom.jlgui.basicplayer.BasicController; import javazoom.jlgui.basicplayer.BasicPlayerEvent; import javazoom.jlgui.basicplayer.BasicPlayerListener; /** * * @author Rolando */ public class Reproductor implements BasicPlayerListener { @Override public void opened(Object o, Map map) { } @Override public void progress(int i, long l, byte[] bytes, Map map) { } @Override public void stateUpdated(BasicPlayerEvent bpe) { } @Override public void setController(BasicController bc) { } }
Hecho esto ahora necesitamos tener un componente el cuál se encargará de capturar los frames de nuestro audio y a continuación graficarlo. Para esto necesitamos un objeto de la clase SpectrumTimeAnalyzer, la cual se encuentra en el proyecto que adjunto. Con eso bastaría para poder gestionar un pequeño reproductor y visualizar la gráfica del archivo. Cabe resaltar que para poder editar los colores de las barras necesitamos de un editor de viscolor similar al usado por el winamp. En el proyecto adjunto un archivo viscolor.txt el cual contiene los colores y su degradado. En un próximo post hablaré de cómo realizar un pequeño editor de archivos de viscolor para reproductores de música.
Les adjunto el archivo del proyecto para Netbeans esperando que sea de utilidad para sus proyectos.
Excelente programa, gracias por compartirlo. He intentado reproducir un archivo MP3 y me produce un error. Que tipo de archivos audio reproduce?
ResponderBorrarNo deberías tener problemas amigo, intenta con otros archivos mp3.
ResponderBorrarCunado intento reproducir un archivo de sonido me lanza este mensaje:
ResponderBorrar"ago 10, 2012 12:51:49 AM com.blogspot.rolandopalermo.gui.FramePrincipal abrir
Grave: null
javax.sound.sampled.UnsupportedAudioFileException: could not get audio input stream from input file"
Esta es la cancion que quiero reproducir y sus datos:
General
Complete name : C:\Users\Jvan\Desktop\Romero.mp3
Format : MPEG Audio
File size : 3.11 MiB
Duration : 3mn 23s
Overall bit rate mode : Constant
Overall bit rate : 128 Kbps
Album : El Vals del Obrero
Album/Performer : Ska-P
Track name : Romero El Madero
Track name/Position : 5
Performer : Ska-P
Publisher : RCA International
Genre : Other
Recorded date : 1996
Audio
Format : MPEG Audio
Format version : Version 1
Format profile : Layer 3
Mode : Joint stereo
Mode extension : MS Stereo
Duration : 3mn 23s
Bit rate mode : Constant
Bit rate : 128 Kbps
Channel(s) : 2 channels
Sampling rate : 44.1 KHz
Compression mode : Lossy
Stream size : 3.10 MiB (100%)
Jajajaja... Disculpen, el programa está bien, el que está mal soy yo... xD Me confundi con este otro programa: http://rolandopalermo.blogspot.com/2009/12/procesamiento-digital-de-audio.html Saludos!!!
ResponderBorrarMuchas gracias por el aporte
ResponderBorrarBuenos dias,
ResponderBorrarGracias por el aporte, lo he estado revisando ya que puede ayudarme muchisimo en mi tesis de grado, en la cual lo mas importante es la comparacion de sonido de una guitarra.
Como me ayudaria? : Pense en tomar los datos que utilizas para graficar y aplicarlo a los dos sonidos, con el fin de compararlos, estos datos se obtendrian a partir del: fft.calculate(pSample); en drawSpectrumAnalyser
Pero tengo dos preguntas: si comparo estos valores que utilizas para graficar, realmente estare comarando bien el sonido?
la segunda es: de donde obtienes el pSample, se que viene de stereoMerge(pLeft, pRight), pero de donde vienen los arreglos pRight y pLeft que le pasas a stereoMerge.
Esto seria de gran ayuda
Saludos.
Correos: garodriguezr.11@gmail.com y german_deportivo@hotmail.com
Hola me gustaría sacar la serie frames (en números) de un audio corto como se podría?
ResponderBorrarGracias de antemano y un saludo.
Aquí mi correo. balomoreds@hotmail.com
Buenos dias Amigo rolando, muchas gracias por el aporte, quisiera preguntar, que tan complicado podria ser graficar este espectro en tiempo real pero mediante un microfono que conecte al portatil o tablet, y que los sonidos que reciba de ese microfono o dispositivo los convierta en esa grafica..... mucha gracias
ResponderBorrarExcelente aporte, gracias por el código, siempre quise saber como se programa un analizador de expectro de audio :D
ResponderBorrarLo máximo Rolando..Gracias.
ResponderBorrarHola quisiera ejecutar el programa , donde lo bajo ?
ResponderBorraro que necesito hacer?