Sounds abspielen

Status
Nicht offen für weitere Antworten.

hdi

Top Contributor
Hallo,

ich mach grad zum ersten mal was mit Sounds, im Java-Insel Buch gabs dazu nur eine Seite.
Da wird gesagt man kann es über das AudioClip Applet machen.

Ich habe jetzt folgendes getan:

Code:
AudioClip snd = null;
try {
	File sndFile = new File("sounds/test.mp3");
	snd = Applet.newAudioClip(sndFile.toURI().toURL());
} catch (MalformedURLException e) {
	e.printStackTrace();
}

System.out.println(snd);
snd.play();
while(true);

Aber es passiert nichts. Kein Fehler, aber man hört halt nix. Die Sys-Print Methode gibt aus:

sun.applet.AppletAudioClip@c1cd1f

was ich etwas seltsam finde, sollte da nicht der Name der Datei oder sowas drinstehen? Also die Datei
ist zumindest im richtigen Ordner weil ich krieg da keinen Fehler, er findet sie also.

Ich dachte erst, ja klar hört man nix weil danach meine main-methode zu ende ist ;) Also hab ich danach
noch ein while(true); eingebaut, damit das Programm am Leben bleibt. Aber nix zu hören...
Liegt's am fileformat, also kann java keine mp3's abspielen? Ich hab hier leider keine wav-datei zur hand.
 

hdi

Top Contributor
so, also ich habs jetz hinbekommen dass er mir ne wav file abspielt.

aber ich hab jetz 2 Probleme.. Dazu poste ich erstmal den Code meiner Sound-Bibliothek:

Code:
public class SoundLib extends MediaLib {

	/*
	 * LIBRARY BEGINS HERE
	 */

	@MediaPath("sounds/sound1.wav")
	public static SoundClip sound1;

	/*
	 * END OF LIBRARY
	 */

