Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Java - AG Audio - Ausgabe mit Java 3. Juli 2001 Frank Münster.

Ähnliche Präsentationen


Präsentation zum Thema: "Java - AG Audio - Ausgabe mit Java 3. Juli 2001 Frank Münster."—  Präsentation transkript:

1 Java - AG Audio - Ausgabe mit Java 3. Juli 2001 Frank Münster

2 Arten von Sound z„Sampled“ zMIDI Sampled: Audiodaten liegen in einer Sounddatei vorMIDI: Audiodaten liegen in Form bestimmter abrufbarer Klänge innerhalb der Hardware vor. ( MIDI - Musical Instrument Digital Interface )

3 Packages des Java-Sound API zjavax.sound.sampled zjavax.sound.midi zjavax.sound.sampled.spi zjavax.sound.midi.spi Wir beschäftigen uns mit dem „sampled“-Package. Die „ spi “-Packages („Service Provider Interface“) dienen der „Erweiterung“ von Java, z.B. zusätzliche Unterstützung von.mp3 Dateien, etc.

4 FileFormat / AudioFileFormat zUnterstützte FileFormats: zPCM  mu-law (  -law ) za-law z Unterstützte AudioFileFormats: z.wav z.au z.aiff z.rmf Der Unterschied zwischen FileFormat und AudioFileFormat: AudioFormat: Datenformat, Art des Sample, Art der Codierung AudioFileFormat: Dateiformat, die Art, wie die Daten in Dateiform gespeichert werden.

5 Das „Sampled“-Package zWichtige Klassen: zAudioSystem zAudioInputStream zAudioFormat zDataLine.Info z Wichtige Interfaces: z Line z Clip z SourceDataLine z Mixer z LineListener

6 Audio-Wiedergabe zInterface Clip zInterface SourceDataLine Geben wir Sound-Dateien als Clip wieder, so wird die komplette Datei vor dem Abspielen in den Speicher geladen. Wir haben die Möglichkeit des „loopens“, entweder den kompletten Sound oder Ausschnitte. void loop(int count); void setLoopPoints(int start, int end) Unter Verwendung einer SourceDataLine werden jeweils nur Stücke der Datei in einen Buffer geladen, diese werden dann abgespielt, währenddessen wird der Buffer erneut mit den darauf folgenden Daten beschrieben. Somit eignet sich die SouceDataLine besonders für große Dateien.

7 Interface Line Die zuvor beschriebenen Interfaces Clip und SourceDataLine sind vom Interface Line abgeleitet.

8 Abspielen einer Datei - Vorgehensweise z1. „File“-Objekt mit der gewünschten Dataei anlegen z2. „AudioInputStream“ anfordern z3. „AudioFormat“ des Sample überprüfen z4. Zum AudioFormat „passende“ Line anfordern z5. ggf. „LineListener“ hinzufügen z6. Line öffnen z7. Wiedergabe starten z8. ggf. Wiedergabe stoppen z9. Line schließen

9 File-Objekt anlegen import java.io.File; import java.io.IOException;... File audiodatei = new File(„e:\\beispiele\\beisp.wav“); // Verzeichnisse werden mit doppeltem // Backslash angegeben

10 AudioInputStream anfordern AudioInputStream audioinput = null; try { audioinput = AudioSystem.getAudioInputStream(Audiofile); } catch (Exception e) {... }

11 AudioFormat des Sample überprüfen... AudioFormat format = audioinput.getFormat(); System.out.println(format.toString() ); DataLine.Info info = new DataLine.Info(Clip.class, format); // DataLine.Info Objekt wird später zum // anfordern einer „passenden“ Line (hier vom // Typ „Clip“) benötigt.

