我使用以下代码在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
值得考虑吗?
答案 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。