Wave Datei mit Java abspielen

flofank

Grünschnabel
Hi Leute

Für ein kleines Programm das ich zur Zeit zu programmieren versuche habe ich mir folgende SoundMachine-Klasse geschrieben (mit Hilfe einiger Threads aus dem Forum hier). Diese Klasse soll bei aufruf der Methode play() die Datei "alarm.wav" abspielen.

Java:
import java.io.File;

import javax.sound.sampled.*;

public class SoundMachine {
	private Clip clip;
	
	public static void main(String[] args) {
		SoundMachine sound = new SoundMachine();
		System.out.println("initialized");
		sound.play();
		System.out.println("finished");
	}
	
	public SoundMachine() {
		try {
			//AudioInputStream ais = AudioSystem.getAudioInputStream(getClass().getResource("alarm.wav"));
			//AudioInputStream ais = AudioSystem.getAudioInputStream(new File("C:\\windows\\media\\chimes.wav"));
			AudioInputStream ais = AudioSystem.getAudioInputStream(new File("C:\\alarm.wav"));
			AudioFormat format = ais.getFormat();
			DataLine.Info info = new DataLine.Info(Clip.class, format, ((int) ais.getFrameLength() * format.getFrameSize()));
			clip = (Clip) AudioSystem.getLine(info);
			clip.open(ais);
			
			FloatControl gainControl = (FloatControl) clip.getControl(FloatControl.Type.MASTER_GAIN);
			gainControl.setValue(1.0F);
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}
	
	public void play() {
		clip.start();
		clip.loop(-1);
	}
	
	public void stop() {
		clip.stop();
	}
}

Nun habe ich das Problem, dass ich immer die folgende Fehlermeldung bekomme. Wenn ich es mit der Windows Sounds aus C:\windows\media versuche (Zeile 18), kriege ich keine Fehlermeldung aber auch keinen Sound.

javax.sound.sampled.UnsupportedAudioFileException: could not get audio input stream from input file
at javax.sound.sampled.AudioSystem.getAudioInputStream(AudioSystem.java:1170)
at SoundMachine.<init>(SoundMachine.java:19)
at SoundMachine.main(SoundMachine.java:9)
Exception in thread "main" java.lang.NullPointerException
at SoundMachine.play(SoundMachine.java:34)
at SoundMachine.main(SoundMachine.java:11)
initialized

Wär froh über euere Hilfe, denn ich komm zur Zeit einfach nicht auf einen grünen Zweig.

Grüsse
Flo
 
Da ist dann wohl was mit der Datei nicht in Ordnung ...

Da ansonsten keine Software auf meinem PC Probleme mit dieser Datei hat befürchte ich, dass wohl Java ein Problem mit irgendwas an meiner Datei hat. Nur habe ich keine Ahnung was das sein könnte.

Hinzu kommt noch der Effekt, dass das Programm mit den Win-Sounds zwar keine Problem hat, sie aber trotzdem nicht abspielt.
 
Zuletzt bearbeitet:
Ich habe den Java-Code verwendet, um eine Windows Datei namens Ding.wav abzuspielen. Die JVM hat keine Fehler gemeldet, ich konnte aber nichts hören.

Im folgenden Link findest Du den nötigen lauffähigen Java-Code (nicht von mir): http://www.anyexample.com/programming/java/java_play_wav_sound_file.xml

Vielen Dank für die Rückmeldung. Über den Code im Link bin ich auch bereits einmal gestolpert, hab ihn aber liegen lassen, da ich ungern Zeug in meinen Programmen habe von dem ich nicht weis was es macht. Ich werd ihn gleich mal testen und mich gegebenenfalls genauer einarbeiten.
 
So - Hab mir den Link jetzt mal genauer angeschaut und dabei folgende Lösung für mein Problem erhalten. Die ursprüngliche Datei funktioniert immer noch nicht aber mit Win-Sounds komme ich jetzt zu recht.

Java:
import java.io.File;
import javax.sound.sampled.*;


public class SoundMachine extends Thread{	
	private File sf;
	private final int EXTERNAL_BUFFER_SIZE = 524288;
	private SourceDataLine line = null;
	private AudioInputStream ais = null;
			 
	public SoundMachine(String path) {
		try {
			sf = new File(path);
		} catch (Exception e) {
			System.out.println("No Wave file found at :" + path);
		}
		init();
	}
	
	public void init() {
		long now = System.currentTimeMillis();
		if (!sf.exists()) {
			System.out.println("Wave file not found: " + sf.getName());
			return;
		}
		
		try {
			ais = AudioSystem.getAudioInputStream(sf);
		} catch (Exception e) {
			e.printStackTrace();
			return;
		}
		
		AudioFormat format = ais.getFormat();
		DataLine.Info info = new DataLine.Info(SourceDataLine.class, format);
		
		try {
			line = (SourceDataLine) AudioSystem.getLine(info);
			line.open(format);
		} catch (Exception e) {
			e.printStackTrace();
			return;
		}
		FloatControl gain = (FloatControl) line.getControl(FloatControl.Type.MASTER_GAIN);
		gain.setValue(gain.getMaximum());
	}
	
	@Override
	public void run() {
		line.start();
		int nBytesRead = 0;
		byte[] abData = new byte[EXTERNAL_BUFFER_SIZE];
		try {
			while(nBytesRead != -1) {
				nBytesRead = ais.read(abData, 0, abData.length);
				if (nBytesRead >= 0) {
					line.write(abData,  0, nBytesRead);
				} 
			}
		} catch (Exception e) {
			e.printStackTrace();
			return;
		} finally {
			line.drain();
			line.close();
		}
	}
}

Hatte dann aber das Problem, dass ich meinen (sehr kurzen) Alarmsound mit dieser Klasse nicht vernünftig Loopen konnte (Ladezeiten zwischen loops). Deshalb machte ich mich noch einmal auf die Suche mit Google und landete wieder bei den Clips.
Hier jetzt meine finale Lösung:

Java:
import java.io.File;

import javax.sound.sampled.*;


public class SoundMachine3 {
	Clip clip;
	
	public SoundMachine3(String path) {
		try {
			AudioInputStream ais = AudioSystem.getAudioInputStream(new File(path));
			clip = AudioSystem.getClip();
			clip.open(ais);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public void start() {
		clip.loop(10);
	}
}

Achja - Falls jemand noch ne Idee hat wieso meine Wav-Datei nicht funktioniert freue ich mich über jeden Hinweis.

Gruss
Flo
 
nicht unterstütztes Format !

Die Java Sound API kann nun mal nur mit sehr wenigen Formaten umgehen. Im groben sind das WAV , SND und AU. Und da WAV nicht gleich WAV ist gibt auch innerhalb eines Format-Containers *WAV* mehrere Formate *mono/stereo/multi-Channel , 8Bit/16Bit , Abtastraten , etc* ... und davon kann Java nun mal nur sehr wenig und ganz bestimmte. Und wenn deine WAV da nicht reinpasst dann kann Java damit auch nichts anfangen.

Wenn du wirklich ALLE Container mit allen Formaten abspielen willst brauchst du eine Lib die das auch kann ... mit Java selbst ist das nur sehr beschränkt möglich.
 
Zurück