Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java游戏中播放声音?_Java_Applet_Audio_Clip - Fatal编程技术网

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

如何在Java游戏中播放声音?,java,applet,audio,clip,Java,Applet,Audio,Clip,我使用以下代码成功地在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'

我使用以下代码成功地在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
是否值得考虑?

只要您想播放,Java小程序就会流式播放您的剪辑,这就是为什么您会因为声音文件尚未加载到内存中而受到延迟的原因

我已经有一段时间没有完成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(); 
}

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

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


但是,是的,如果你有很多经常播放的小声音,剪辑池是一个不错的选择。如果您希望它们重叠,或始终播放到完成,则需要多个副本。如果没有,则停止,重置为0并重新启动。但不要一直重新打开!如果您正在这样做,不妨使用SourceDataLine。

Hi-谢谢您的回答。同一声音可能需要播放多次。你会建议在手之前为每个音效合并多个剪辑吗?是的,我通常实现一个“SoundManager”单例类来加载所有剪辑。上述代码将多次播放声音,但每次都会重置剪辑。如果你想说播放5个相同的声音,但间隔稍有不同,我建议你加载5个剪辑,然后当你调用playSFX()时,增加一个计数器,指向下一个要播放的剪辑。@JSmyth我正在做类似的事情,但是如果我打开同一声音文件的多个AudioInputStream,我开始得到LineUnavailableException。你能看看我的问题吗?我有一些问题。我想我可能需要做你在这里提到的事情。你能举个例子吗?我的问题是:看看你的链接帖子,你似乎已经解决了这个问题。非常好!我自己也没试过珠子,但看起来确实很有趣。我也听说了TinySound库的优点,它支持多种回放。虽然我一直在使用我自己的代码。我得去看看TinySound。珠子很好,因为它给了你“机器”(我称之为机器),你可以将输入插入,并将输出插入外部机器输入。你可以用特效等过滤声音。最酷的是,它会自动处理数据线,将所有模拟声音的值相加,生成最终的输出。酷,我刚刚查看了TinySound。很好,很简单。珠子的简单用例与TinySound一样简单,但如果您愿意,珠子可以让您使用它变得更复杂(TinySound无法做到)。谢谢你给我看TinySound!