# Wiedergabe von wav-Datei aus jar fehlerhaft



## la_luna_llena (4. Jan 2015)

Hallo,

ich habe ein Problem mit der Wiedergabe von wav Dateien. Seit Tagen ärgere ich mich damit rum, jetzt frag ich halt doch mal nach.

Also ich habe eine wav-Datei, die soll beim Klick auf einen Button abgespielt werden. Die Datei soll später mit in die jar-Datei exportiert werden und von dort abgespielt werden...

Das normale wav Abspielen habe ich (denke ich hingekriegt) und ich binde das auch als URL ein, damit der Pfad relativ sein kann.

Hier mal kurz mein Code:

```
private void playPressed() {
   try{
      URL url = getClass().getResource("/resources/test.wav");
      AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(url);
      System.out.println(url);
      AudioFormat af     = audioInputStream.getFormat();
      int size      = (int) (af.getFrameSize() * audioInputStream.getFrameLength());
      byte[] audio       = new byte[size];
      DataLine.Info info      = new DataLine.Info(Clip.class, af, size);
      audioInputStream.read(audio, 0, size);
           
      Clip clip = (Clip) AudioSystem.getLine(info);
      clip.open(af, audio, 0, size);
      clip.start();
                
      while (true) {
         try {
            System.out.println("läuft");
            Thread.sleep(100);
         } catch (Exception e) {}
         if (!clip.isRunning()) {
            clip.close();
            break;
         }
      }
}catch(Exception e){ e.printStackTrace(); }
```

Diese while-Schleife am Ende brauche ich, weil ich dem User manche Optionen erst bereitstellen will wenn der Sound zuende abgespielt wurde. 

Folgendes passiert wenn ich jetzt diesen Button klicke: Ich höre ein kurzes knacken und dann ist Stille. Die "läuft"-Ausgabe aus der while-Schleife geht aber noch weiter, das heißt es wird wohl etwas abgespielt aber man hört halt nix. Eine Exception wird auch nicht geworfen. Die URL müsste auch stimmen, also der Pfad stimmt, und ich denke dieses Ausrufezeichen stimmt auch oder?:
jar:file:/home/Programm.jar!/resources/test.wav

Achso und wenn ich das Ganze nicht mit relativen Pfaden mache (also nicht aus der jar-Datei) dann funktioniert die Wiedergabe einwandfrei... aber ich wills eben in der jar-Datei haben....

Woran könnte das liegen, dass ich den Sound nur ganz kurz höre und danach nichts mehr obwohl es offenbar weiterläuft? Es scheint ja sonst alles zu laufen... Ich hab auch schon Google und alle möglichen Foren beschäftigt und niemand hat dasselbe Problem... Kann mir jemand weiterhelfen?

Danke schon einmal 

la_luna_llena


----------



## Gucky (6. Jan 2015)

Dateien in einem JAR sind ZIP Komprimiert, weshalb du mit getClass().getRessourceAsStream(PFAD) zuerst einen InputStream organisieren musst, der ZIP komprimierte Ordner lesen kann.


----------



## la_luna_llena (7. Jan 2015)

Das scheint der entscheidende Tipp zu sein. Vielen vielen Dank 

Ich musste dann auch noch einen BufferedInputStream zwischenschalten, sonst hätte ich die Exception "mark/reset not supported" bekommen.  Das wiederum habe ich (der Vollständigkeit wegen ) hier gefunden:
audio - java.io.IOException: mark/reset not supported - Stack Overflow

Jetzt sieht der Code so aus und tut brav was er soll:


```
private void playPressed() {
		try{

			InputStream audioSrc = getClass().getResourceAsStream("resources/test.wav");
			InputStream bufferedIn = new BufferedInputStream(audioSrc);
			AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(bufferedIn);

            AudioFormat af     = audioInputStream.getFormat();
            int size      = (int) (af.getFrameSize() * audioInputStream.getFrameLength());
            byte[] audio       = new byte[size];
            DataLine.Info info      = new DataLine.Info(Clip.class, af, size);
            audioInputStream.read(audio, 0, size);
           
            Clip clip = (Clip) AudioSystem.getLine(info);
            clip.open(af, audio, 0, size);
            clip.start();
                
            while (true) {
            	try {
            		Thread.sleep(100);
            	} catch (Exception e) {}
            	if (!clip.isRunning()) {
            		clip.close();
            		break;
            	}
            }
                
                
        }catch(Exception e){ e.printStackTrace(); }
```

Endlich zuende geärgert. Danke


----------

