gpt4 book ai didi

Java 声音适用于 JRE6,但不适用于 JRE7

转载 作者:行者123 更新时间:2023-12-02 06:36:50 24 4
gpt4 key购买 nike

我一直在绞尽脑汁地试图解决这个问题,我一直在研究的计算器中有这个方法:

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 似乎在 JRE 1.7 中放弃了“Java Sound Audio Engine”,这是我唯一可以归因的事情?

最佳答案

“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 中应该可以解决这个问题(不过您可能需要增加缓冲区大小)。

编辑2:尝试重复声音:

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

唯一复杂的事情是您需要音频流来获取格式,并且您还需要在每次循环迭代中重新创建它以从头开始读取它。其他一切保持不变。

关于Java 声音适用于 JRE6,但不适用于 JRE7,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19563957/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com