如何在Java游戏中播放声音?

时间:2010-02-11 18:44:52

标签: java applet audio clip

我使用以下代码在Java(1.5)applet游戏中成功播放声音:

// get an available clip to play it
Clip clip = null;
for (Clip clipTemp : players) {
    if (!clipTemp.isOpen()) {
    clip = clipTemp;
        break;
    }
}
if (clip == null) {
    // no available player found, don't play
    return;
}

clip.open(audioFormat, audioByteData, 0, audioByteData.length);

clip.start();

(玩家是我在开始时打开的剪辑列表,旨在减少延迟,线条侦听器会在检索到停止事件时关闭该线。)

我面临的问题是播放声音时间歇性延迟长达1秒。这很糟糕。

有没有办法改善这个? SourceDataLines值得考虑吗?

2 个答案:

答案 0 :(得分:2)

Java Applet会在您想要播放剪辑时播放剪辑,这就是因为声音文件尚未加载到内存中而导致延迟的原因。

自从我完成Java applet编程以来已经有一段时间了,但是我确实记得我曾经预先加载了所有剪辑,然后后来的播放调用不会重新打开文件。

以下是我旧项目中的一些代码

Clip shoot;

private loadShootWav()
{
    AudioInputStream sample;
    sample = AudioSystem.getAudioInputStream(this.getClass().getResource("shoot.wav"));
    shoot = AudioSystem.getClip();
    shoot.open(sample);
}

public void playShootSFX()
{
    shoot.stop();
    shoot.setFramePosition(0);
    shoot.start(); 
}

答案 1 :(得分:0)

如果我正确阅读您的代码,您将找到一个未打开的剪辑并在播放之前将其打开。获取打开的剪辑并重新启动它会更快。您可能必须先停止并重置其位置,如JSmyth在playShootSFX()示例中所示。

我对SourceDataLines的反应非常好。好处是它们比未打开的Clip更快启动,因为它们立即开始而不是等到声音的所有数据都加载到RAM中(每次“打开”一个Clip时都会发生)。

但是,是的,如果你有很多经常播放的小声音,那么剪辑池就是你要走的路。如果您希望它们重叠或始终播放完成,则需要多个副本。如果没有,则停止,重置为0并重新启动。但是不要继续重新开放!如果你这样做,你也可以使用SourceDataLine。