Olá,
você pode tentar o gstreamer-java[1], que é um conjunto de bindings Java para o framework GStreamer. Os criadores da ferramenta dizem que "Although gstreamer is commonly associated with the gnome desktop, gstreamer itself, and these bindings are portable across operating systems.". Motivado pela sua pergunta, fiz um teste com o gstreamer-java e toquei um MP3 sem problemas. Porém estou em um desktop gnome (Ubuntu) e não tenho como dizer se funcionaria no Windows (é muito provável que o alsasink não funcione fora do Linux). Tive algumas experiências com o pygst (o mesmo que o gstreamer-java, só que para Python) e o framework é muito poderoso (melhor que o Java Media Framework toda vida) e funciona bem apesar da relativa complexidade e da parca documentação.
Fiquei surpreso com a qualidade da API em si, é orientada a objetos e bem mais amigável do que a original (em C) e do que os bindings Python, que são um pouco melhores do que a original, mas perdem feio para a gstreamer-java em expressividade.
Segue abaixo o código que funcionou aqui, adaptado dos tutoriais no site do gstreamer-java [2].
import java.io.File;
import org.gstreamer.Bus;
import org.gstreamer.ElementFactory;
import org.gstreamer.Gst;
import org.gstreamer.GstObject;
import org.gstreamer.State;
import org.gstreamer.elements.PlayBin;
public class JavaGStreamerSimpleDemo
{
public static void main(String[] args)
{
Gst.init("AudioPlayer", args);
PlayBin playbin = new PlayBin("AudioPlayer");
playbin.setInputFile(new File("/home/rodrigo/mp3/hey-it-works.mp3"));
playbin.setAudioSink(ElementFactory.make("alsasink", "a"));
playbin.getBus().connect(new Bus.EOS()
{
@Override
public void endOfStream(GstObject source)
{
System.out.println("Finished playing file");
Gst.quit();
}
});
playbin.setState(State.PLAYING);
Gst.main();
playbin.setState(State.NULL);
}
}
Espero que ajude.
[]'s
Rodrigo
[1] http://code.google.com/p/gstreamer-java/
[2] http://code.google.com/p/gstreamer-java/wiki/Tutorials