如何使用AudioSystem预加载不同的剪辑?

问题描述 投票:1回答:1

我在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();
            }
        });
    }

}

我希望音频在触发时播放。

java javasound
1个回答
1
投票

我想到了。这是一个愚蠢的错误。 Clip对所有clases都是一样的,不是因为getClip()返回了相同的值,但是因为我将它设置为静态。刚改变:

private static Clip clip;

private Clip clip;
© www.soinside.com 2019 - 2024. All rights reserved.