如何使用 AudioSystem 预加载不同的剪辑?
How to preload differents clips with AudioSystem?
我在 Java 应用程序中集成了音频。问题是有时 clip.open() 会挂起一点,所以我读到我需要重新加载剪辑,然后 clip.start().
我为每个音频文件使用声音 class,它会在播放完毕后重新加载剪辑。
这里的问题是我触发的声音不是在我触发它的时候就播放的,而是在我触发下一个声音的时候播放的。它改变了所有的声音。
我想到它发生是因为加载方法打开了一个剪辑,然后由不同的 Sound 实例使用,不应该只加载它的剪辑吗?
就像我说的,如果在启动后立即调用 load 方法,它有时会死机。
我已经为 运行 创建了一个线程,这样它就不会挂起主线程,但无论如何它都会冻结,所以声音播放很晚。
public class Sound {
private final String file;
private static Clip clip;
public Sound(String file){
this.file = file;
load();
}
public final void load(){
try {
AudioInputStream stream = AudioSystem.getAudioInputStream(new File(file).getAbsoluteFile());
clip = AudioSystem.getClip();
System.out.println(clip);
clip.open(stream);
} catch (UnsupportedAudioFileException | IOException | LineUnavailableException ex) {
Logger.getLogger(Sound.class.getName()).log(Level.SEVERE, null, ex);
}
}
public void play() {
clip.start();
clip.addLineListener(e -> {
if (e.getType() == LineEvent.Type.STOP) {
clip.stop();
clip.close();
load();
}
});
}
}
我希望音频在触发的那一刻播放。
我明白了。这是一个愚蠢的错误。 Clip 对所有类都是一样的,不是因为 getClip() 返回了相同的值,而是因为我将它设置为静态的。
刚刚更改:
private static Clip clip;
至
private Clip clip;
我在 Java 应用程序中集成了音频。问题是有时 clip.open() 会挂起一点,所以我读到我需要重新加载剪辑,然后 clip.start().
我为每个音频文件使用声音 class,它会在播放完毕后重新加载剪辑。 这里的问题是我触发的声音不是在我触发它的时候就播放的,而是在我触发下一个声音的时候播放的。它改变了所有的声音。
我想到它发生是因为加载方法打开了一个剪辑,然后由不同的 Sound 实例使用,不应该只加载它的剪辑吗?
就像我说的,如果在启动后立即调用 load 方法,它有时会死机。 我已经为 运行 创建了一个线程,这样它就不会挂起主线程,但无论如何它都会冻结,所以声音播放很晚。
public class Sound {
private final String file;
private static Clip clip;
public Sound(String file){
this.file = file;
load();
}
public final void load(){
try {
AudioInputStream stream = AudioSystem.getAudioInputStream(new File(file).getAbsoluteFile());
clip = AudioSystem.getClip();
System.out.println(clip);
clip.open(stream);
} catch (UnsupportedAudioFileException | IOException | LineUnavailableException ex) {
Logger.getLogger(Sound.class.getName()).log(Level.SEVERE, null, ex);
}
}
public void play() {
clip.start();
clip.addLineListener(e -> {
if (e.getType() == LineEvent.Type.STOP) {
clip.stop();
clip.close();
load();
}
});
}
}
我希望音频在触发的那一刻播放。
我明白了。这是一个愚蠢的错误。 Clip 对所有类都是一样的,不是因为 getClip() 返回了相同的值,而是因为我将它设置为静态的。 刚刚更改:
private static Clip clip;
至
private Clip clip;