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:

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

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

    ResponderEliminar
  3. 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%)

    ResponderEliminar
  4. 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!!!

    ResponderEliminar
  5. Muchas gracias por el aporte

    ResponderEliminar
  6. 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

    ResponderEliminar
  7. 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

    ResponderEliminar
  8. 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

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

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

    ResponderEliminar