# Wav Datei abspielen



## mr.mvp (19. Sep 2011)

Hallo zusammen,
ich versuche verzweifelt eine Wav-Datei aus meiner Java-Applikation heraus abzuspielen. Ich habe bereits sämliche Code-Beispiele, die ich im Netz gefunden habe ausprobiert und komme leider immer wieder zu gleichen Fehlermeldung: 
"No line matching interface SourceDataLine supporting format ULAW 44100.0 Hz, 8 bit, stereo, 2 bytes/frame,  is supported."

Je nach Datei können sich die Parameter (SamplingRate, bit-Breite, mono/stereo etc.) ändern.

Hier poste ich mal meine aktuelle Version und die genaue Ausgabe der Exception:

```
try 
        {
            File soundFile = new File( "C:\\temp\\test.wav" );
            ais = AudioSystem.getAudioInputStream( soundFile );
            AudioFormat format = ais.getFormat();
            SourceDataLine line = null;
            DataLine.Info info = new DataLine.Info(SourceDataLine.class, format);
            line = (SourceDataLine) AudioSystem.getLine(info);
            line.open(format);
            line.start();
        }
        catch (LineUnavailableException ex)
        {
            Exceptions.printStackTrace( ex );
        }
        catch (UnsupportedAudioFileException ex)
        {
            Exceptions.printStackTrace( ex );
        }
        catch (IOException ex)
        {
            Exceptions.printStackTrace( ex );
        }
        finally
        {
            try
            {
                ais.close();
            }
            catch (IOException ex)
            {
                Exceptions.printStackTrace( ex );
            }
        }
```

An der Stelle AusioSystem.getLine(info) steigt er mit folgender Meldung aus:
java.lang.IllegalArgumentException: No line matching interface SourceDataLine supporting format ALAW 7812.0 Hz, 8 bit, mono, 1 bytes/frame,  is supported.
        at javax.sound.sampled.AudioSystem.getLine(AudioSystem.java:459)

Ich hoffe es kann mir hier jemand weiter helfen.
Grüße
mvp


----------



## c_sidi90 (19. Sep 2011)

Probier mal so:


```
AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(new File("pfadzu deiner Datei"));
		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();
```


----------



## mr.mvp (19. Sep 2011)

Leider nein,
diesmal mit dieser Meldung:

java.lang.IllegalArgumentException: No line matching interface Clip supporting format ALAW 7812.0 Hz, 8 bit, mono, 1 bytes/frame, , and buffers of 38125 to 38125 bytes is supported.
        at javax.sound.sampled.AudioSystem.getLine(AudioSystem.java:459)

Danke trotzdem,
mvp


----------



## c_sidi90 (19. Sep 2011)

Wie groß ist deine Wav datei? Zeig mal die Properties

Wenn die Datei >=2 mb ist, solltest du SourceDataLine verwenden siehe auch
Playing Back Audio (The Java™ Tutorials > Sound)


----------



## maki (19. Sep 2011)

Kann der Rechner denn PCM Audiodateien abspielen, zB. diese Datei im Mediaplayer/VLC?


----------



## mr.mvp (19. Sep 2011)

Die Datei ist nur 38169 Bytes groß. Properties sind keine Vorhanden. 
Mit einer anderen Wav-Datei mit den Eigenschaften:

Bitrate 705 kBit/s
Abtastgröße 8 biit
Kanäle 2(Stereo)
Abtastrate 44kHz
Audioformat CCITT u-Law

erhalte ich diese Exception:

java.lang.IllegalArgumentException: No line matching interface Clip supporting format ULAW 44100.0 Hz, 8 bit, stereo, 2 bytes/frame, , and buffers of 6391296 to 6391296 bytes is supported.
        at javax.sound.sampled.AudioSystem.getLine(AudioSystem.java:459)


----------



## mr.mvp (19. Sep 2011)

Das Abspielen mit anderen Playern macht keine Probleme.


----------



## Spacerat (19. Sep 2011)

Also das standard Sound-API von Java kann zwar A- und U-LAW lesen jedoch nicht ausgeben. Diese Formate müssen in ein entsprechendes PCM-Format umgewandelt werden. Lt. Guido Krüger:
	
	
	
	





```
AudioInputStream ais = AudioSystem.getAudioInputStream(
       new File(name)
     );
     AudioFormat format = ais.getFormat();
     //ALAW/ULAW samples in PCM konvertieren
     if ((format.getEncoding() == AudioFormat.Encoding.ULAW) ||
         (format.getEncoding() == AudioFormat.Encoding.ALAW))
     {
       AudioFormat tmp = new AudioFormat(
         AudioFormat.Encoding.PCM_SIGNED,
         format.getSampleRate(),
         format.getSampleSizeInBits() * 2,
         format.getChannels(),
         format.getFrameSize() * 2,
         format.getFrameRate(),
         true
       );
       ais = AudioSystem.getAudioInputStream(tmp, ais);
       format = tmp;
     }
```


----------



## mr.mvp (19. Sep 2011)

Halle Spacerat,
das hat geholfen. Endlich, jetzt geht's! 

Vielen Dank an alle,
markus


----------



## RungetSvohu (13. Sep 2012)

c_sidi90 hat gesagt.:


