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
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
Este comentario ha sido eliminado por el autor.
ResponderEliminar