我正在做一个有趣的项目,希望得到一些帮助。目前我正在尝试将声音融入到我的游戏中。就目前而言,这是我的代码......
public static volatile boolean shutdown = false;
//This is a method to play sound
public static void play(String name) {
shutDown();
Runnable myRunnable = new Runnable() {
public void run() {
try {
AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(Main.class.getResource(name));
Clip clip = AudioSystem.getClip();
clip.open(audioInputStream);
clip.start();
while (!shutdown) {
}
clip.close();
} catch (Exception ex) {
}
}
};
Thread thread = new Thread(myRunnable);
thread.start();
}
public static void shutDown() {
shutdown = true;
shutdown = false;
}
就目前情况而言,我编写的代码可以工作。虽然我有一些问题。有时,当我运行两次时,它可以互相播放音乐。另一个问题是有时在我的声音开始之前会有明显的延迟。任何帮助都会很棒!
最佳答案
首先,您使用 Clip 的方式违反了其设计用途。剪辑应该预先加载到内存中,并保持在需要时可以调用的状态。然后,当需要播放提示时,您只需执行 start 方法,或者将帧位置重新定位回开头,然后调用 start。
根据您现在的情况,您可能会遇到各种延迟问题。每次调用 play 时,系统都必须将整个文件加载到内存中。在这个阶段完全完成之前,它甚至不会开始播放。如果提示太大而您不想将其保留在 RAM 中,最好的办法是使用 SourceDataLine 而不是 Clip。使用 SourceDataLine,只有缓冲区的值加载到内存后才会开始播放。
从您所写的内容中我不清楚您是否想要同时播放提示,所以我还不知道如何回答您帖子的这一部分。
另外,我想推荐一个我专门为游戏音频使用而编写的类。它称为 AudioCue,您可以在 Java-gaming.org 查看它。 。代码源在 BSD 许可证下可用(换句话说,它是免费的,并且您可以编辑它)。我非常努力地使其尽可能像其他 Java 类,并在 Javadocs/API 中投入了大量工作。该类与 Clip 类似,但对于“即发即忘”播放来说稍微简单一些,并且具有附加功能(例如良好的音量、平移和速度控制)。无需加载“库”,只需将三个类粘贴到您的项目中,然后随意修改它。
关于java - 我的 Java 代码中的声音重叠和延迟问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44864855/