> Probier mal so:
> 
> 
> ```
> ...



Hallo Leute, ich habe diesen Thread hier entdeckt, da ich mir eine ähnliche Frage gestellt habe. Ich will, wenn der User auf eine bestimmte Stelle klickt, neben der Aktion, die dann ausgeführt wird, diese Aktion auch mit einem Sound untermalen, der geht nur so ne Sekunde lang und liegt als Wav-Datei vor. Mit diesem Skript klappt die Sache auch recht gut, ich führe dieses Skript bis auf die letzte Zeile nur einmal am Anfang aus und dann mache ich, wann immer der Sound gebraucht wird:


```
if (clip.isRunning())
				clip.stop();
			clip.setFramePosition(0);
			clip.start();
```

Das klappt so in der Regel ganz gut. Selbst wenn der Sound schon wieder gebraucht wird, wenn der alte noch läuft, unterbricht er den alten Sound und fängt noch einmal von vorne an. Jedoch nicht immer und genau das ist das Problem. Manmach kommt zwar die Aktion aber ohne Sound, meist, wenn man den Sound etwas häufiger braucht, jedoch konnte ich keine echte Regel erkennen, wann das tatsächlich immer der Fall ist. Wisst ihr, woran das liegen könnte und wie man das Problem beheben kann?

Vielen Dank!

PS: Kann jemand das Thema wieder als offen markieren oder soll ich lieber ein neues anfangen?


----------



## jgh (13. Sep 2012)

neues Thema ist grundsätzlich besser (imho)

da du von "klicken" redest, spielt wohl eine GUI eine Rolle...evtl. solltest du das Abspielen des Sounds in einem Extra-Thread ausführen lassen, denn deiner Beschreibung nach hört sich das an, als ob das Abspielen des Sounds im EDT läuft, was solche Auswirkungen haben kann...


----------



## Spacerat (13. Sep 2012)

1. Versuch' mal, setFramePosition ohne das abspielen vorher anzuhalten und anschliessend wieder zu starten (vergiss' dabei die Abfrage ifNotRunning() nicht ). Anhalten und Starten braucht seine Zeit und ist synchronisiert. das bedeutet, der Sound könnte gleich nach dem Neustart sofort bei Position 0 wieder Angehalten werden, weil bereits ein anderer "Monitor" wartet.
2. Wenn das hier keiner mehr öffnet, fang' halt einen neuen Thread an, sofern das noch nötig ist.


----------



## RungetSvohu (13. Sep 2012)

jgh hat gesagt.:


> neues Thema ist grundsätzlich besser (imho)
> 
> da du von "klicken" redest, spielt wohl eine GUI eine Rolle...evtl. solltest du das Abspielen des Sounds in einem Extra-Thread ausführen lassen, denn deiner Beschreibung nach hört sich das an, als ob das Abspielen des Sounds im EDT läuft, was solche Auswirkungen haben kann...



Du hast Recht, dsa läuft alles in einem Thread. Meinst du, dass das dafür problematisch sein könnte? Denn auch wenn der Sound abgespielt wird, läuft alles andere noch während des Sounds prima weiter.



Spacerat hat gesagt.:


> 1. Versuch' mal, setFramePosition ohne das abspielen vorher anzuhalten und anschliessend wieder zu starten (vergiss' dabei die Abfrage ifNotRunning() nicht ). Anhalten und Starten braucht seine Zeit und ist synchronisiert. das bedeutet, der Sound könnte gleich nach dem Neustart sofort bei Position 0 wieder Angehalten werden, weil bereits ein anderer "Monitor" wartet.



Hier verstehe ich nicht so recht, was du meinst. Ich habe den Sound nun durch einen etwas längeren ersetzt (fast zwei Sekunden), hier passiert das Probem nun fast immer. Also fast immer wenn der alte Sound noch läuft, spielt er keinen neuen mehr ab. Läuft aber der alte nicht mehr, bekommt man einen neuen zu hören.


----------



## RungetSvohu (13. Sep 2012)

Also ich habe nun das Problem fast behoben:

```
clip.setFramePosition(0);
			if (!clip.isRunning())
				clip.start();
```

So klappt es nun viel besser. Also der Unterschied ist, dass ich clip.stop() einfach nicht mehr aufrufen. Jedoch gibt es hin und wieder (vielleicht alle 10 Mal) doch noch einen Aussetzer. Woran kann das liegen?

Edit: Hinweis: Wenn ich dann mal einen solchen Aussetzer habe, dann hört man, wie der aktuelle Sound abgebrochen wird (es gibt nur Aussetzer, wenn der vorherige Sound noch gerade läuft). Das heißt, irgendwie scheint er ihn zu stoppen (obwohl das gar nicht im Quellcode steht).


----------



## jgh (13. Sep 2012)

> Denn auch wenn der Sound abgespielt wird, läuft alles andere noch während des Sounds prima weiter.



bei einem  1 sek Sound wirst du auch imho kaum Probleme feststellen können, aber lass mal den Sound als 10 sek wav-Datei laufen, ob dir dann die GUI einfriert. Grundsätzlich sollte sowas aber imho in einem eigenen Thread passieren..


----------



## Spacerat (13. Sep 2012)

RungetSvohu hat gesagt.:


> Also ich habe nun das Problem fast behoben:
> 
> ```
> clip.setFramePosition(0);
> ...


Wie? Du verstehst nicht, was ich meine? Hint: Genau wie du es implementiert hast. 
Der Grund für die Aussetzer könnte aber immer noch derselbe sein. Man müsste irgendwie verhindern, dass ein abgespielter Clip nicht automatisch stoppt (das tut son Clip halt). Denn wenn er das tut, muss [c]start()[/c] darauf warten und das könnte der Grund für die Aussetzer sein.


----------



## RungetSvohu (14. Sep 2012)

Weiter geht es hier.


----------

