2

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

// 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值得考虑吗?

4

2 回答 2

2

每当您想播放剪辑时,Java Applet 都会流式传输您的剪辑,这就是为什么您会因为声音文件尚未加载到内存中而出现延迟。

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

这是我的一个旧项目中的一些代码

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(); 
}
于 2010-02-12T01:47:12.177 回答
0

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

我对 SourceDataLines 的反应非常好。好消息是它们比未打开的剪辑启动得更快,因为它们会立即启动,而不是等到声音的所有数据都加载到 RAM 中(每次“打开”剪辑时都会发生这种情况)。

但是,是的,如果您有很多经常播放的小声音,那么剪辑池就是您的最佳选择。如果你想让它们重叠,或者总是玩到完整,那么你需要多个副本。如果不是,则停止,重置为 0 并重新启动。但不要继续重新开放!如果您这样做,您不妨使用 SourceDataLine。

于 2011-08-20T05:23:08.450 回答