【问题标题】:MidiSystem.getSequencer() returns Audio Device UnavailableMidiSystem.getSequencer() 返回音频设备不可用
【发布时间】:2010-04-26 17:49:21
【问题描述】:

我一直在不断地抛出异常。 当我尝试创建一个新的 Sequencer 对象时,我不断收到 javax.sound.midi.MidiUnavailableException: Audio Device Unavailable 异常。 所以,这里是代码:

import javax.sound.midi.*;

public class MiniMusicPlayer1
{
  public static void main(String[] args)
  {
    try
    {
      Sequencer sequencer = MidiSystem.getSequencer();
      sequencer.open();
      Sequence seq = new Sequence(Sequence.PPQ, 4);
      Track track = seq.createTrack();
      for (int i = 5; i < 61; i += 4)
      {
        track.add(makeEvent(144, 1, i, 100, i));
        track.add(makeEvent(128, 1, i, 100, (i+2)));
      }
      sequencer.setSequence(seq);
      sequencer.setTempoInBPM(220);
      sequencer.start();            
    }
    catch (Exception e)
    {
      e.printStackTrace();
    }
  }

  public static MidiEvent makeEvent(int comd, int chan, int one, int two, int tick)
  {
    MidiEvent event = null;
    try
    {
      ShortMessage a = new ShortMessage();
      a.setMessage(comd, chan, one, two);
      event = new MidiEvent(a, tick);
    }
    catch (Exception e)
    {
      e.printStackTrace();
    }
    return event;
  }
}

这是完整的错误(编译时):

javax.sound.midi.MidiUnavailableException: Audio Device Unavailable
    at com.sun.media.sound.MixerSynth.implOpen(MixerSynth.java:165)
    at com.sun.media.sound.AbstractMidiDevice.doOpen(AbstractMidiDevice.java:144)
    at com.sun.media.sound.AbstractMidiDevice.openInternal(AbstractMidiDevice.java:134)
    at com.sun.media.sound.AbstractMidiDevice.getReceiverReferenceCounting(AbstractMidiDevice.java:339)
    at javax.sound.midi.MidiSystem.getReceiver(MidiSystem.java:243)
    at javax.sound.midi.MidiSystem.getSequencer(MidiSystem.java:442)
    at javax.sound.midi.MidiSystem.getSequencer(MidiSystem.java:348)
    at MiniMusicPlayer1.main(MiniMusicPlayer1.java:9)

首先我无法在我的电脑上播放 MIDI 文件,但后来我让它工作了,所以现在我可以播放 MIDI 文件了,没关系。 我什至尝试关闭使用我的声卡的每个进程,但错误仍然存​​在。 谁能帮帮我?

【问题讨论】:

  • “一开始我无法在我的电脑上播放 MIDI 文件,但后来我让它工作了,所以现在我可以播放 MIDI 文件了,没关系”听起来你能正常工作吗?你什么意思?您应该删除“编译器错误”标签。这是典型的运行时错误。
  • 我现在可以用另一个程序播放 MIDI 文件,比如说胆怯,但我无法让这个代码工作。它总是告诉我“音频设计不可用”。我试图以root身份运行它,同样的错误。试图杀死所有使用我的声卡的进程,仍然得到这个错误。

标签: java sequence midi runtime-error


【解决方案1】:

检查您的进程列表,看看是否有任何程序副本正在运行。如果它曾经有效,那么这条线很有可能:

sequencer.open();

失败,因为排序器已被另一个程序打开以进行独占访问。可能,该“其他程序”只是您正在运行的程序的副本,无论出于何种原因仍在运行。如果是这样,那么要关闭的程序可能是“java”程序之一。听起来您已经尝试过关闭其他 MIDI 程序。

另外,您可能打开了“错误”的 MIDI 设备。

Sequencer sequencer = MidiSystem.getSequencer();

只会打开“默认”设备。此默认设备可能配置错误或不可用,而您的工作程序使用的设备可能不同。这种事情发生的可能性很小,但你可能想编写类似的代码

MidiSystem.getMidiDeviceInfo()

并浏览返回的设备,如本摘录所示

// Obtain information about all the installed synthesizers.
Vector synthInfos;
MidiDevice device;
MidiDevice.Info[] infos = MidiSystem.getMidiDeviceInfo();
for (int i = 0; i < infos.length; i++) {
    try {
        device = MidiSystem.getMidiDevice(infos[i]);
    } catch (MidiUnavailableException e) {
          // Handle or throw exception...
    }
    if (device instanceof Synthesizer) {
        synthInfos.add(infos[i]);
    }
}
// Now, display strings from synthInfos list in GUI.

http://java.sun.com/docs/books/tutorial/sound/accessing-MIDI.html有更详细的解释

【讨论】:

  • 我从这段代码得到的输出是: Real Time Sequencer Java Sound Synthesizer 我试图对程序进行 strace,但在 /dev/.. .
【解决方案2】:

我不会试图解释这个错误,但我做了以下事情来解决与你的问题相似的问题。

1.安装胆小播放器

$ sudo apt-get install timidity

安装后执行播放器

$ aplaymidi -l

1    Port    Client name                      Port name
2    14:0    Midi Through                     Midi Through Port-0

如果上面的命令不起作用,你可能需要重启机器

2。完成安装 alsa-oss ALSA(高级 Linux 声音架构)

$ sudo apt-get install alsa-oss

3.执行文件

$ aoss java MidiClassTest

如果您使用 Eclipse 或您可能想要使用的其他 IDE,作为实例

$ aoss eclipse

或使用别名

alias eclipse='aoss eclipse-indigo &amp;'

【讨论】:

    【解决方案3】:

    我的猜测是:

    1. 您的系统没有硬件合成器(或者可能有,但您的声卡驱动程序无法识别它。)
    2. Java 声音合成器无法打开,因为您没有安装音库
    3. 您仍然可以使用MidiSystem.getSequencer(false) 获得未连接 排序器,尽管这不是很有用。

    像胆小的应用程序不会受到影响,因为它们执行自己的软件合成。

    也许可以使用virtual MIDI port 来玩转 Java 中的胆小。

    【讨论】:

      猜你喜欢
      • 2020-08-21
      • 2020-10-17
      • 2015-05-07
      • 1970-01-01
      • 2021-09-03
      • 1970-01-01
      • 1970-01-01
      • 2013-02-09
      • 1970-01-01
      相关资源
      最近更新 更多