	@Override
	protected Object createMediaFrom(String mediaPath) {

		SoundClip sndClip = null;
		try {
			File file = new File("C:/sound1.wav"); <--- mit dem relativen MediaPath funzt das leider nicht...
			AudioInputStream stream = AudioSystem.getAudioInputStream(file);
			AudioFormat format = stream.getFormat();
			DataLine.Info info = new DataLine.Info(Clip.class, format);
			Clip clip = (Clip) AudioSystem.getLine(info);
			sndClip = new SoundClip(clip, stream);
		} catch (UnsupportedAudioFileException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (LineUnavailableException e) {
			e.printStackTrace();
		}
		return sndClip;
	}

	public class SoundClip {

		private Clip mySound;
		private AudioInputStream myStream;

		public SoundClip(Clip sound, AudioInputStream stream) {
			mySound = sound;
			myStream = stream;
		}

		public void play() {
			try {
				mySound.open(myStream);
				mySound.start();
			} catch (LineUnavailableException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}

		public void loop(int count) {
			try {
				mySound.open(myStream);
				mySound.loop(count);
			} catch (LineUnavailableException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}

Also ich hab meine öffentlichen statischen Objekte, auf die ich einfach im Spiel später zugreifen kann.
D.h. wenn zB irgendwas im Spiel passiert, und das solln Sound auslösen, mach ich einfach:

Code:
SoundLib.sound1.play();

So, hier ist das erste Problem. So wie ich das mach, is das nicht so gut weil ich kann den sound nicht öfters gleichzeitig starten, weil der stream schon belegt ist beim ersten abspielen.

Das zweite Problem ist: Ich initialisier beim Programmstart alle Sounds, das ist diese createMediaFrom
Methode, die durchläuft alle statischen Objekte und initialisiert sie. Und wie man sieht kriegt sie den
Pfad der Datei übergeben. Leider weiss ich nciht wie ich das File-Objekt mit relativem Pfad erstelle, d.h.
den Pfad innerhalb des jar-archivs.

was ich meine:
wenn ich ne klasse "Bilder" hab, und die ist im selben package wie meine bild-dateien, dann brauch ich
beim ImageIO.read() aufruf nur den filenamen angeben, also zB "meinBild.jpg". und dann sucht er innerhalb des jar-archivs in dem ordner, in dem die aufrufende Klasse "Bilder" ist, nach diesem File.

Und genau das bräuchte ich jetzt auch für das Laden der Sounddatei...

Also das sind meine Probleme, und ich muss beide am besten so lösen, dass das Grundkonzept meiner Bibliothekt, zumindest die createMediaFrom() Methode, bleiben.. Damit ich halt alle Sounds beim Programmstart vorladen kann.
 

Quaxli

Top Contributor
Zum ersten Problem:
Das ist der kreative Teil bei der Spiele-Entwicklung - laß Dir was einfallen. Es kommt auch darauf an, wo das Problem auftritt, beschreibe zur Not mal mehr. Zum Beispiel kann man durchaus eine Explosion stoppen, wenn sofort eine neue kommt. Oder Fahrgeräusche permanent spielen, solange mind. ein Fahrzeug sichtbar ist.
Es ist schwierig hier einen Rat zu geben ohne das Spiel zu kennen. Manchmal ist weniger Sound sogar mehr. Hier wird Dir letzten Endes nicht viel übrig bleiben als rumzuprobieren.

Zum zweiten Problem:
Im Prinzip ähnlich, wie Du die Bilder lädst. ;) Applet.getAudioclip(..) will eine URL. Die holst Du Dir über getClass().getClassLoadcer.getResource(...). Und die Pfadangabe analog zum Bilder-Laden mit ImageIO wie es in einem Deiner vielen anderen Threads gezeigt wurde ;)
 

hdi

Top Contributor
Sorry, ich check das nicht...

Wenn ich mach:

Code:
Applet.getAudioClip(getClass().getClassLoader().getResource(mediaPath));

dann sagt er mir er kann keine statische Referenz über eine nicht-statische Methode machen.
Muss ich von Applet erben? Das könnte ich gar nicht, ausser es gibt auch n Interface, weil ich hab schon
ne Vaterklasse.

So wie ich jetz den Code hab, habe ich es aus nem Game Tutorial Buch genommen. Ich hab nicht
den blassesten schimmer wie ich das jetz ändern soll wenn ich irgendwas mit Applet mache... Da steht
leider auch nich mehr dabei.

Im Java-Insel Buch steht auch nur Schrott, der nicht erklärt ist, so kommt's mir vor...

Tut mir leid dass ich da so unbeholfen bin, aber ich hab echt keine Ahnung, was du meinst :(
 

Quaxli

Top Contributor
Wenn Du schon Tutorials liest, klick halt auch mal auf meins.
<--- Irgendwo da in der Sig. ;)
Aber irgendwie muß ich ja auf 'ne 4-stellige Postingzahl kommen ;)

Hier mal ein Beispiel das funktioniert (aus JFalcon):

Code:
import java.applet.*;
import java.net.URL;
import java.util.*;

public class SoundLib {

	Hashtable<String, AudioClip> sounds;
	Vector<AudioClip> loopingClips;
	
	public SoundLib(){
		sounds = new Hashtable<String, AudioClip>();
		loopingClips = new Vector<AudioClip>();
	}
	
	public void loadSound(String name, String path){
		
	  if(sounds.containsKey(name)){
	  	return;
	  }
		
   URL sound_url = getClass().getClassLoader().getResource(path);
   sounds.put(name, (AudioClip)Applet.newAudioClip(sound_url));
	}
	
	public void playSound(String name){
		AudioClip audio = sounds.get(name);
		audio.play();
	}
	
	public void loopSound(String name){
		AudioClip audio = sounds.get(name);
		loopingClips.add(audio);
		audio.loop();
	}

	public void stopLoopingSound(){
     for(AudioClip c:loopingClips){
    	 c.stop();
     }
     loopingClips.clear();
	}

	public void stopLoopingSound(String name){
		AudioClip audio = sounds.get(name);
		audio.stop();
		loopingClips.remove(audio);
	}
}

Der Code oben wird in dem Zusammenhang eingesetzt, daß die Soundfiles in einem eigenem Ordner stecken. Dieser Ordner befindet sich im gleichen Verzeichnis, wie die class-Files

Innerhalb meiner Hauptklasse habe ich eine init-Methode, in der nach Spielstart, erst mal Bild- und Sounddateien geladen werden. Die SoundLib ist als Instanzvariable deklariert
Code:
...
		sound = new SoundLib();
		sound.loadSound("boom", "sound/boom.wav");
...

Aufruf später im Spiel:

Code:
...
  sound.playSound("boom");
...
 

hdi

Top Contributor
Also bei mir funkioniert das nicht:

Code:
	@Override
	protected Object createMediaFrom(String mediaPath) {

		AudioClip sndClip = null;
		URL sndURL = getClass().getClassLoader().getResource(mediaPath);
		sndClip = (AudioClip) Applet.newAudioClip(sndURL); // <--- UNKNOWN SOURCE Excpetion
		return sndClip;
	}

mediaPath ist hier zB "sounds/sound1.wav", und in der gleichen Klasse, wie diese Methode steht,
also in der SoundLib, hab ich dann:

Code:
@MediaPath("sounds/sound1.wav")
public static AudioClip sound1;

D.h. der Pfad ist doch eigentlich ok, oder nicht, ich meine ist ja in der gleichen Klasse.

Die Datei selbst liegt im Ordner "media.sounds", das isn unterordner vom package "media", und in dem package media liegt auch diese SoundLib-Klasse.

Ich mach genau das gleiche wie bei den Images, du weisst ja worum's da ging, aber hier funzt es nicht.
 

Quaxli

Top Contributor
D.h. der Pfad ist doch eigentlich ok, oder nicht, ich meine ist ja in der gleichen Klasse.

Die Datei selbst liegt im Ordner "media.sounds", das isn unterordner vom package "media", und in dem package media liegt auch diese SoundLib-Klasse.

Ich verstehe nicht was das heißen soll "in der gleichen Klasse". :(


Bei mir sieht das so aus:
Code:
src  //Ordner mit gleicher Struktur wie "bin" - enthält die "java"-Dateien
|
|

bin  //Ordner mit kompilierten Dateien. Die Unterordner sind die Packages
|---- game
|        |--- JFalcon.class  //<-- Hauptklasse mit main-Methode
|        
|---- entities 
|        |--- Player.class
|        |--- Enemy.class
...
|---- sounds
|        |--- boom.wav
|        |--- zing.wav
...
 

hdi

Top Contributor
bei mir sieht das so aus:

Code:
src  //Ordner mit gleicher Struktur wie "bin" - enthält die "java"-Dateien
|
|

bin  //Ordner mit kompilierten Dateien. Die Unterordner sind die Packages
|
|----  Main-Klasse & n paar andere Klassen, direkt im bin-ordner
|       
|---- media (ordner)
         |--- SoundLib, ImageLib etc liegen in diesem Ordner
         |
         |--- images (unterordner)
                  |------alle bilddateien
         |--- sounds(unterordner)
                  |------alle sounddateien

Und mit "gleicher Klasse" meinte ich, dass die bild & sounddateien im gleichen package liegen
wie die SoundLib.java / ImageLib.java, und zwar im Package "media".

Und in der ImageLib übergeb ich den Pfad als "/images/test.jpg" und es funktioniert so.

deshalb wunder ich mich, warum es nicht geht, wenn ich in der SoundLib als Pfad "/sounds/test.wav" übergeb,
weil es ja eigentlich die gleiche struktur hat vom aufbau her.
 

hdi

Top Contributor
Ok ich hab jetz den Fehler gefunden. Statt
Code:
getClass().getClassLoader().getResource(mediaPath);

muss ich bei mir natürlich machen:

Code:
getClass().getResource(mediaPath);

Ich habs jetzt also soweit hinbekommen dass er alle Sounds in der Lib lädt, und er kann sie auch abspielen, auch mehrere gleichzeitig. Hab aber das Problem, dass ich einen Sound nicht abspielen kann (von vorne wieder) wenn der gleiche Sound läuft.

beim Laden der Sound dateien kapsel ich das in ne Klasse SoundClip, das hatte ich ja oben schon gepostet.
Um das Problem des wieder neu-abspielens zu beseitigen habe ich die play methode wie folgt implementiert:

Code:
public class SoundClip {

      private Clip mySound;
      private AudioInputStream myStream;

      public SoundClip(Clip sound, AudioInputStream stream) {
         mySound = sound;
         myStream = stream;
      }

      public void play() {
         if(mySound.isActive()){  
            mySound.stop();           
            mySound.close();
         }
         try {
            mySound.open(myStream);
            mySound.start();
         } catch (LineUnavailableException e) {
            e.printStackTrace();
         } catch (IOException e) {
            e.printStackTrace();
         }
      }

      public void loop(int count) {
         try {
            mySound.open(myStream);
            mySound.loop(count);
         } catch (LineUnavailableException e) {
            e.printStackTrace();
         } catch (IOException e) {
            e.printStackTrace();
         }
      }
   }

D.h. wenn der Sound schon läuft, soll er ihn stoppen und den Stream schliessen, sodass ich den Sound erneut abspielen kann. Wenn ich jetz also einen Sound von sagen wir 5sec abspiele, und nach 2 Sec erneut play() aufrufe, sollte er mir eig. den Sound neu abspielen können, dachte ich... Tut er leider nicht. Ich krieg zwar keine Exception geworfen, und der Sound hört auch auf zu spielen, aber er beginnt nicht wieder von vorne...

Wieso?
 
G

Guest

Gast
Ich hab alles laut dieser Anleitung gemacht...

Hatte 2 Fehler:


Code:
MacBook:Desktop maxi$ javac PizzaWecker.java 
PizzaWecker.java:27: <identifier> expected
	 sound = new SoundLib(); 
               ^
PizzaWecker.java:28: <identifier> expected
     sound.loadSound("boom", "sound/boom.wav"); 
                    ^
2 errors

Dann habe ich den Fehler selbst korregiert mit



SoundLib sound_ref = new SoundLib();
sound_ref.loadSound("boom", "sound/boom.wav");



Aber jetzt habe ich immer noch einen Fehler


Code:
MacBook:Desktop maxi$ javac PizzaWecker.java 
PizzaWecker.java:28: <identifier> expected
    sound_ref.loadSound("boom", "sound/boom.wav"); 
                       ^
1 error


Wer kann mir da mal helfen? Ich programmier erst seit 1/2 Jahr Java ;)
 

hdi

Top Contributor
Zeig mal mehr Zeitgefühl ;) Das war 2 Monate her, ich weiss gar nich mehr worum's da ging :bae:

edit: ouch, ins eigene Bein geschossen. Sorry habe den Post deines Vorredners nicht gesehen :oops:

THREAD-OVERTAKER :bloed: :bloed: :bloed: :wink:
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Vereinfacht Sounds abspielen?! Java Basics - Anfänger-Themen 3
Maxim6394 Problem beim Abspielen von Sounds Java Basics - Anfänger-Themen 8
Developer_X Sounds abspielen, die im internet sind (.wav) Java Basics - Anfänger-Themen 2
D aufnehmen, abspielen und vergleichen von Sounds Java Basics - Anfänger-Themen 2
S Wo speicher ich bilder und sounds ab? Java Basics - Anfänger-Themen 4
G Programm mit Sounds exportieren Java Basics - Anfänger-Themen 3
B Sounds Java Basics - Anfänger-Themen 7
L Probleme mit Sounds Java Basics - Anfänger-Themen 2
K Musik abspielen Java Basics - Anfänger-Themen 4
S Youtube Video abspielen Java Basics - Anfänger-Themen 1
S Probleme mit abspielen einer .wav Datei Java Basics - Anfänger-Themen 2
R Sound abspielen Java Basics - Anfänger-Themen 9
S Sound stoppen und nach Pause wieder abspielen Java Basics - Anfänger-Themen 6
A wav-Datei abspielen Java Basics - Anfänger-Themen 3
J Java - Abspielen einer wav Datei Java Basics - Anfänger-Themen 2
P InputStream eines Musik-Streams abspielen Java Basics - Anfänger-Themen 2
Anfänger2011 Input/Output Sound abspielen - ICH VERZWEIFLE!!!! Java Basics - Anfänger-Themen 24
D Wave Datei mehrmals abspielen Java Basics - Anfänger-Themen 2
P Audio Datei abspielen Java Basics - Anfänger-Themen 18
T .wav abspielen Java Basics - Anfänger-Themen 8
P *.wav abspielen mit Anyexample Java Basics - Anfänger-Themen 3
D Sound abspielen, wo muss die .wav liegen Java Basics - Anfänger-Themen 3
2 Input/Output Sound aufnehmen/abspielen? Java Basics - Anfänger-Themen 2
SheldoN Töne abspielen auf verschiedenen Buttons Java Basics - Anfänger-Themen 17
SheldoN Sound abspielen nach Buttonklick in Applets Java Basics - Anfänger-Themen 17
F sound nur abspielen, wenn er nicht läuft Java Basics - Anfänger-Themen 6
B Problem beim Abspielen einer Videodatei Java Basics - Anfänger-Themen 4
B Tondatei abspielen Java Basics - Anfänger-Themen 11
H audio abspielen Java Basics - Anfänger-Themen 19
A Soundfile in java abspielen lassen Java Basics - Anfänger-Themen 7
R WAV-Datei in textpane abspielen Java Basics - Anfänger-Themen 3
StrikeTom Fehler beim Audiodatei abspielen Java Basics - Anfänger-Themen 4
M sound abspielen Java Basics - Anfänger-Themen 3
M Volume beim Abspielen von Audio Dateien Java Basics - Anfänger-Themen 2
J VoiceChat Hilfe - Empfangene Pakete abspielen Java Basics - Anfänger-Themen 6
M Ton abspielen in einer gewissen Frequenz und lautstärke... Java Basics - Anfänger-Themen 3
C Sound abspielen Java Basics - Anfänger-Themen 6
G Video aus dem Internet abspielen Java Basics - Anfänger-Themen 6
R Probleme mit NullPointer beim Mp3 abspielen (JMF) Java Basics - Anfänger-Themen 21
S Midi-dateien Abspielen Java Basics - Anfänger-Themen 2
K Animiertes Gif nur einmal abspielen Java Basics - Anfänger-Themen 3
X Audio: Abspielen eines OutputStreams Java Basics - Anfänger-Themen 4
S Ton mit festgelegter Frequenz abspielen Java Basics - Anfänger-Themen 2
B Kann Java Videos abspielen? Java Basics - Anfänger-Themen 2
M Sound Abspielen Java Basics - Anfänger-Themen 9
M strings rückwärts abspielen (schleife?) Java Basics - Anfänger-Themen 33
F mp3 File abspielen Java Basics - Anfänger-Themen 15
U Ton abspielen Java Basics - Anfänger-Themen 23
G Sound bei buttonklick abspielen Java Basics - Anfänger-Themen 7
B Sound einbinden und abspielen Java Basics - Anfänger-Themen 9
D JMF - Abspielen eines mpeg1-Videos Java Basics - Anfänger-Themen 15
E MP3s in Java abspielen Java Basics - Anfänger-Themen 2
G *.au Datei einbinden und abspielen Java Basics - Anfänger-Themen 4
F musik datei mit jmf abspielen Java Basics - Anfänger-Themen 5
D .wav Sound in einer simplen Applikation abspielen Java Basics - Anfänger-Themen 3
B Midi-File Abspielen Java Basics - Anfänger-Themen 14
T Filme ohne JMF abspielen Java Basics - Anfänger-Themen 7

Ähnliche Java Themen

Neue Themen


Oben