我试着用Java播放一个声音。到目前为止一切都很顺利,谢谢,但我很难理解这是如何工作的。
我编写了一个函数,用于播放:
private static void PlaySound(String path) {
try {
final File SoundFile = new File(path);
AudioInputStream Sound = AudioSystem.getAudioInputStream(SoundFile);
DataLine.Info info = new DataLine.Info(Clip.class, Sound.getFormat());
Clip clip = (Clip) AudioSystem.getLine(info);
clip.open(Sound);
clip.addLineListener(new LineListener() {
public void update (LineEvent event) {
if (event.getType() == LineEvent.Type.STOP) {
event.getLine().close();
System.out.printf("Playback ended!");
System.exit(0);
}
}
});
System.out.printf("This sound is %f seconds long.", (clip.getMicrosecondLength() / 1000.0d));
clip.start();
} catch (Exception e) {
ErrorHandler(e);
}
}现在,这个函数几乎可以正常工作:当声音结束时,它调用event.getLine().close();函数,但是它被卡在一个“无限循环”中(不确定是否是),在执行该语句之后什么都没有,直到我手动杀死它为止。
如果我改变了路线
if (event.getType() == LineEvent.Type.STOP) {至
if (event.getType() == LineEvent.Type.CLOSE) {然后播放声音,程序正确退出,但在event.getLine().close();之后仍然没有执行任何语句。
问题是:这是event.getLine().close()的预期行为,还是我做错了什么?
解决方案:
LineListener实际上是基于一个过时的事实,即Java中有一个bug,我们需要显式地退出vm。没有侦听器,代码就能正常工作。
发布于 2011-11-25 17:16:54
看看它是否引发了一个例外:
public void update (LineEvent event) {
if (event.getType().equals(LineEvent.Type.STOP)) {
try {
event.getLine().close();
} catch (Throwable t) {
t.printStackTrace();
}
System.out.printf("Playback ended!");
}
}https://stackoverflow.com/questions/8271901
复制相似问题