Willkommen auf Pelzkuh.de
Hier finden sich Neuigkeiten rund um interessante Themen aus der (Computer-)Technik und den Pelzkuh.de Development Server. Zugriff gibt es über die Trac Links.

Funkstille aufgehoben - Javazoom MP3 Player


Wer schon einmal vor der Aufgabe stand MP3 Dateien in Java abzuspielen kommt neben dem Java Media Framework evtl. bei der kleinen aber feinen Javazoom Standalone - Implementierung vorbei. Unter dem Stichwort "jlGui - Music Player" findet man eine Sammlung von allerlei nützlichen Bibliotheken zum Abspielen von MP3s aber auch Ogg, Flac und exotischeren Dateitypen wie dem Monkey's Audio Format. Neben einem vollwertigen skinfähigen (Winamp skins) Musikabspieler findet man im Paket auch die BasicPlayer API auf die der jlGui Player aufsetzt.
Möchte man jetzt in einem eigenen Projekt MP3s abspielen ist dies recht einfach zu bewerkstelligen. Im jlGui zip Archiv findet sich ein lib Ordner der alle benötigten Java Bibliotheken enthält. Diese fügt man dem Klassenpfad des eigenen Projekts hinzu und schon ist alles benötigte verfügbar. Im wesentlichen benötigt man folgendes für einen simplen Abspieler. (Im BasicPlayer src Bundle findet sich das Beispiel in voller Länge)
// Instanz des Players erstellen
BasicPlayer player = new BasicPlayer();
// Controller für alle Abspielfunktionen
BasicController control = (BasicController) player;
...
// Musikdatei öffen
control.open(new File("Pfad\datei.mp3"));
// Und fertig :-)
control.play();
Schade ist allerdings das das Projekt schon etwas in die Tage gekommen ist und Bugfixes manchmal etwas auf sich warten lassen. Es gibt aber auch nicht gerade große Änderungen bzgl. dem Abspielen von Musik. Ein kleine 'Neuigkeit' kann dann doch ein Paar Schwierigkeiten aufwerfen. Seit es MP3s im großen Stil von Amazon, Itunes und co gibt ist es üblich zusätzliches Material (z.B. Coverart) direkt mit in die Dateien einzubetten. Genau mit solchen Dateien hat die oben beschriebene Lösung ein kleines Problem. Bei JPGs als Cover versucht die Bibliothek fälschlicherweise MP3s mit dem Vorbisdecoder zu öffnen was dann natürlich fehlschlägt.
Symptom ist die Fehlermeldung - Resetting to invalid mark:
java.io.IOException: Resetting to invalid mark
at java.io.BufferedInputStream.reset(Unknown Source)
at org.tritonus.share.sampled.file.TAudioFileReader.getAudioInputStream(TAudioFileReader.java:324)
at javazoom.spi.mpeg.sampled.file.MpegAudioFileReader.getAudioInputStream(Unknown Source)
at javazoom.spi.mpeg.sampled.file.MpegAudioFileReader.getAudioInputStream(Unknown Source)
at javax.sound.sampled.AudioSystem.getAudioInputStream(Unknown Source)
at javazoom.jlgui.basicplayer.BasicPlayer.initAudioInputStream(BasicPlayer.java:330)
at javazoom.jlgui.basicplayer.BasicPlayer.initAudioInputStream(BasicPlayer.java:266)
at javazoom.jlgui.basicplayer.BasicPlayer.open(BasicPlayer.java:220)
at de.tools.io.sound.BasicPlayerTest.play(BasicPlayerTest.java:91)
at de.tools.io.sound.BasicPlayerTest.main(BasicPlayerTest.java:65)
Die Exception sieht nach einer defekten Musikdatei aus... ist es aber nicht. Das jlGui Paket enthält die veraltete Bibliothek mp3spi1.9.4.jar. Tauscht man sie durch die aktuelle Version mp3spi1.9.5.jar wird auch mit Coverart versehene Musik in Zukunft ohne Probleme abgespielt.

Vorteil an der Javazoom Lösung ist das alle benötigten Bibliotheken mitgeliefert werden können (LGPL License) und keine separaten Installationen (z.B. eines MediaFrameworks) vom Nutzer des Programms gefordert werden. Mit dem kleinen Fix am Ende kann man dann auch beruhigt aktuelle Musik der großen Musikanbieter abspielen.

Kommentare:

  1. Super, ein HowTo! Da muss ich schnell Zeit freischaufeln zum Nachimplementieren!

    AntwortenLöschen
  2. Sollte nicht allzu lange dauern... ist echt relativ simpel :-) Seit ihr schon wieder im Land oder noch im hohen Norden?

    AntwortenLöschen