Wav Datei in .jar mit getResource() Fehler

Hallo!

Ich versuche mit Java eine .wav Datei abzuspielen.
Das funktioniert in Netbeans 6.5 wunderbar…
Wenn ich jedoch die jar datei öffne gehts knacks, dann hör ich ne halbe Sekunde das Lied und aus. Wenn ich die Applikation beende gehts wieder Knacks.
Das restliche Programm läuft ohne Probleme weiter (Es werden zB auch Bilder aus der jar geladen.)

das steht im jFrame-Konstruktor:

URL resourceURL = this.getClass().getResource("/audio/victoriousReign.wav");
new FuckingAudioPlayerThread(resourceURL).start();

und das hier ist mein AudioPlayer:

public class FuckingAudioPlayerThread extends Thread {

 URL audioFileURL;

 public FuckingAudioPlayerThread(URL audioFileURL) {
 this.audioFileURL = audioFileURL;
 }

 public void run(){
 try {
 AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(audioFileURL);
 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(clip.isActive()){}
 clip.stop();

 } catch (Exception e) {
 e.printStackTrace();
 }
 }

Also, wie schon gesagt, wenn ich das Ding in Netbeans starte gehts einwandfrei.
Ich hab die jar auch in der Konsole ausgeführt, da krieg ich auch nichts, weder Exceptions noch Fehlermeldungen.

Habs auch mit folgenden Ansätzen probiert:

-Inputstream statt URL (getRersourceAsStream())

-File statt URL; jedoch auch mit getRersource, dann URL zu File. Fragt mich bitte nicht wieso

-Dann hab ich die wav in alle Möglichen packages verschoben und umgeändert, dann hab ich ungefähr 2 stunden gegoogelt, und da dann nach einigen stunden rumprobieren noch immer das gleiche Problem da war stand ich kurz davor mir einen anzusaufen.

Bitte daher bei euch um Hilfe.
Liebste Grüße und Dank im voraus

Hallo!

Ich versuche mit Java eine .wav Datei abzuspielen.
Das funktioniert in Netbeans 6.5 wunderbar…
Wenn ich jedoch die jar datei öffne gehts knacks, dann hör ich
ne halbe Sekunde das Lied und aus. Wenn ich die Applikation
beende gehts wieder Knacks.

Habs grad mit deinem Beispielcode getestet und bei mir ist das genauso. Das liegt offensichtlich an dem darunter liegenden InputStream.

Ich habs so gemacht, dass ich mir von der URL erst mal mit audioFileURL.openStream() einen InputStream hole, über den ich dann mit AudioSystem.getAudioInputStream() dann einen AudiInputStream generiere.
Wenn ich das aus Eclpise/Netbeans raus mache, ist der InputStream vom Typ BufferedInputStream und darunter liegt ein FileInputStream. Wenn ich das JAR starte, dann erhalte ich einen InputStream vom Typ „sun.net.www.protocol.jar.JarURLConnection$JarURLInputStream“. Mit diesem höre ich nur ein Knacks wie von dir beschrieben.

Meine Lösung ist nun, dass ich den Stream nochmals puffere, in dem ich ihn mit einem BufferedInputStream umgebe. Dann knackst bei mir nichts mehr. Und das while(clip.isActive()) und clip.stop() musste ich rausnehmen, sonst spielt er bei mir gar nichts. Ich hab nur ein clip.start() und damit gehts bei mir.

Also mit folgendem Codebeispiel funktioniert es bei mir einwandfrei:

import java.io.BufferedInputStream;
import java.io.InputStream;
import java.net.URL;

import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.sound.sampled.DataLine;

public class FuckingAudioPlayerThread extends Thread {

 URL audioFileURL;

 public FuckingAudioPlayerThread(URL audioFileURL) {
 this.audioFileURL = audioFileURL;
 }

 public void run() {
 try {
 System.out.println("Playing: " + audioFileURL);

 InputStream inStream = audioFileURL.openStream();
 BufferedInputStream bufStream = new BufferedInputStream(inStream);
 System.out.println("InputStream Type: " + inStream.getClass().getName());
 System.out.println("BufferedInputStream Type: "
 + bufStream.getClass().getName());

 AudioInputStream audioInputStream = AudioSystem
 .getAudioInputStream(bufStream);
 AudioFormat af = audioInputStream.getFormat();
 System.out.println("AudioFormat: " + af);
 System.out.println("AudioFormatFrameSize: " + af.getFrameSize());
 System.out.println("AudioInpuStreamFrameLength: "
 + audioInputStream.getFrameLength());

 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();
 // Das musste ich auskommentieren, sonst spielt er bei mir gar nichts.
 // while (clip.isActive()) {
 // }
 // clip.stop();

 } catch (Exception e) {
 e.printStackTrace();
 }
 }
}

Ah ok vielen vielen dank!!
funktioniert super!
liebe grüße