8.5 Audio-Dateien
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.
8.5.1 Die Arbeit mit AudioClip
Die Applet-Klasse verfügt über zwei überladene 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 Methode 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.
Beispiel |
Spiele die Datei uups.wav in einer Applikation ab. File f = new File( "uups.wav" ); |
class java.applet.Applet |
- 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.
8.5.2 MIDI-Dateien abspielen
Die Sound-Engine kann 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.
Soundbanks
Unter Windows funktioniert das Abspielen von MIDI-Dateien auf Anhieb, da Java für die Wiedergabe die Instrumente des Betriebssystems nutzt. Für andere Betriebssysteme müssen Instrumentendateien, sogenannte Soundbanks, nachinstalliert werden. Dazu stellt die Seite http://java.sun.com/products/java-media/sound/soundbanks.html Soundbanks in drei Qualitätsstufen zur Verfügung. Die Soundback-Datei wird dann in das Verzeichnis jre7\lib\audio gesetzt.
Java Sound API
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.[64](Sie können das 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 Vorbis und vieles mehr. jlGui nutzt hierfür einen eigenen Audio-Layer (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 Hardware (oder Software), die MIDI-Daten abspielt, heißt Sequencer.
Listing 8.6: com/tutego/insel/sound/MidiDemo.java
Sequencer sequencer = MidiSystem.getSequencer();
sequencer.open();
InputStream midiFile = ClassLoader.getSystemResourceAsStream( "media/beginn.mid" );
sequencer.setSequence( MidiSystem.getSequence(midiFile) );
sequencer.start();
sequencer.stop();
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(). 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()-Methode erlaubt als Parameter File-, InputStream- und URL-Objekte. Nun lässt sich der Sequencer mit start() zur Arbeit bewegen; stop() beendet das Abspielen. start() startet automatisch einen Hintergrundprozess, sodass das Abspielen auch dann fortfährt, wenn die statische main()-Methode und der main-Thread schon beendet sind.
class javax.sound.midi.MidiSystem |
- static Sequencer getSequencer()
Liefert den Standard-Sequencer vom System, also die Standard-Abspieleinheit, die MIDI-Sequenzen abspielt.
interface javax.sound.midi.MidiSystem |
- void setSequence(InputStream stream) throws IOException, InvalidMidiDataException
Weist dem aktuellen MIDI-System eine MIDI-Datei zu. Der stream muss auf eine MIDI-Datei zeigen. Bei Zugriffsfehlern gibt es eine IOException, und ist das Datenformat fehlerhaft oder wird nicht es vom Java-MIDI-System unterstützt, folgt eine InvalidMidiDataException. - void start()
Startet die Wiedergabe. - void stop()
Stoppt die Wiedergabe. - boolean isRunning()
Liefert true, wenn die Wiedergabe mit start() gestartet wurde und noch läuft, also noch nicht mit stop() beendet wurde. Sonst false.
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 er gegangen. So wie 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 ursprünglich das JMF zum Abspielen von Multimedia-Dateien etablieren, doch wird es schon lange nicht mehr weiterentwickelt, und bei 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 Oracle das nicht. Offiziell ist von Oracle wohl nur JavaFX angedacht, aber damit stehen immer noch nicht alle Codecs zur Verfügung. |
Ihr Kommentar
Wie hat Ihnen das <openbook> gefallen? Wir freuen uns immer über Ihre freundlichen und kritischen Rückmeldungen.