我一直在试图解决这个问题,我已经在我正在研究的计算器中使用这种方法:
public void error_sound() throws UnsupportedAudioFileException, IOException, LineUnavailableException {
AudioInputStream AIS = AudioSystem.getAudioInputStream(calculator.class.getResourceAsStream("/resources/Error.wav"));
AudioFormat format = AIS.getFormat();
SourceDataLine playbackLine = AudioSystem.getSourceDataLine(format);
playbackLine.open(format);
playbackLine.start();
int bytesRead = 0;
byte[] buffer = new byte[128000];
while (bytesRead != -1) {
bytesRead = AIS.read(buffer, 0, buffer.length);
if (bytesRead >= 0)
playbackLine.write(buffer, 0, bytesRead);
}
playbackLine.drain();
playbackLine.close();
}
此代码适用于JRE6,但不适用于JRE7。如果有人可以建议一种方法在JRE7上完成上述工作,我会永远感激吗?
Sun似乎放弃了#Java ;;声音音频引擎"在JRE 1.7中,这是我唯一可以理解的内容吗?
答案 0 :(得分:2)
“看来Sun在JRE 1.7中删除了”Java Sound Audio Engine“,这是我唯一可以理解的内容吗?”
不, 会被包括我在内的很多人注意到。您的评论表明资源输入流中存在寻找的问题。这可能是由不同的音频系统或getAudioStream()的不同实现引起的。
您可以尝试将资源流包装到BufferedInputStream中:
InputStream raw = calculator.class.getResourceAsStream("/resources/Error.wav");
InputStream bis = new BufferedInputStream(raw, 20000);
AudioInputStream ais = AudioSystem.getAudioInputStream(bis);
(这就是基于BufferedInputStream支持标记/重置的想法)
您应该真正为代码添加一些正确的错误处理(检查资源是否存在等等以及正确的错误记录/报告)。如果能够清楚地报告问题,那么从长远来看确实很有帮助。
编辑:重新阅读你的问题描述,它清楚你正在运行eclipse中的代码,以及从jar文件运行的另一台计算机上。问题是你的代码不能应付后者。将它包装到BufferedInputStream中应该解决这个问题(你可能需要增加缓冲区大小)。
Edit2:尝试重复声音:
public void error_sound() throws UnsupportedAudioFileException, IOException, LineUnavailableException {
AudioInputStream AIS = ...
AudioFormat format = ...
SourceDataLine playbackLine = ...
playbackLine.open(format);
playbackLine.start();
int repeats = 5;
while (true) {
// playloop
int bytesRead = 0;
byte[] buffer = new byte[128000];
while (bytesRead != -1) {
bytesRead = AIS.read(buffer, 0, buffer.length);
if (bytesRead >= 0)
playbackLine.write(buffer, 0, bytesRead);
}
--repeats;
if (repeats <= 0) {
// done, stop playing
break;
} else {
// repeat one more time, reset audio stream
AIS = ...
}
}
playbackLine.drain();
playbackLine.close();
}
唯一复杂的是你需要音频流来获取格式,并且你还需要在每次循环迭代中重新创建它以从头开始读取它。其他一切都保持不变。