Reproducir MP3 con Java

De ChuWiki

Para reproducir MP3 con java necesitamos una librería adicional. La más básica es JLayer. Nos bastará descargarla y añadir el jar jl1.0.1.jar al classpath de nuestro proyecto eclipse (o el ide que uses).

Una vez hecho, el siguiente programa tonto es capaz de reproducir un fichero MP3.

package com.chuidiang.pruebas;

import java.io.FileInputStream;
import java.io.FileNotFoundException;

import javazoom.jl.decoder.JavaLayerException;
import javazoom.jl.player.Player;

public class ReproductorMp3 {

   public static void main(String[] args) throws FileNotFoundException,
         JavaLayerException {

      Player apl = new Player(new FileInputStream(
            "e:/musica/flauta de pan instrumentales - el condor pasa.mp3"));

      apl.play();
   }
}

No tenemos control ninguno y la llamada a play() se quedará bloqueada hasta que termine la reproducción del sonido.

La clase Player también un método play(int) en la que podemos indicar el número de tramas a reproducir. Player recuerda dónde iba reproduciendo y reproducirá las n siguientes tramas que le indiquemos. Con este método podemos hacer algo como esto para poder pausar la música

package com.chuidiang.pruebas;

import java.io.FileInputStream;
import java.io.FileNotFoundException;

import javazoom.jl.decoder.JavaLayerException;
import javazoom.jl.player.Player;

public class ReproductorMp3 {

   static boolean pausa = false;

   public static void main(String[] args) throws FileNotFoundException,
         JavaLayerException, InterruptedException {
      final Player pl = new Player(new FileInputStream(
            "e:/musica/flauta de pan instrumentales - el condor pasa.mp3"));

      new Thread() {
         public void run() {
            try {
               while (true) {
                  if (!pausa) {
                     if (!pl.play(1)) {
                        break;
                     }
                  }
               }
            } catch (JavaLayerException e) {
               e.printStackTrace();
            }
         }
      }.start();

      Thread.sleep(5000);
      pausa = true;
      System.out.println("pausado");
      Thread.sleep(2000);
      pausa = false;
   }
}

En un hilo separado hemos lanzado un bucle infinito (while(true)) y dentro, si no estamos pausados (if (!pausa)), llamamos a player.play(1) para que reproduzca un frame de música. Si este método devuelve true, es que la trama se ha reproducido correctamente, si devuelve false, es que no hay más tramas. Así que si player.play(1) devuelve false, es que hemos llegado al final de la música y terminamos el bucle infinito con break.

Fuera del hilo, al final del código, hacemos una espera de 5 segundos (sleep(5000)) en los que estará sonando la música, luego marcamos el boolean pausa a true, de forma que la música se pausará, una nueva espera de 2 segundos (sleep(2000)) y deshacemos la pausa.

Por supuesto, JLayer tiene muchas más clases en la que podríamos manejar a más bajo nivel la reproducción del fichero mp3.