Java Sounds适用于JRE6但不适用于JRE7

时间:2013-10-24 10:55:08

标签: java audio

我一直在试图解决这个问题,我已经在我正在研究的计算器中使用这种方法:

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中,这是我唯一可以理解的内容吗?

1 个答案:

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

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