较新版本的 JRE 不加载音库,但旧版本可以
Posted
技术标签:
【中文标题】较新版本的 JRE 不加载音库,但旧版本可以【英文标题】:Newer version of JRE doesn't load soundbank but older version does 【发布时间】:2013-04-14 07:20:57 【问题描述】:我有以下代码尝试加载音库。我已经使用 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
【问题讨论】:
我只是好奇,你试过 Java 1.7 吗? 搜索bug DB。如果什么都没有,请提出一个新的。 @Telthien 1.7 出现同样的错误 那么我同意安德鲁的建议。 【参考方案1】:从Java Sound API: Soundbanks 页面复制粘贴
Java 声音 API
此页面提供不同的音库,您可以下载和使用 与 Java 声音。 Soundbanks 是正确操作的必要条件 Java Sound 附带的内部软件合成器。默认情况下, J2RE 的 Windows 版本不附带音库,因此您 需要手动安装一个才能使用 Java Sound 的 MIDI 引擎。爪哇 声音有一个备用机制,如果没有,则使用硬件 MIDI 端口 soundbank 可用,但它会阻止可靠和一致的 MIDI 播放,因此建议为 Java 安装音库 声音。
如您所见,Java Sound API 需要安装,所以如果您安装了较新的 JDK,则必须redo the installation。
您的问题附近似乎有一个错误:4887447,存在解决方法,但如果 banksound 在 JAR 中则不存在
【讨论】:
我将soundbank.gm文件作为资源加载,所以不需要单独安装。【参考方案2】:我遇到了同样的问题,根据我的发现,最新版本的 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 格式(我尝试过你正在做的事情并且它有效)。在 Internet 上查看这些文件,例如这里: http://www.ronimusic.com/smp_ios_dls_files.htm
【讨论】:
以上是关于较新版本的 JRE 不加载音库,但旧版本可以的主要内容,如果未能解决你的问题,请参考以下文章
如何在较新版本的打字稿中处理打字稿错误 Object.ts (7053)?
SVG sprite 图标背景位置在较新版本的 Chrome 中显示为关闭
为啥在较新版本的 Keycloak 中不允许使用身份验证流程中的脚本