我有以下代码来在游戏中播放声音:
protected void playSound(final String sound, final int playTime){
try {
sounds.get(sound).open();
}
catch(Exception e) {
System.out.println(e);
}
new Thread(new Runnable() {
public void run() {
Clip actualClip = sounds.get(sound);
actualClip.setFramePosition(0);
if(playTime < 0){
actualClip.loop(Clip.LOOP_CONTINUOUSLY);
}
else{
actualClip.loop(playTime - 1);
}
}
}).start();
}
声音保存在 HashMap 中:
private HashMap<String, Clip> sounds;
当我“同时”播放两种不同的声音(相差 1 毫秒;))时,它们彼此并行播放;所以我可以同时听到两种声音。看起来像这样:
playSound("sound1", 1);
playSound("sound2", 1);
但是当我尝试播放相同的声音两次时,它不起作用:
playSound("sound1", 1);
//here its waiting in my programm
playSound("sound1", 1);
问题是,我想添加“死亡”声音 - 但两个小怪也可以同时死亡,或者只早一秒死亡。发生这种情况时,要么什么也没有发生,要么声音只播放一次。
为什么?我想我在自己的线程中创建同一文件的新音频剪辑?那么为什么它不起作用呢?最佳答案
首先,您可以调试该方法来显示“声音”是否已播放,以确保它不会重叠,这样您就听不到是否实际上同时播放了相同的声音?
我认为这里可能发生的情况是,在播放同一剪辑时,其中一个线程将尝试访问另一个线程当前正在访问的相同数据,从而导致您所描述的错误。您可能想研究一下 Java 中的同步。
关于java - 并行播放相同的声音两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18163895/