9.5Audiodateien
Audiodateien lassen sich in Java mit Bordmitteln wiedergeben, aber zum Erstellen und Modifizieren von Sound-Dateien und zur Untersuchung von Metadaten sind Extrabibliotheken notwendig.
Für die Audiowiedergabe in Java gibt es drei Möglichkeiten: über die Applet-Klasse, mit Klassen aus dem Paket javax.sound oder seit Java 8 über JavaFX.
9.5.1Die Arbeit mit Applets AudioClip
Die Applet-Klasse verfügt über zwei überladene Objektmethoden getAudioClip(…) und über eine statische Methode newAudioClip(…), die alle eine Audiodatei 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.
[zB]Beispiel
Spiele die Datei uups.wav in einer Applikation ab:
Listing 9.8com/tutego/insel/sound/AudioClipDemo.java, main()
AudioClip sound = Applet.newAudioClip( path.toUri().toURL() );
sound.play();
Thread.sleep( 100000 );
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.5.2AudioClip von JavaFX
JavaFX verfügt im Paket javafx.scene.media ebenfalls über eine AudioClip-Klasse, die genauso einfach zu nutzen ist wie die aus dem Applet-Paket. Auch mp3-Daten lassen sich abspielen.
[zB]Beispiel
Spiele die über eine URL gegebene Sound-Datei ab:
sound.play();
9.5.3MIDI-Dateien abspielen
Die Sound-Engine seit Java-Urtagen 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-Audiodaten 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, so genannte Soundbanks, nachinstalliert werden. Dazu stellt die Seite http://www.oracle.com/technetwork/java/soundbanks-135798.html Soundbanks in drei Qualitätsstufen zur Verfügung. Die Soundbank-Datei wird dann in das Verzeichnis jre8\lib\audio gesetzt.
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 9.9com/tutego/insel/sound/MidiDemo.java, main()
InputStream midiFile = ClassLoader.getSystemResourceAsStream( "media/beginn.mid" ) ) {
sequencer.open();
sequencer.setSequence( MidiSystem.getSequence( midiFile ) );
sequencer.start();
System.out.println( "Return beendet das Abspielen" );
System.in.read();
sequencer.stop();
}
System.exit( 0 );
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(String[])-Methode und der main-Thread schon beendet sind.
static Sequencer getSequencer()
Liefert den Standard-Sequencer vom System, also die Standard-Abspieleinheit, die MIDI-Sequenzen abspielt.
extends MidiDevice
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 es nicht 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 noch ein Entwickler am Projekt, der ging aber auch irgendwann. So wie die Java Sound API auf Eis gelegt ist, ist auch das Java Media Framework (JMF) erst einmal gestorben. 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. Für die Medienwiedergabe wird sich wohl JavaFX etablieren, aber damit stehen immer noch nicht alle Codecs zur Verfügung.
9.5.4ID-Tags aus mp3-Dateien
mp3-Dateien enthalten neben den komprimierten Musikinformationen zusätzliche Infos, wobei dies kein Teil des offiziellen mp3-Standards ist. Diese Metadaten sind in ID3-Tags abgelegt. Sie beschreiben zum Beispiel den Künstler, den Titel des Liedes, den Namen des Albums oder das Erscheinungsjahr, und ein Genre-Feld schreibt dem Lied eine Stilrichtung zu. Ein mp3-Player wertet diese Tags aus und zeigt sie an.
Seit der ersten Version der Tags hat die Datenstruktur in ihrer Komplexität erheblich zugenommen, da zusätzliche Informationen interessant sind; dies führte zur erweiterten Definition der Tags. Die Möglichkeit, eine variable Anzahl von Tags mittels Frames einzusetzen (ähnlich ist die Verkettung in IPv6), erlaubt eine präzise Einordnung des Songs mit Angaben über Songtexter, das produzierende Label, Handel und Weiteres. Mehr als 70 Frame-Typen sind dokumentiert.
Tags lesen und schreiben
Zum Lesen und Schreiben von ID3-Tags bringt Java standardmäßig keine Unterstützung mit. Doch gibt es im Bereich quelloffener Software einige externe Bibliotheken, darunter http://sourceforge.net/projects/jd3lib. Damit lassen sich die Tags auslesen; und da die Metadaten nicht immer sinnvoll gefüllt sind, lassen sie sich von Java auch neu beschreiben.