Java中的MidiUnavailableException?

Bai*_* Li 8 java audio midi

我在使用Java播放MIDI文件时遇到了一些麻烦.我得到的是MidiUnavailableException (MIDI OUT transmitter not available)当我尝试播放时.我的代码是标准的:

try {
    midiseq = MidiSystem.getSequencer();
    midiseq.open();
    midiseq.setSequence(MidiSystem.getSequence(sound1));
    midiseq.setLoopCount(Sequencer.LOOP_CONTINUOUSLY);
    midiseq.start();
} catch (Exception e) {e.printStackTrace();}
Run Code Online (Sandbox Code Playgroud)

midiseq是一个Sequencer; sound1是一个InputStream.

此代码可以在其他几台计算机上运行,​​甚至可以在Eclipse中使用,当在JAR文件中使用时,只是在我从命令提示符启动它时.我已经下载了一个更稳定的Java midi应用程序,它也引发了同样的异常.

它不能成为硬件问题,因为Eclipse可以毫无问题地运行它,也不会成为编码问题,因为它在其他计算机上运行正常.即使这一行代码抛出此异常:

javax.sound.midi.MidiSystem.getSequencer();
Run Code Online (Sandbox Code Playgroud)

提前致谢.

编辑:我的操作系统是Windows Vista.在我问这个问题之前,我已经下载了最新的JRE和JDK(我认为是1.6.0_13).

编辑:代码:

ClassLoader.getSystemClassLoader().loadClass("com.sun.media.sound.RealTimeSequencer");
System.out.println( "Sequencer class loaded" );// Otherwise ClassNotFoundException
Run Code Online (Sandbox Code Playgroud)

打印"已加载Sequencer类".

但是这段代码:

  try{
        System.out.println(javax.sound.midi.MidiSystem.getSequencer());
        System.exit(0);
      } catch(Exception e) {
        throw new RuntimeException(e);
      }
      System.exit(1);
Run Code Online (Sandbox Code Playgroud)

扔了 MidiUnavailableException.

此外,这段代码:

    MidiDevice.Info[] devices = MidiSystem.getMidiDeviceInfo();
    if (devices.length == 0) {
        System.out.println("No MIDI devices found");
    } else {
        for (MidiDevice.Info dev : devices) {
            System.out.println(dev);
        }
    }
Run Code Online (Sandbox Code Playgroud)

给我这个:

    Microsoft MIDI Mapper
    Microsoft GS Wavetable Synth
    Real Time Sequencer
    Java Sound Synthesizer

Dav*_*d Z 2

有没有可能和权限有关系?如果您以与普通命令行程序不同(权限更高)的用户身份运行 JAR 文件,则可能可以解释其中的差异。如果不是这样,也许是一些 Java 系统属性...我想不出还有什么其他东西可以在将相同的代码作为 JAR 文件或单独的 .class 文件运行之间产生区别。

如果您编辑问题以提供有关运行程序的不同方式的更多详细信息,可能会有所帮助。