0

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

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();
    }
}

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

4

2 回答 2

3

我也遇到过这个问题,我的经验是它与剪辑的大小无关,而是在您第一次尝试启动剪辑时加载了很多类,因为加载许多 JavaSound 类的开销。

如果您将参数 -verbose:class 添加到 java,您也可能会看到此问题。

对我有用的是有一个没有任何音频的silent.wav 文件。我在主要声音开始之前播放它,它让一切都做好了准备。

于 2011-05-05T20:24:08.260 回答
2

首先,Java 的声音库与 Java Media Framework 之类的东西相比是相当薄弱的,您可能会研究它,但如果这是一个声音效果极少的简单游戏,Java 的声音库应该足够了。您可能想提供更多关于您想要播放的声音文件类型(格式、长度等)的详细信息,以便我们更好地解决您的问题。

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

//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/Au​​dio/Play-Non-Trivial-Audio/

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

于 2011-03-13T20:03:49.280 回答