9.7 Musik abspielen 

Für die Audio-Wiedergabe in Java gibt es zwei Möglichkeiten: sich über die Applet-Klasse ein AudioClip geben zu lassen oder mit Klassen aus dem Paket javax.sound zu arbeiten.
9.7.1 Die Arbeit mit AudioClip 

Die Applet-Klasse verfügt über zwei Objektmethoden getAudioClip() und über eine statische Methode newAudioClip(), die alle eine Audio-Datei als AudioClip-Objekt liefern. Die Quelle ist als URL angegeben. Mit der statischen Funktion newAudioClip() lässt sich ein AudioClip-Objekt auch außerhalb von Applets erzeugen, sodass sich die Methode für normale Applikationen anbietet. Die play()-Methode auf dem AudioClip spielt das Stück ab.
File f = new File( "uups.wav" ); AudioClip sound = Applet.newAudioClip( f.toURL() ); sound.play(); Thread.sleep( 100000 ); |
class java.applet.Applet
extends Panel |
- AudioClip getAudioClip( URL url ) Liefert ein AudioClip-Objekt, das durch die URL angegeben ist.
- AudioClip getAudioClip( URL url, String name ) Aufruf von getAudioClip(new URL(url, name)).
- static AudioClip newAudioClip( URL url ) Liefert ein AudioClip-Objekt, das durch die URL angegeben ist.
9.7.2 Java Sound API 

Die Sound-Engine kann seit Java 2 Dateien im Format AIFF, AU und WAV abspielen. Ebenso ist ein MIDI-Renderer enthalten, der die Dateiformate TYPE 0 MIDI, TYPE 1 MIDI und RMF unterstützt. Dieser erzeugt softwaremäßig mit einem Wave-RAM General Midi. Die Sound-Maschine kann 8- oder 16-Bit-Audio-Daten rendern, entweder mono oder stereo. Dabei werden Sampling-Raten von 8 bis zu 48 KHz unterstützt.
Im Allgemeinen funktioniert das Abspielen auf Anhieb. Die Java Sound API nutzt für die Instrumente das Angebot des Betriebssystems, doch lassen sich von Sun unter http://java.sun.com/products/java-media/sound/soundbanks.html einheitliche Instrumentendateien, so genannte Soundbanks, laden. Unter C:\Programme\Java\jre1.6.0\lib\audio – das Verzeichnis gilt für die Standardinstallation unter C:\Programme – findet sich schon die kleinste Soundbank soundbank.gm. In das Verzeichnis lässt sich auch die Deluxe-Version soundbank-deluxe.gm mit über 5 MB entpacken, die Instrumente höchster Qualität bietet.
Die Sound-API im Paket javax.sound erlaubt Erweiterungen um eigene Audio-Spieler. So gibt es einen Winamp-ähnlichen MP3-Spieler namens jlGui (http://www.javazoom.net/jlgui/jlgui.html), dem der Unterschied zu einem nativen Player nicht anzumerken ist. [Er lässt sich per Webstart sofort ausprobieren: http://www.javazoom.net/jlgui/jws/jlgui_jnlp.jsp. Unter http://www.javazoom.net/jlgui/jnlp_configurator.jsp lassen sich einige Parameter einstellen und dann gleich ausprobieren. Cool! ] Er unterstützt Drag & Drop, Webstart, M3U, WinAmp Skins, OGG Vobis und vieles mehr. jlGui nutzt hierfür einen eigenen AudioLayer (http://javalayer.sourceforge.net/) zum Abspielen von MP3-Dateien. Die zusätzliche Bibliothek basiert auf der Möglichkeit, eigene SPIs einzuhängen.
MIDI-Dateien abspielen
Die Klassen zum Abspielen von MIDI-Dateien liegen unter javax.sound.midi. Die MIDI-Daten abspielende Hardware (oder Software) heißt Sequencer. Um an die Sequencer-Instanz zu kommen, wird die Fabrikmethode MidiSystem.getSequencer() bemüht. Anschließend muss die Abspieleinheit initialisiert werden – das geschieht mit open().
Sequencer sequencer = MidiSystem.getSequencer(); sequencer.open();
Der nächste Schritt besteht darin, die Musik-Informationen bereitzustellen und dem Sequencer zu übergeben. Diese Daten liegen als Sequence-Objekte vor. Sie lassen sich mit MidiSystem.getSequence() vorbereiten. Die getSequence()-Funktion erlaubt als Parameter File-, InputStream- und URL-Objekte.
InputStream midiFile = MidiDemo.class.getResourceAsStream( "media/beginn.mid" ); sequencer.setSequence( MidiSystem.getSequence(midiFile) ); sequencer.start(); sequencer.stop();
Nun könnten Sie den Sequencer mit start() zur Arbeit bewegen und mit stop() das Abspielen beenden. Bei start() wird automatisch ein Hintergrundprozess gestartet, sodass das Abspielen auch dann fortfährt, wenn die main()-Funktion und der main-Thread schon beendet sind:
Bemerkung Die Entwicklung der Java Sound API steht still. Zuletzt arbeitete nur ein Entwickler am Projekt (siehe dazu auch http://weblogs.java.net/blog/jonathansimon/archive/2003/06/whats_up_with_t.html), nun ist auch dieser gegangen. So wie auch die Java Sound API auf Eis gelegt ist, ist auch das Java Media Framework (JMF) erst einmal gestorben und wir können die Annotation @Tot an das Projekt setzen. Sun wollte das JMF zum Abspielen von Multimedia-Dateien etablieren, doch wird es schon lange nicht mehr weiterentwickelt, und in der letzten Änderung Ende 2004 ist lediglich MP3 hinzugekommen. Es gibt Ansätze wie FMJ (Freedom for Media in Java), die darin bestehen, das Java Media Framework auf der Basis von jffmpeg frei nachzuimplementieren, doch offiziell unterstützt Sun das nicht. Das neueste Schlagwort ist Java Media Components (JMC), eine Video-API, doch mache ich mir keine großen Hoffnungen. |