较新版本的JRE不加载soundbank但旧版本加载

时间:2013-04-14 07:20:57

标签: audio java midi javax.sound.midi

我有以下代码尝试加载声音库。我已经使用JRE 1.6.03和1.6.43在Windows 7上测试了代码。旧版本的JRE(1.6.03)工作正常,但新版本引发异常。发生了什么事?

public Main() {
    try {
        Synthesizer synth = MidiSystem.getSynthesizer();
        synth.open();
        BufferedInputStream soundBankStream = new BufferedInputStream(
                getClass().getClassLoader().getResourceAsStream(
                        "soundbank.gm"));
        synth.loadAllInstruments(MidiSystem.getSoundbank(soundBankStream));
    } catch (MidiUnavailableException e) {
        e.printStackTrace();
    } catch (InvalidMidiDataException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

F:\>java -version
java version "1.6.0_03"
Java(TM) SE Runtime Environment (build 1.6.0_03-b05)
Java HotSpot(TM) 64-Bit Server VM (build 1.6.0_03-b05, mixed mode)

F:\>java -jar Test2.jar

F:\>"C:\Program Files\Java\jre6\bin\java.exe" -version
java version "1.6.0_43"
Java(TM) SE Runtime Environment (build 1.6.0_43-b01)
Java HotSpot(TM) 64-Bit Server VM (build 20.14-b01, mixed mode)

F:\>"C:\Program Files\Java\jre6\bin\java.exe" -jar Test2.jar
javax.sound.midi.InvalidMidiDataException: cannot get soundbank from stream
        at javax.sound.midi.MidiSystem.getSoundbank(Unknown Source)
        at com.gulshansingh.test.Main.<init>(Main.java:24)
        at com.gulshansingh.test.Main.main(Main.java:14)

您可以从此处下载音库:http://www.oracle.com/technetwork/java/soundbanks-135798.html

2 个答案:

答案 0 :(得分:0)

Java Sound API: Soundbanks页面

复制粘贴
  

Java Sound API

     

此页面提供了您可以下载和使用的不同音库   使用Java Sound。 Soundbanks是正确操作的必要条件   Java Sound附带的内部软件合成器。默认情况下,   J2RE的Windows版本没有附带音库,所以你   需要手动安装一个才能使用Java Sound的MIDI引擎。 Java的   Sound有一个后备机制,如果没有,则使用硬件MIDI端口   音库可用,但它会阻止可靠和一致的MIDI   回放,因此建议为Java安装音库   声音。

如您所见,Java Sound API需要安装,因此如果您安装了较新的JDK,则必须redo the installation

一个错误似乎在您的问题附近:4887447,存在一种解决方法,但如果bankound位于JAR中则不存在

答案 1 :(得分:0)

我遇到了同样的问题,根据我的发现,最新版本的java(1.7 +),不再支持GM音库

http://www.oracle.com/technetwork/java/javase/compatibility-417013.html#incompatibilities

  

Java Sound包中的软件合成器实现已被替换为开源版本。由于更换,删除了以下功能:   GM音库支持,   RMF文件播放支持,   Linux平台上支持OSS(开放式音响系统)。   新的合成器实现支持DLS和SoundFont(SF2)格式的音库。

正如它所说,它支持DLS和SF2 Soundbank格式(我尝试过你正在做的事情并且它有效)。在互联网上浏览这些文件,例如: http://www.ronimusic.com/smp_ios_dls_files.htm