Java Sound Mark/Reset Exception

Apo

Bekanntes Mitglied
Hi,

ich entwickle in Eclipse und möchte meinem Spiel etwas Sound hinzufügen.
Ich lade die Sounddateien folgendermaßen:
Code:
AudioInputStream audioInputStream = null;
try {
	audioInputStream = AudioSystem.getAudioInputStream(this.getClass().getResourceAsStream(this.path));
} catch (Exception e) {
	System.out.println("Fehler: "+e.getMessage()+" "+this.path+" "+e.getCause());
}

Der Path ist ein Stringfile wie "/sound/test.wav".
In Eclipse funktioniert alles wunderbar und ich höre die Sounds. Wenn ich eine Jar Datei erstelle bekomme ich die Fehlermeldung
"mark/reset not supported". Die Sounddateien sind auch in der Jar mit drin. Ich bin etwas verwirrt.

Wie kann ich das umgehen bzw. könnt ihr mir helfen?
Danke!
 
Hi,

es sieht so aus, als ob der Fehler nicht in den Programmzeilen entsteht,
die Du gepostet hast.
Lass noch mal ein bisschen mehr sehen.
 
Naja doch es wird genau dort die Exception geworfen. Im Syso steht "Fehler: mark/reset not supported /sounds/test.wav null"
Aber das bringt ja nicht viel. Wollte nur zeigen, worauf es wahrscheinlich genau ankommt.

Ich kann euch aber gerne die komplette run-Methode geben.
Code:
	public void run() {
		try {
			while(this.soundThread.isRunning()) {
				do {
					AudioInputStream audioInputStream = null;
					try {
						audioInputStream = AudioSystem.getAudioInputStream(this.getClass().getResourceAsStream(this.path));
					} catch (Exception e) {
						System.out.println("Fehler: "+e.getMessage()+" "+this.path+" "+e.getCause());
					}

					AudioFormat audioFormat = audioInputStream.getFormat();
				
					SourceDataLine line = null;
					DataLine.Info info = new DataLine.Info(SourceDataLine.class,audioFormat);
					try {
						line = (SourceDataLine) AudioSystem.getLine(info);
						line.open(audioFormat);
					} catch (LineUnavailableException e) {
					} catch (Exception e) {
					}

					line.start();

					int nBytesRead = 0;
					byte[] abData = new byte[EXTERNAL_BUFFER_SIZE];
					while ((nBytesRead != -1) && (!this.isBStop())) {
						try {
							nBytesRead = audioInputStream.read(abData, 0, abData.length);
						} catch (IOException e) {
						}
						if (nBytesRead >= 0) {
							line.write(abData, 0, nBytesRead);
						}
					}
					line.drain();
					line.close();
				} while ((!this.isBStop()) && (this.isBLoop()));
				this.soundThread.stop();
			}
			try {
				synchronized(this.soundThread) {
					this.soundThread.wait((long)10);
				}
			} catch(InterruptedException e) {
				(this.soundThread).stop();
			}
		} catch (Exception ex) {
			
		}
	}
 
Das sieht danach aus das das wav nicht in dem Jar gefunden wird.

Ist es sicher mit eingepackt? Evtl ist der Pfad dahin auch falsch, sprich s wird woanders im Jar hingepackt.
 
Auch erstmal Danke. Aber die Sounddaten sind auf jeden Fall auch in der JAR. Wenn sie an der falschen Stelle wären, würde ich eine NullPointerException anstatt dem mark/reset not supported bekommen. Habe es gerade getestet. Ich habe sie nun mal auch aus einem File lesen lassen. Dann fkt das ganze.
Also ich habe einfach nur:
Code:
					AudioInputStream audioInputStream = null;
					try {
						if (this.BInJAR) {
							audioInputStream = AudioSystem.getAudioInputStream(AudioPlayer.class.getResourceAsStream(this.path));
						} else {
							if (ApoConstants.B_APPLET) {
								audioInputStream = AudioSystem.getAudioInputStream(new URL("http://www.apo-games.de/apoPongBeat" + this.path));
							} else {
								audioInputStream = AudioSystem.getAudioInputStream(new File(System.getProperty("user.dir") + this.path.replace("/", File.separator)));	
							}
						}
					} catch (Exception e) {
						System.out.println("Fehler: "+e.getMessage()+" "+this.path+" "+e.getCause());
					}

Das mit dem File fkt wunderbar. Bloss das Streamen per URl laggt doch leicht. Das ist suboptimal. Deshalb möchte ich es aus der JAR lesen lassen. Das muss doch funktionieren!!!

Ich habe auch mal die Jar Datei hochgeladen, wo die Sounddateien mit drin sind. Damit ihr mir auch glaubt. Click here

Kennt ihr nebenbei noch eine gute Site, wo ich 2 Oktoaven (wav Dateien) mit allen Noten fürs Piano herbekomme oder gibt es dafür ein Programm? Im Spiel soll man später einzelne Lieder nachspielen sollen.
 
