如何使用AudioSystem预加载不同片段?

时间:2019-03-25 15:43:08

标签: java javasound

我在Java应用程序中集成了音频。问题是有时clip.open()会挂断一点,所以我读到我需要重新加载剪辑,然后只是clip.start()。

我为每个音频文件使用一个声音类,播放完毕后它将重新加载剪辑。 这里的问题是,我触发的声音在触发时无法正确播放,而在触发下一个声音时却无法正常播放。它会改变所有声音。

我想出了这样的想法,因为load方法会打开一个片段,然后该片段将被另一个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();
            }
        });
    }

}

我希望音频在被触发的那一刻播放。

1 个答案:

答案 0 :(得分:1)

我知道了。这是一个愚蠢的错误。 Clip在所有情况下都是相同的,不是因为getClip()返回相同的值,而是因为我将其设置为静态。 刚刚更改:

private static Clip clip;

private Clip clip;