miércoles, 8 de agosto de 2012

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.

Photobucket

11 comentarios:

Jvan Wolf dijo...

Excelente programa, gracias por compartirlo. He intentado reproducir un archivo MP3 y me produce un error. Que tipo de archivos audio reproduce?

Rolando dijo...

No deberías tener problemas amigo, intenta con otros archivos mp3.

Jvan Wolf dijo...

Cunado intento reproducir un archivo de sonido me lanza este mensaje:

"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%)

Jvan Wolf dijo...

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!!!

Anónimo dijo...

Muchas gracias por el aporte

German Rodriguez dijo...

Buenos dias,
Gracias 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

Willian Balmore Delgado sicilia dijo...

Hola me gustaría sacar la serie frames (en números) de un audio corto como se podría?

Gracias de antemano y un saludo.
Aquí mi correo. balomoreds@hotmail.com

Anónimo dijo...

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

Anónimo dijo...

Excelente aporte, gracias por el código, siempre quise saber como se programa un analizador de expectro de audio :D

jacinto miraval carrillo dijo...

Lo máximo Rolando..Gracias.

Jorge Rodriguez dijo...

Hola quisiera ejecutar el programa , donde lo bajo ?
o que necesito hacer?

Publicar un comentario