我使用以下代码在游戏中播放声音。

import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.UnsupportedAudioFileException;
import java.io.IOException;

public class AudioController {

    public static void playback(String fileName)
        throws LineUnavailableException, UnsupportedAudioFileException, IOException {
        AudioInputStream ais = AudioSystem.getAudioInputStream(AudioController.class.getClassLoader().getResourceAsStream("sounds/"+fileName));

        AudioFormat format = ais.getFormat();
        DataLine.Info info = new DataLine.Info(Clip.class, format);
        Clip clip = (Clip) AudioSystem.getLine(info);

        clip.open(ais);
        clip.start();
    }
}


问题是:如果第一次播放声音,应用程序将挂起一小段时间,因为将完成某种初始化工作。此后播放的每个声音都不会显示此行为。如何预防呢?

最佳答案

首先,与您可能会研究的Java Media Framework之类的东西相比,Java的声音库相当弱,但是如果这是一款具有最小声音效果的简单游戏,那么Java的声音库就足够了。您可能需要提供有关要播放的声音文件类型(格式,长度等)的更多详细信息,以便我们更好地解决您的问题。

如果要播放声音的短片(少于一秒钟),则应在开始时初始化片段,并在需要时播放它:

//initialize this at the beginning of your program
AudioInputStream soundStream = AudioSystem.getAudioInputStream(new File("sound.wav"));

Clip soundEffect = AudioSystem.getClip();
soundEffect.open(soundStream);

...

//later, play the sound
soundEffect.start();


问题是Clip的缓冲区非常有限,您将无法远程播放任何内容(根据我的经验,平均播放时间> 1秒)。

如果要播放背景音乐或更长的时间,并且想要避免自己管理字节流,则必须查看外部库。我似乎找不到BigClip类的下载链接,但您可以看一下:

http://pscode.org/javadoc/org/pscode/xui/sound/bigclip/BigClip.html

当我不得不播放更长的声音时,我使用我在这里找到的PCMFilePlayer类的修改版本(我添加了一些额外的方法来使其更像BigClip):

http://codeidol.com/java/swing/Audio/Play-Non-Trivial-Audio/

无论哪种情况,在程序开始时我都会加载尽可能多的声音,并且需要播放,但是在所有情况下,声音的数量都非常有限。如果您正在播放大量的声音/音乐或担心内存使用,则可能需要研究功能更强大的JMF之类的库。

07-28 13:07