Reproducir mp3 con Java

Hay varias implementaciones de librerias que pueden leer mp3 desde java.Todas se basan en el estandar Java Sound API basica, y añaden funcionalidad.  Hay varias pero  tienen sus inconvenientes, por ejemplo JMF (Java media framework) depende del sistema operativo y hay que instalar unas dlls para poder ejecutarlo , etc...

Parece que la patente de .mp3 tiene sus restricciones y por eso no existe una implementacion "facil" para esta cosas.

Bueno, voy a explicar y hacer un programilla muy basico de como leer mp3 desde java con las librerias (Javazoom javamp3spi), estas se basan en otras implementaciones (tritonius y Jlayer).

Vamos al asunto!!!

1.Lo primero crear un proyecto (desde eclipse, o desde donde querais):

2. Poner en el classpath las librerias a usar, son estas 3:
        jl1.0.1.jar (Jlayer)
        tritonus_share.jar (tritonius)
        mp3spi1.9.5.jar (javazoom)

      Podeis descargarlas desde aqui: 
      http://www.javazoom.net/mp3spi/sources/mp3spi1.9.5.zip
      (Dentro vienen las 3 librerias, mirar los subdirectorios y las encontrareis)


       mp3spi es el motor de nuestra ejecucion, tiene funcionalidades para reproducir audio,     acceder al dispositivos, etc.... de por si ella funciona, pero para tener funcionalidad con archivos mp3 es necesario importar tambien jLayer y tritonius.


3.Creamos la primera clase que sera el cerebro de la operacion (Jzplayer.java):
   De todos modos, si conoceis la Java Sound Api casi todo hace referencia a ella.

  La voy comentando inline.


import javax.sound.sampled.*;
import java.io.*;
public class Jzplayer {
    /**
     * Es el main, le pasamos una url en formato string:
     *
     * @param filename
     */
    public void testPlay(String filename)
    {
      try {
        File file = new File(filename);
        //Lanzamos un stream hacia la fuente
        //si no tienes las librerias de jlayer y tritonius
        //e intentas reproducir un archivo mp3 no te funcionara
        AudioInputStream in= AudioSystem.getAudioInputStream(file);
        AudioInputStream din = null;
        AudioFormat baseFormat = in.getFormat();
        //Le pedimos a java sound api un decoder a partir de nuestro archivo
        //java sound lee el archivo y sabe que informacion necesita para decodificar
        //luego especificamos la calidad de muestreo a 16-bit y 2 canales (estero)
        AudioFormat decodedFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED,
                                                                                      baseFormat.getSampleRate(),
                                                                                      16,
                                                                                      baseFormat.getChannels(),
                                                                                      baseFormat.getChannels() * 2,
                                                                                      baseFormat.getSampleRate(),
                                                                                      false);
        //Usamos el decoder para establecer el inputstream
        din = AudioSystem.getAudioInputStream(decodedFormat, in);
        // vamos a reproducirlo
        rawplay(decodedFormat, din);
        in.close();
      } catch (Exception e)
        {
            System.out.println("Exception " +e.getMessage());
        }
    }

    private void rawplay(AudioFormat targetFormat, AudioInputStream din) throws IOException,                                                                                                LineUnavailableException
    {
      //cantidad de buffer que vamos a usar   
      byte[] data = new byte[4096];
      //Java sound obtiene recursos de los devices (tarjeta sonido) del sistema
      //a partir de la info que le pidamos, el busca entre los devices disponibles
      SourceDataLine line = getLine(targetFormat);
      if (line != null)
      {
        // Comienza la reproduccion
        line.start();
        int nBytesRead = 0, nBytesWritten = 0;
        while (nBytesRead != -1)
        {
            nBytesRead = din.read(data, 0, data.length);
            if (nBytesRead != -1) nBytesWritten = line.write(data, 0, nBytesRead);
        }
        // Cerrando conexiones y liberando recursos
        line.drain();
        line.stop();
        line.close();
        din.close();
      }
    }

    private SourceDataLine getLine(AudioFormat audioFormat) throws LineUnavailableException
    { //como pone arriba, Java mira entre los devices dispobiles y
      // obtiene un canal para reproducir (en este caso)
      SourceDataLine res = null;
      DataLine.Info info = new DataLine.Info(SourceDataLine.class, audioFormat);
      res = (SourceDataLine) AudioSystem.getLine(info);
      res.open(audioFormat);
      return res;
    }

}

 


4. Y ahora solo necesitamos una clase test para probarla: (tester.java)


import java.io.File;

public class tester {

    /**
     * @param args
     */
    public static void main(String[] args) {
        Jzplayer p = new Jzplayer();
        p.testPlay("c:"+File.separator+"Enemy.mp3");
        System.out.println("saliendo");
    }

}





Si quereis mas info , esta es la url del proyecto en javazoom:
http://www.javazoom.net/




Hay mas formas , pero esta es una muy sencilla.... y a veces eso nos quita la desesperacion ;-D








Comentarios

Publicar un comentario

Entradas populares de este blog

Reiniciar usuario de SVN Subversion

Subir campos Blob a BBDD (Oracle) con Java