8

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

midiseq是一个Sequencersound1是一个InputStream

此代码适用于其他几台计算机,甚至适用于 Eclipse 以及在 JAR 文件中使用时,只是在我从命令提示符启动它时不起作用。我下载了一个更稳定的 Java midi 应用程序,它抛出了同样的异常。

它不可能是硬件问题,因为 Eclipse 可以毫无问题地运行它,也不可能是编码问题,因为它可以在其他计算机上正常运行。甚至这一行代码也会抛出这个异常:

javax.sound.midi.MidiSystem.getSequencer();

提前致谢。

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

编辑:代码:

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

打印“Sequencer 类已加载。”

但是这段代码:

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

抛出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);
        }
    }

给了我这个:

    微软 MIDI 映射器
    Microsoft GS 波表合成器
    实时音序器
    Java 声音合成器
4

9 回答 9

4

首先看一下您的系统的功能:

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

如果那里什么都没有,您可能需要安装音库以使 jvm 能够创建软件音序器。

还要检查 MidiSystem.getReceiver() 的输出,因为如果无法创建接收器(MidiSystem javadoc),也会发生可怕的 MidiUnavailableException。

我希望安装 soundbank 文件将使 jvm 有机会退回到合成器接收器,并且不再需要硬件访问(这似乎失败了:)

于 2009-04-19T08:04:26.147 回答
2

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

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

于 2009-04-18T04:59:51.667 回答
2

另外(在黑暗中再次拍摄),您能否尝试对任何其他可能使用声音,特别是 Midi 设备的应用程序进行硬关机?我知道当另一个应用程序使用 Midi 并且没有发布它时,人们会在某些 Linux 上遇到这个问题。

于 2009-04-23T21:18:38.080 回答
2

当从命令提示符启动失败,但从 JAR 启动时,我会检查你是否真的在这两种情况下使用相同的 Java 版本。对于 Jar,检查 Windows 资源管理器中的文件关联,对于命令行,检查 java -version 是否输出预期的版本(如果没有,挖掘您的 PATH 变量)。

于 2009-04-23T21:13:32.507 回答
2

安装 JMF2.1.1e 后,删除所有 sound.jar 文件,这些文件不仅安装在 JMF 目录中,还安装在 jre 和 jdk 目录中。

http://www.coderanch.com/t/274513/java/java/javax-sound-midi-compatibility-JMF说:

问题是文件sound.jar 在3个地方找到它并删除它。

C:\Program Files\JMF2.1.1e\lib\sound.jar

C:\Program Files\Java\jdk1.6.0_07\jre\lib\ext\sound.jar

C:\Program Files\Java\jre1.6.0_07\lib\ext\sound.jar

此外,从 PATH 和 CLASSPATH 中删除 sound.jar 引用 这是一个旧的 sound.jar,它在新版本的 Java 中弄乱了新的声音 API。

于 2010-11-06T12:43:33.883 回答
1

我曾经也有过一样的问题。该错误是由类路径中包含的 JMF 引起的。

于 2010-07-05T21:28:04.687 回答
1

我发现了同样的问题:无法播放 MIDI。但是我注意到,当我将 JDK 从 1.6.0_10 升级到 1.6.0_13 时,问题就开始了。

我用简单的程序测试了两个 JDK:

公共类 MidiTester {

public static void main(String[] args) {
  try{
    System.out.println(javax.sound.midi.MidiSystem.getSequencer());
    System.exit(0);
  } catch(Exception e) {
    throw new RuntimeException(e);
  }
  System.exit(1);
}

}

JDK 1.6.0_10 给出了结果:com.sun.media.sound.RealTimeSequencer@1bd747

JDK 1.6.0_13 给出了结果:线程“main”中的异常 java.lang.RuntimeException: javax.sound.midi.MidiUnavailableException: MIDI OUT 发射器在 ivan.seaquest.MidiTester.main(MidiTester.java:10) 处不可用: javax.sound.midi.MidiUnavailableException: MIDI OUT 发射器在 com.sun.media.sound.AbstractMidiDevice.createTransmitter(AbstractMidiDevice.java:444) 在 com.sun.media.sound.AbstractMidiDevice.getTransmitter(AbstractMidiDevice.java: 299) 在 javax.sound.midi.MidiSystem.getSequencer(MidiSystem.java:451) 在 javax.sound.midi.MidiSystem.getSequencer(MidiSystem.java:348) 在 ivan.seaquest.MidiTester.main(MidiTester.java:7 )

我将在 Sun 创建一个错误。我希望它有帮助...

于 2009-05-19T03:48:15.283 回答
1

你能添加你的操作系统和java版本吗?

并发布异常;Java 通常可以很好地说明问题所在。这并不总是很容易理解:)

在我的带有 java 1.5.0_16 的 mac 上,我没有收到异常(在命令行上)。

以下程序

public class MidiTester {

    public static void main(String[] args) {
      try{
        System.out.println(javax.sound.midi.MidiSystem.getSequencer());
        System.exit(0);
      } catch(Exception e) {
        throw new RuntimeException(e);
      }
      System.exit(1);
    }
}

印刷

com.sun.media.sound.RealTimeSequencer@d08633

您可以检查类路径上是否有定序器类:

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

这至少可以清楚地表明您是否没有类(在通过 PATH 访问的 java 中),或者它是否与权限问题等不同。

于 2009-04-18T12:29:56.873 回答
1

将资源管理器指向您的 JRE 文件夹(您用于运行程序的 $PATH 上 bin 文件夹上方的那个),例如“C:\Program Files\Java\jre1.6.0”

进入 \lib 文件夹。您是否看到一个名为“audio”的文件夹?里面有东西吗?如果没有,请访问http://java.sun.com/products/java-media/sound/soundbanks.html

按照说明下载任何 MIDI 库,并将其复制到上述文件夹中。让我们知道它是否有效!

于 2009-04-24T13:10:47.290 回答