Ich habe Probleme beim Abspielen von MIDI-Dateien in Java. Was ich bekomme ist ein MidiUnavailableException (MIDI OUT transmitter not available)
wenn ich versuche es zu spielen. Mein Code ist Standard:
midiseq
ist ein Sequencer
; sound1
ist ein InputStream
.
Dieser Code funktioniert auf mehreren anderen Computern und funktioniert sogar in Eclipse und bei Verwendung in einer JAR-Datei, nur nicht, wenn ich ihn von der Eingabeaufforderung aus starte. Ich habe eine stabilere Java Midi-Anwendung heruntergeladen, und es gab die gleiche Ausnahme.
Es kann kein Hardwareproblem sein, weil Eclipse es ohne Probleme ausführen kann, und auch kein Codeproblem, weil es auf anderen Computern korrekt läuft. Auch diese eine Codezeile löst diese Ausnahme aus:
%Vor%Vielen Dank im Voraus.
edit: Mein Betriebssystem ist Windows Vista. Bevor ich diese Frage gestellt habe, habe ich die neueste JRE und JDK (1.6.0_13 denke ich) heruntergeladen.
edit: Der Code:
%Vor%druckt "Sequencer-Klasse geladen."
Aber dieser Code:
%Vor% wirft das MidiUnavailableException.
Auch dieser Code:
%Vor%gibt mir das:
%Vor%Sehen Sie sich zunächst die Möglichkeiten Ihres Systems an:
%Vor%Wenn dort nichts ist, müssen Sie möglicherweise soundbanks installieren, um das Programm zu aktivieren jvm um einen Software Sequenzer zu erstellen.
Überprüfen Sie auch die Ausgabe von MidiSystem.getReceiver (), da die gefürchtete MidiUnavailableException auch auftritt, wenn kein Empfänger erstellt werden kann (MidiSystem javadoc ).
Ich erwarte, dass die Installation der Soundbank-Datei dem jvm die Möglichkeit gibt, auf einen Synthesizer-Empfänger zurückzugreifen und keinen Hardware-Zugriff mehr zu benötigen (der anscheinend fehlschlägt:)
Ist es möglich, dass es etwas mit Berechtigungen zu tun hat? Wenn Sie die JAR-Datei als einen anderen (mehr privilegierten) Benutzer als das einfache Befehlszeilenprogramm ausführen, könnte das den Unterschied erklären. Wenn es das nicht ist, vielleicht eine Java-Systemeigenschaft ... Ich kann mir nichts anderes vorstellen, das einen Unterschied zwischen der Ausführung desselben Codes wie eine JAR-Datei oder als einzelne .class-Dateien machen würde.
Es kann hilfreich sein, wenn Sie die Frage bearbeiten, um mehr Details zu den verschiedenen Möglichkeiten zu erhalten, auf denen Sie das Programm ausgeführt haben.
Wenn das Starten über die Befehlszeile fehlschlägt, aber das Starten von einer JAR funktioniert, würde ich prüfen, ob Sie für beide Fälle die gleiche Java-Version verwenden. Überprüfen Sie für das Jar Dateizuordnungen in Windows Explorer, und überprüfen Sie für die Befehlszeile, ob Java-Version die erwartete Version ausgibt (wenn nicht, durchsuchen Sie Ihre PATH-Variable).
Auch (eine weitere Aufnahme im Dunkeln), können Sie versuchen, eine Hard-Shutdown-Funktion für eine andere Anwendung auszuführen, die möglicherweise Sound- und speziell Midi-Geräte verwendet? Ich weiß, dass Leute dieses Problem auf einigen Linuxes bekommen, wenn eine andere Anwendung Midi benutzt und sie nicht veröffentlicht.
Wenn JMF2.1.1e installiert ist, entfernen Sie alle sound.jar-Dateien, die nicht nur im JMF-Verzeichnis, sondern auch in den Verzeichnissen jre und jdk installiert sind.
Ссылка sagt:
Das Problem ist die Datei sound.jar Finde sie an 3 Stellen und lösche sie.
C: \ Programme \ JMF2.1.1e \ lib \ sound.jar
C: \ Programme \ Java \ jdk1.6.0_07 \ jre \ lib \ ext \ sound.jar
C: \ Programme \ Java \ jre1.6.0_07 \ lib \ ext \ sound.jar
Entfernen Sie auch die sound.jar-Referenz von PATH und CLASSPATH Dies ist eine alte sound.jar, die die neue Sound-API in den neuen Java-Versionen durcheinander bringt.
Können Sie Ihr Betriebssystem und Ihre Java-Version hinzufügen?
Und poste die Ausnahme; Java macht im Allgemeinen einen fairen Job und sagt, was falsch ist. Es ist einfach nicht immer einfach zu verstehen:)
Auf meinem Mac mit Java 1.5.0_16 bekomme ich keine Ausnahme (in der Kommandozeile).
Das folgende Programm
%Vor%druckt
%Vor%Sie können überprüfen, ob Sie die Sequenzer-Klasse im Klassenpfad haben:
%Vor%Dies würde zumindest klarstellen, ob Sie die Klassen nicht haben (in dem Java, auf das über den PATH zugegriffen wird), oder ob es etwas anderes ist als ein Berechtigungsproblem.
Zeigen Sie den Explorer auf Ihren JRE-Ordner (den Ordner oberhalb des bin-Ordners auf dem $ PATH, mit dem Sie das Programm ausführen), z. "C: \ Programme \ Java \ jre1.6.0"
Gehen Sie in den Ordner \ lib. Siehst du einen Ordner namens "Audio"? Hat es etwas in? Wenn nicht, gehen Sie zu Ссылка
Laden Sie eine der MIDI-Bänke wie beschrieben herunter und kopieren Sie sie in den genannten Ordner. lass es uns wissen, wenn es funktioniert!
Ich habe das gleiche Problem gefunden: MIDI kann nicht wiedergegeben werden. Aber ich habe festgestellt, dass das Problem gestartet wurde, wenn ich das JDK von 1.6.0_10 auf 1.6.0_13 aktualisiere.
Ich habe beide JDKs mit dem einfachen Programm getestet:
Öffentliche Klasse MidiTester {
%Vor%}
JDK 1.6.0_10 gab das Ergebnis: com.sun.media.sound.RealTimeSequencer@1bd747
JDK 1.6.0_13 gab das Ergebnis: Ausnahme im Thread "main" java.lang.RuntimeException: javax.sound.midi.MidiUnavailableException: MIDI OUT-Sender nicht verfügbar bei ivan.seaquest.MidiTester.main (MidiTester.java:10) Verursacht von: javax.sound.midi.MidiUnavailableException: MIDI OUT-Sender nicht verfügbar bei com.sun.media.sound.AbstractMidiDevice.createTransmitter (AbstractMidiDevice.java:444) unter com.sun.media.sound.AbstractMidiDevice.getTransmitter (AbstractMidiDevice.java:299) bei javax.sound.midi.MidiSystem.getSequencer (MidiSystem.java:451) bei javax.sound.midi.MidiSystem.getSequencer (MidiSystem.java:348) bei ivan.seaquest.MidiTester.main (MidiTester.java:7)
Ich werde einen Fehler bei Sun erstellen. Ich hoffe es hilft ...