我使用以下代码在游戏中播放声音。
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之类的库。