0

我正在尝试做我的学校项目(一个简单的 Java 游戏),但我无法获得音效。我正在使用 Clip 进行此操作,现在我的 playSound 方法如下所示:

public void playSound(File filename) {
    try {
        AudioInputStream sound = AudioSystem.getAudioInputStream(filename);
        Clip clip = AudioSystem.getClip();
        clip.open(sound);

        clip.setFramePosition(0);
        clip.start();
    } 
    catch (UnsupportedAudioFileException ex) {
        ex.printStackTrace();
    } 
    catch (IOException ex) {
        ex.printStackTrace();
    } 
    catch (LineUnavailableException ex) {
        ex.printStackTrace();
    }
}

我有不同的声音效果作为属性(文件),当我想播放一些声音时我会调用该方法。

一切正常:例如,当玩家吃东西时会播放声音,但有时声音会变小。当玩家没有吃任何东西时,正在播放吃东西的声音。

你知道出了什么问题吗?像这样播放几个音效有问题吗?谢谢!:)

4

1 回答 1

0

以下建议可能对您的情况有所帮助,也可能无济于事。

每次播放声音时,您都会从磁盘加载剪辑。剪辑被设计为加载一次,并根据需要调用。要重播剪辑,请将其重置回第 0 毫秒或第 0 帧,然后像此处一样调用 play。这样,它开始很快。按照您的编程方式,剪辑在从磁盘完全加载到内存之前甚至不会开始播放,并且 setFramePosition(0) 是多余的,因为新创建的剪辑将始终从头开始播放(除非您已明确设置它到其他一些框架位置)。

因此,我建议在游戏开始时,将剪辑加载到将持续存在的对象中,并根据需要引用它们,此时您只需要调用 setFramePosition(0) 和 play() 方法.

如果声音在奇怪的时间播放,我会更仔细地研究调用声音的逻辑。虽然您的方法不是最佳的,但它确实有效,并且如果声音文件的加载由于某种原因被延迟,只会导致奇怪的延迟播放时间。但是,如果您的声音超过几秒钟,那么这些加载延迟可能是问题的根源。

另一种想法是,SourceDataLine 将比创建、加载和播放新剪辑更快地开始播放。播放 SDL 比播放 Clip 需要更多的 cpu,但如果声音文件较长,这仍然是一种合理的方式。

于 2013-01-13T03:29:13.487 回答