12 „Passende“ Line anfordern... Clip line; try { line = (Clip) AudioSystem.getLine(info); // „info“ ist das zuvor angelegte DataLine.Info // Objekt. Java kann über dieses Objekt eine Line // mit den für das Sample benötigten Spezi- // fikationen anfordern) catch (Exception e) {...}

13 „LineListener“ hinzufügen try { line = (Clip) AudioSystem.getLine(info); line.addLineListener(this); } catch public void update(final javax.sound.sampled.LineEvent p1) { if (p1.getType().equals(LineEvent.Type.STOP)) {...}...}

14 Öffnen, starten etc. der Line try { line = (Clip) AudioSystem.getLine(info); line.open(audioinput); line.start(); // oder line.loop(n);... // evtl. line.stop(); } catch...

15 Line schließen... public void update(final javax.sound.sampled.LineEvent p1) { if (p1.getType().equals(LineEvent.Type.STOP)) { line.close(); }... } // Line muß unbedingt geschlossen werden!!! // Wird das Programm vor dem Schließen beendet, ist ein //Schließen der Line nicht mehr möglich, sie bleibt bis //zum Neustart des Rechners „reserviert“. // Mögl. Resultat: „Audio Device unavailable“

16 Line schließen (2) Von Line abgeleitete Objekte ( SourceDataLine, Clip, Mixer, Port, etc.) repräsentieren physische Einheiten innerhalb der Hardware (z.B. auf der Soundkarte). Daher ist die Erzeugung dieser Objekte hardwarebedingt, d.h. es können nicht beliebig viele dieser Objekte gleichzeitig existent sein. Schließen wir die Lines nach der Verwendung nicht, so kann diese Line für nichts Anderes mehr verwendet werden, da sie nicht „freigegeben“ wurde. Die nächste Anforderung muß also auf eine andere Line zurückgreifen. Gibt es keine andere Line mehr, wirft Java eine LineUnavailableException aus. Auch andere Anwendungen können in diesem Fall keine Sounds mehr abspielen und liefern Meldungen wie z.B: „Audio Device unavailable“.

17 Besonderheiten SourceDataLine zDaten werden Stück für Stück in einem Buffer gelesen und verarbeitet zBuffer wird in einer Schleife jeweils mit neuen Daten gefüllt zSchleife wird bei EndOfFile (Rückgabewert -1) unterbrochen (oder bei Benutzer-Stop) zLine wird geschlossen

18 SourceDataLine try { line = (SourceDataLine) AudioSystem.getLine(info); line open(format, int b); // b ist die Größe des Buffers in // Bytes, den die Line besitzen // soll. b kann auch weggelassen // werden, Java legt dann die Buffergröße // fest. int BUFFER_SIZE = line.getBufferSize(); int read = 0; byte[] data = new byte[BUFFER_SIZE]); int written;

19 SourceDataLine (2) while (read != -1) //read wird -1, wenn Dateiende erreicht { read = audioinput.read(data, 0, BUFFER_SIZE); // 0 (int offset) bedeutet, daß die // Datei beginnend bei Position 0 // (Dateianfang) gelesen werden // soll. if(read >= 0) { written = line.write(data, 0, read); } else break; } line.drain(); } // Ende von try{} catch... finally{line.close();}

20 Methoden AudioSystem.getAudioInputStream(file); // Liefert einen AudioInputStream, mit welchem die Daten aus der Sounddatei gelesen werden können. Audioinputstream.getFormat(); // Liefert ein AudioFormat - Objekt, welches Informationen über Das Format der in der Datei enthaltenen Audiodaten enthält. new DataLine.Info(Clip.class, audioformat); // Erzeugt ein DataLine.Info - Objekt anhand der AudioFormat- Informationen. Unter der Angabe der gewünschten Line (hier Clip) enthält das erzeugte Objekt speziellere Informationen als AudioFormat, welche zur Anforderung einer passenden „Line“ benötigt werden.

21 Methoden (2) DataLine.Info info.toString(); // Wandelt die im DataLine.Info Objekt enthaltenen Info‘s in einen String um, der dann angezeigt werden kann. Clip line =(Clip) AudioSystem.getLine(info); // Liefert eine den Spezifikationen des DataLine.Info Objektes entsprechende Line (hier vom Typ Clip). Der Aufruf dieser Methode muß innerhab von „try“ stehen, da möglicherweise keine entsprechende Line vorhanden ist; andernfalls wird es gar nicht erst von Java compiliert. line.open(); line.start(); line.loop(n); line.stop(); line.close(); // Verwendung selbsterklärend, loop(n) kann nur bei Lines vom Typ Clip verwendet werden, n ist die Anzahl der Wiederholungen

22 Methoden (3) line.addLineListener(this); // „heftet“ den LineListener (this, da er in diese Klasse implementiert ist, und Objekte dieser Klasse somit auch LineListener-Objekte sind) an die Line. In der „update“- Methode kann der LineListener dann auf „LineEvents“ reagieren (z.B. STOP-Event, CLOSE-Event, etc.) int read = audioinputstream.read(byte[] data, int offset, int Buffersize); // Das Array repräsentiert den Buffer, Offset die Startposition, Buffersize die Größe des Buffers, also die Größe des Arrays. Beginnend bei Offset werden Daten aus audioinputstream in den buffer gelesen, wobei die Methode jeweils die Anzahl der gelesenen Bytes zurückliefert (int read).

23 Methoden (4) int written = line.write(byte[] data, int Offset, int read); // Umgekehrt werden hier die zuvor in den Buffer gelesenen Daten in die Line „geschrieben“, damit eine Wiedergabe erfolgen kann. line.drain(); // Befinden sich noch Daten im Buffer, werden diese noch gelesen und verarbeitet (abgespielt), bis der Buffer leer ist. line.flush(); // Die restliche Daten werden „weggespült“, ohne daß sie weiter verarbeitet werden.

24 Literatur Leider läßt sich zur Zeit noch nicht allzuviel Literatur zu diesem Thema finden, möglicherweise auch weil das Java Sound-API erst seit Version 1.3 im JDK enthalten ist. Zuvor war Sound in Java nur bedingt möglich, und ohne größere Probleme nur in Applets. Zu empfehlen ist der Java Sound-API Programmer‘s Guide von Sun, welchen man sich unter als pdf (Adobe Acrobat) - Datei heruterladen kann. Diese Anleitung ist allerdings in HTML-Form auch in die API- Docs, welche im GIS-Labor zugänglich sind, integriert.


Herunterladen ppt "Java - AG Audio - Ausgabe mit Java 3. Juli 2001 Frank Münster."

Ähnliche Präsentationen


Google-Anzeigen