MidiUnavailableException в Java? - PullRequest
       13

MidiUnavailableException в Java?

8 голосов
/ 18 апреля 2009

У меня проблемы с проигрыванием MIDI-файлов на Java. Я получаю 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 является Sequencer; sound1 является InputStream.

Этот код работает на нескольких других компьютерах и даже работает в Eclipse и при использовании в файле JAR, но не при запуске из командной строки. Я скачал более стабильное миди-приложение на Java, и оно выдало то же исключение.

Это не может быть аппаратная проблема, потому что Eclipse может запустить его без проблем, равно как и проблема с кодированием, потому что это правильно работает на других компьютерах. Даже эта строка кода выдает это исключение:

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

Заранее спасибо.

edit: Моя операционная система - Windows Vista. Прежде чем задавать этот вопрос, я скачал последние версии JRE и JDK (я думаю, что 1.6.0_13).

редактировать: код:

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

выводит «Класс секвенсора загружен».

Но этот код:

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

дает мне это:

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

Ответы [ 9 ]

4 голосов
/ 19 апреля 2009

Сначала взгляните на возможности вашей системы:

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

Если там ничего нет, вам может понадобиться установить soundbanks , чтобы включить jvm для создания программного секвенсора.

Также проверьте вывод MidiSystem.getReceiver (), так как страшное MidiUnavailableException также произойдет, если получатель не может быть создан ( MidiSystem javadoc ).

Я ожидаю, что установка файла soundbank даст jvm возможность использовать приемник синтезатора и больше не будет требовать аппаратного доступа (что, по-видимому, дает сбой:)

2 голосов
/ 06 ноября 2010

Если у вас установлен 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

Также удалите ссылку на sound.jar из PATH и CLASSPATH Это старый sound.jar, который портит новый звуковой API в новых версиях Java.

2 голосов
/ 24 апреля 2009

Кроме того (еще один снимок в темноте), вы можете попробовать сделать жесткое завершение работы любого другого приложения, которое может использовать звук и, в частности, устройства Midi? Я знаю, что люди сталкиваются с этой проблемой в некоторых Linux, когда другое приложение использует Midi и не выпускает ее.

2 голосов
/ 24 апреля 2009

Когда запуск из командной строки приводит к сбою, но запуск из JAR работает, я бы проверил, действительно ли вы используете одну и ту же версию Java для обоих случаев. Для Jar проверьте сопоставления файлов в проводнике Windows, а для командной строки проверьте, выводит ли java -version ожидаемую версию (если нет, покопайтесь в переменной PATH).

2 голосов
/ 18 апреля 2009

Возможно ли, что это как-то связано с разрешениями? Если вы запускаете файл JAR от имени другого (более привилегированного) пользователя, чем обычная программа командной строки, это может объяснить разницу. Если это не так, может быть, какое-то системное свойство Java ... Я не могу думать ни о чем другом, что могло бы повлиять на выполнение того же кода, что и файл JAR, или отдельных файлов .class.

Это может помочь, если вы отредактируете вопрос, чтобы предоставить более подробную информацию о различных способах запуска программы.

1 голос
/ 06 июля 2010

У меня была такая же проблема. Ошибка была вызвана JMF, включенным в classpath.

1 голос
/ 19 мая 2009

Я обнаружил ту же проблему: невозможно воспроизвести 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 дал результат: Исключение в потоке "основной" в 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) at ivan.seaquest.MidiTester.main (MidiTester.java:7)

Я собираюсь создать ошибку в Sun. Надеюсь, это поможет ...

1 голос
/ 24 апреля 2009

Укажите проводник на вашу папку JRE (та, что находится над папкой bin на $ PATH, которую вы используете для запуска программы), например. "C: \ Program Files \ Java \ jre1.6.0"

Перейдите в папку \ lib. Вы видите папку с названием «аудио»? Есть ли в нем что-нибудь? Если нет, перейдите к http://java.sun.com/products/java-media/sound/soundbanks.html

загрузите любой из банков MIDI, как описано, и скопируйте его в указанную папку. дайте нам знать, если это работает!

1 голос
/ 18 апреля 2009

Не могли бы вы добавить свою операционную систему и версию Java?

И опубликовать исключение; Java, как правило, справляется со своей задачей, говоря что не так. Это просто не всегда легко понять:)

На моем Mac с Java 1.5.0_16 я не получаю исключение (в командной строке).

Следующая программа

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

Это, по крайней мере, прояснит, есть ли у вас классы (в java, доступ к которым осуществляется через PATH), или это что-то иное, например проблема с разрешениями.

...