# wav datei aus jar Abspielen



## Anton2k (6. Apr 2010)

Hallo, wieder so ein Problem was mir überhaupt nicht einleuchtet.

Ich möchte ein kurzes Ding im Programm abspielen bei bestimmten Handlungen. Klappt auch mit dem gleich folgenden Code solange ich das ganze noch normal auf der Festplatte in der Ordner struktur habe. Aber sobald ich das ganze als Jar packe und der Sound abgespielt werden sollte hört man gar nichts, es wird aber auch keine Exception ausgelöst. Wenn ich mir den Pfad ausgeben lasse mit dem er Arbeitet ist die Datei im Jar auch richtig adressiert aber es kommt eben leider kein ton.

Diesen Code hab ich jetzt verwendet.


```
AudioInputStream audioInputStream;
			try {

			  audioInputStream = AudioSystem.getAudioInputStream(getClass().getClassLoader().getResourceAsStream("Sounds/Bleep.wav"));
			  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();

			} catch (UnsupportedAudioFileException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			} catch (LineUnavailableException e) {
				e.printStackTrace();
			}
```


----------



## Anton2k (7. Apr 2010)

Scheint ja nicht so trivial oder bekannt zu sein das Problem. Hab es versucht mit viel Google suchen einzugrenzen leider ohne erfolg. Etwas rumprobieren und ausgeben lassen der Variablen inhalte ergab allerdings das der Fehler vermutlich in dieser Zeile liegt

```
audioInputStream.read(audio, 0, size);
```
Aus dem Jar ist der inhalt des audio[] danach 00000..... Anstelle davon das es sinnvolle daten enthält. 
Aber wie gesagt nur wenn man es als Jar ausführt und er den Sound aus der jar laden soll.


----------



## Steev (7. Apr 2010)

Hmm. Das Problem ist, dass man bei so einem Problem nicht vernünftig helfen kann...
Wenn du vieleicht ein KSKB posten könntest, und derselbe Fehler bei mir auch käme, dann könnte man besser helfen.
So ist währe das bestenfalls nur raten...


----------



## agentone (8. Apr 2010)

```
Toolkit.getDefaultToolkit().beep()
```



			
				API hat gesagt.:
			
		

> Emits an audio beep.


siehe Toolkit (Java Platform SE 6)


----------



## Anton2k (8. Apr 2010)

Hab das ganze mal als KSKB verpackt hier hochgeladen:
Gepacketes Eclipse Projekt

Alternativ hier nur der Quellcode:

```
import java.io.IOException;

import javax.sound.sampled.*;



public class Start {

	public void macheTon (){

		try {

		 AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(getClass().getClassLoader().getResourceAsStream("Sounds/Bleep.wav"));
		 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);
		  
		 System.out.println("Größe: "+size);
		 System.out.println("Info: "+info);
		  
	     Clip clip = (Clip) AudioSystem.getLine(info);
	     clip.open(af, audio, 0, size);
	     clip.start();
	    
         Thread.currentThread().sleep(400);
	    
		} catch (UnsupportedAudioFileException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (LineUnavailableException e) {
			e.printStackTrace();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}

	}
	
	public static void main(String[] args) {
		new Start().macheTon();
	}
}
```

Die Soundfile falls es interessant sein sollte gibt es hier:
Sound Effects Beeping Clicks

Auch bei diesem mini Test Projekt klappt es solange es einzeln auf der Festplatte liegt. Sobald es in ein Jar verpackt wir kommt kein ton mehr.

Erweiternd könnte man natürlich noch das Array ausgeben lassen:

```
for (int i=0;i<size;i=i+1000){
			  	System.out.print(audio[i]);
			  }
```
Dann sieht man das beim normalen Start der inhalt mit Daten gefüllt ist vom Array und beim start als jar eben nur 0 enthält.

Der Tip mit dem Toolkit.getDefaultToolkit().beep(); funktioniert zwar auf jeden fall aber der normale system Standardton würde mich schnell nerven.


----------



## Anton2k (8. Apr 2010)

Nach noch weiterem herum suchen hab ich einen Code schnipsel gefunden der mir weiter geholfen hat und das ganze kommt noch dazu ein gutes Stück simpler daher.


```
URL url = this.getClass().getClassLoader().getResource("Sounds/Bleep.wav");
      AudioInputStream audioIn = AudioSystem.getAudioInputStream(url);
      // Get a sound clip resource.
      Clip clip = AudioSystem.getClip();
      // Open audio clip and load samples from the audio input stream.
      clip.open(audioIn);
      clip.start();
```

Damit wird es richtig abgespielt egal ob in Jar oder direkt ausgeführt. Vermute es hatte mit der Adressierung der Sound Datei zu tun das er sie in der Jar nicht richtig gefunden hat. Warum ich keine Exception bekommen habe und er anscheinent aus dem nichts 0000.... gelesen hat verstehe ich allerdings nicht.


----------



## Steev (8. Apr 2010)

Guck doch einfach mal mit der VirtualVM was intern passiert. Ich bin mir ziemlich sicher, dass entweder irgendwo eine Exception geworfen, aber nicht weitergegeben wird, oder dass zwar die Datei gefunden wird, aber so nicht mehr abgespielt werden kann.

Keine Ahnung, die Sound-API von Java wirft manchmal Fragen auf...
Ich hatte mal einen Sound, der hat unter der alten JDK wunderbar funktioniert. Dann habe ich die JDK geupdatet und derselbe Code hat einen Fehler geworfen. - Mit der nächsten JDK ging es wieder....


----------



## WurstMitBrot (20. Aug 2010)

Hi Leute,

ich habe das gleiche Problem und dann einfach mal den Lösungsansatz von Anton2k ausprobiert.
Wenn ich das Programm nun mit der jar Datei starte ist du url = null.
Weiss jemand woran das liegen könnte?

mfg WurstMitBrot


----------

