我知道这已被问了很多次,但在某些情况下却有所不同,所以我无法弄明白。当我在Eclipse中运行我的游戏时,一切进展顺利,游戏运行完美,但在我导出后,它会崩溃。我可以打开游戏并在菜单中移动,但没有声音播放,在我点击播放后,游戏只是冻结,它给了我这个错误与cmd(我可以粘贴任何必要的类,但希望只有音频类是必要的) :
package com.neet.Audio;
import java.util.HashMap;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
public class JukeBox {
private static HashMap<String, Clip> clips;
private static int gap;
private static boolean mute = false;
public static void init() {
clips = new HashMap<String, Clip>();
gap = 0;
}
public static void load(String s, String n) {
if(clips.get(n) != null) return;
Clip clip;
try {
AudioInputStream ais =
AudioSystem.getAudioInputStream(
JukeBox.class.getResourceAsStream(s)
);
AudioFormat baseFormat = ais.getFormat();
AudioFormat decodeFormat = new AudioFormat(
AudioFormat.Encoding.PCM_SIGNED,
baseFormat.getSampleRate(),
16,
baseFormat.getChannels(),
baseFormat.getChannels() * 2,
baseFormat.getSampleRate(),
false
);
AudioInputStream dais = AudioSystem.getAudioInputStream(decodeFormat, ais);
clip = AudioSystem.getClip();
clip.open(dais);
clips.put(n, clip);
}
catch(Exception e) {
e.printStackTrace();
}
}
public static void play(String s) {
play(s, gap);
}
public static void play(String s, int i) {
if(mute) return;
Clip c = clips.get(s);
if(c == null) return;
if(c.isRunning()) c.stop();
c.setFramePosition(i);
while(!c.isRunning()) c.start();
}
public static void stop(String s) {
if(clips.get(s) == null) return;
if(clips.get(s).isRunning()) clips.get(s).stop();
}
public static void resume(String s) {
if(mute) return;
if(clips.get(s).isRunning()) return;
clips.get(s).start();
}
public static void loop(String s) {
loop(s, gap, gap, clips.get(s).getFrameLength() - 1);
}
public static void loop(String s, int frame) {
loop(s, frame, gap, clips.get(s).getFrameLength() - 1);
}
public static void loop(String s, int start, int end) {
loop(s, gap, start, end);
}
public static void loop(String s, int frame, int start, int end) {
stop(s);
if(mute) return;
clips.get(s).setLoopPoints(start, end);
clips.get(s).setFramePosition(frame);
clips.get(s).loop(Clip.LOOP_CONTINUOUSLY);
}
public static void setPosition(String s, int frame) {
clips.get(s).setFramePosition(frame);
}
public static int getFrames(String s) { return clips.get(s).getFrameLength(); }
public static int getPosition(String s) { return clips.get(s).getFramePosition(); }
public static void close(String s) {
stop(s);
clips.get(s).close();
}
}`
这是Audio类:`
id title format region discs user_id origin_id
------------------------------------------------------------------------
1 12 Monkeys DVD NULL NULL NULL NULL
2 Twelve Monkeys NULL NULL 1 2 1
答案 0 :(得分:2)
来自Javadoc(我的hilighting):
public static AudioInputStream getAudioInputStream(InputStream stream) throws UnsupportedAudioFileException, IOException
从提供的输入流中获取音频输入流。流必须指向有效的音频文件数据。 此方法的实现可能需要多个解析器检查流以确定它们是否支持它。这些解析器必须能够标记流,读取足够的数据以确定它们是否支持流,如果没有,则将流的读指针重置为其原始位置。如果输入流不支持这些操作,则此方法可能会因IOException而失败。
您似乎是从包含代码和声音文件的jar文件运行的。从InputStream
返回的getResourceAsStream()
将无法正常工作,因为ZipInputStream
会将mark()
视为无操作,并会抛出{IOException
。 {1}} reset()
。
要解决此问题,您只需将输入流包装在BufferedInputStream
。
AudioInputStream ais =
AudioSystem.getAudioInputStream(
new BufferedInputStream(
JukeBox.class.getResourceAsStream(s)
)
};
答案 1 :(得分:0)
感谢大家的帮助,但我发现只有.mp3文件可以工作,而不是其他任何东西,因为它没有正确处理和编码。我知道这很简单,而且我还没有能力把它带到任何类型的声音文件中,所以我只是把它留给那些有同样问题和避风港的人。想到最简单的答案让我花了很长时间才弄明白。 谢谢!