Der Path ist ein Stringfile wie "/sound/test.wav".
Mich irritiert der Pfad - das hat wohl nur funktioniert weil das unter C:/sound lag

Versuchs doch mal mit "./sound/test.wav" - oder so ähnlich

Kann schon sein, dass ich total daneben liege, aber dann möchte ich eine Erklärung, warum es mit dem absoluten Pfad funktionieren soll?
 
Das funktioniert ja auch nur, weil ich es aus der Jar direkt hole. Meine Bilder hole ich auch immer so (und die kann er ja laden).
Wenn ich es extern laden lasse, muss ich ihm ja sagen, wo er es herholen soll. Das war aber nur zu Testzwecken. Das möchte ich gar nicht verwenden. So schwer kann das doch nicht sein. =(

Habe auch deine Variante versucht, dann bekomme ich aber die gesagt NullPointerException
 
Hallo,

Die Exception mark/reset not supported wird geworfen, wenn ein AudioStream nicht erlaubt Sprungmarken zu setzen.
Deswegen hatte ich vermutet, dass Du Sprungmarken verwendest.

Ich habe mir Deinen Code mal angesehen und mit meinem verglichen. Bis auf eine Sache konnte ich
nichts feststellen, aber vielleicht hilft es ja:

Java:
AudioInputStream in = AudioSystem.getAudioInputStream(AudioFormat.Encoding.PCM_SIGNED,AudioSystem.getAudioInputStream(soundToPlay));
heiß es bei mir.

Deine Zeile wäre dann:
Java:
audioInputStream = AudioSystem.getAudioInputStream(AudioFormat.Encoding.PCM_SIGNED, AudioSystem.getAudioInputStream(this.getClass().getResourceAsStream(this.path)));

Probiere es mal aus.
 
Vielen Dank für die Hilfe, aber leider hilft das auch nicht. =(

Ich habe es zu Testzwecken auch mal ausgelagert, aber es ändert nichts an der Meldung.
ACH MAN ...

€dit: Habe jetzt mal die Daten von wav in au verändert. Und immer noch der gleiche Fehler. Da kann doch irgendwas nicht stimmen ...
 
Zuletzt bearbeitet:
Eine Idee habe ich noch, lass mal testweise den synchronized Block weg:

Java:
try {
				synchronized(this.soundThread) {
					this.soundThread.wait((long)10);
				}
			} catch(InterruptedException e) {
				(this.soundThread).stop();
			}
 
Habe noch was gefunden:

MP3 Stream puffern vor abspielen wie die meisten Flash Player @ tutorials.de: Tutorials, Forum & Hilfe

ab post #6
Dummerweise bekomme ich aber folgende Fehlermeldung:
Code java:

Exception in thread "main" java.io.IOException: mark/reset not supported
at java.io.InputStream.reset(InputStream.java:331)
at org.tritonus.share.sampled.file.TAudioFileReader.getAudioFileFormat(TAudioFileReader.java:184)
at javax.sound.sampled.AudioSystem.getAudioFileFormat(AudioSystem.java:985)
at javazoom.jlgui.basicplayer.BasicPlayer.initAudioInputStream(Unknown Source)
at javazoom.jlgui.basicplayer.BasicPlayer.initAudioInputStream(Unknown Source)
at javazoom.jlgui.basicplayer.BasicPlayer.open(Unknown Source)
at Sandkasten.Testplayer.main(Testplayer.java:31)


Antwort:
hi

diesen fehler den du bekommst wenn du open mit einem inputstream öffen willst kommt von einem fehler in der org.tritonus.share library, wenn du das ganze mit einem file objekt öffnest dann kannst du das file abspielen. im falle den inputstreams wird in der library die reset methode aufgerufen und die wird in dem fall nicht supported
 
Erst einmal tausend Dank für deine Mühen, aber will leider auch mit auskommentierten Block nicht klappen.
Ich werde jetzt mal JLayer ausprobieren. Außer wenn natürlich noch jemand eine Idee hat.
 
Ey super danke! Werde sie gleich mitbenutzen für die Hintergrundmusik ...

aber ich habe es gerade hinbekommen ... der Tip mit dem Inputstream war Gold wert. Ich lade nun
Code:
audioInputStream = AudioSystem.getAudioInputStream(AudioFormat.Encoding.PCM_SIGNED, AudioSystem.getAudioInputStream(this.getClass().getResource(this.path)));
] so. Also statt getResourceAsStream(this.path) einfach getResource(this.path), was eine URL zurückliefert. Damit fkt es aber. Ach ich bin glücklich. Tausend Dank an den Denkanstoss!!!!
 
Freut mich, wenn ich helfen konnte!

19.gif
 

Neue Themen


Zurück
Oben