MidiSystem.getSequencer(),而我用這種方法卻會(huì)拋出異常,無(wú)奈,我只好退而求其次了,用了這個(gè)方法,MidiSystem.getSequencer(false),得到一個(gè)看似沒(méi)有連接上設(shè)置的MIDI播放器,可是在我的電腦上卻能播.于是我就輸出我電腦上所有的MIDI設(shè)置,代碼如下:
MidiDevice.Info[] infos = MidiSystem.getMidiDeviceInfo();
for (MidiDevice.Info info : infos) {
System.out.println(info);
MidiDevice device = MidiSystem.getMidiDevice(info);
System.out.println("device=" + device);
System.out.println("is Sequencer?" + (device instanceof Sequencer));
System.out.println("is Synthesizer? " + (device instanceof Synthesizer));
System.out.println("info.name=" + info.getName());
System.out.println("info.vendor=" + info.getVendor());
System.out.println("info.description=" + info.getDescription());
System.out.println("info.toString=" + info.toString());
System.out.println("------------------------------------");
}
輸出如下:for (MidiDevice.Info info : infos) {
System.out.println(info);
MidiDevice device = MidiSystem.getMidiDevice(info);
System.out.println("device=" + device);
System.out.println("is Sequencer?" + (device instanceof Sequencer));
System.out.println("is Synthesizer? " + (device instanceof Synthesizer));
System.out.println("info.name=" + info.getName());
System.out.println("info.vendor=" + info.getVendor());
System.out.println("info.description=" + info.getDescription());
System.out.println("info.toString=" + info.toString());
System.out.println("------------------------------------");
}
Java Sound Sequencer
device=com.sun.media.sound.MixerSequencer@f10c77
is Sequencer?true
is Synthesizer? false
info.name=Java Sound Sequencer
info.vendor=Sun Microsystems
info.description=Software sequencer / synthesizer module
info.toString=Java Sound Sequencer
------------------------------------
Microsoft MIDI ???±
device=com.sun.media.sound.MidiOutDevice@dee55c
is Sequencer?false
is Synthesizer? false
info.name=Microsoft MIDI ???±
info.vendor=Unknown vendor
info.description=Windows MIDI_MAPPER
info.toString=Microsoft MIDI ???±
------------------------------------
Microsoft GS ?¨±í?í??
device=com.sun.media.sound.MidiOutDevice@1a3fb76
is Sequencer?false
is Synthesizer? false
info.name=Microsoft GS ?¨±í?í??
info.vendor=Unknown vendor
info.description=Internal software synthesizer
info.toString=Microsoft GS ?¨±í?í??
------------------------------------
Real Time Sequencer
device=com.sun.media.sound.RealTimeSequencer@76a6d9
is Sequencer?true
is Synthesizer? false
info.name=Real Time Sequencer
info.vendor=Sun Microsystems
info.description=Software sequencer
info.toString=Real Time Sequencer
------------------------------------
Java Sound Synthesizer
device=com.sun.media.sound.MixerSynth@1c42c4b
is Sequencer?false
is Synthesizer? true
info.name=Java Sound Synthesizer
info.vendor=Sun Microsystems
info.description=Software wavetable synthesizer and receiver
info.toString=Java Sound Synthesizer
------------------------------------
注意上第一個(gè)輸出,Java Sound Sequencer,這個(gè)設(shè)備是另外一臺(tái)電腦所沒(méi)有的,這個(gè)設(shè)備是裝了JMF以后才有的,后來(lái)我試著把JMF卸載了,發(fā)現(xiàn)這個(gè)設(shè)備沒(méi)了,并且我用MidiSystem.getSequencer()得到的播放器也能用了,也不用MidiSystem.getSequencer(false)了,并且MidiSystem.getSequencer(false)之后,也會(huì)出現(xiàn)沒(méi)有聲音的情況.所以我斷定一定是JMF搞的鬼了.可是怎么辦呢,總不可能不讓別人裝JMF吧,并且JMF也是多媒體播放的,我們這個(gè)工程也是要播放視頻的,沒(méi)有JMF怎么播放視頻,怎樣讓JMF和MIDI能共存呢?后來(lái)我在MidiSystem.getSequencer()的API上看到如下幾句話:
public static Sequencer getSequencer()
throws MidiUnavailableException
獲得連接到默認(rèn)設(shè)備上的默認(rèn)的 Sequencer。返回的 Sequencer 實(shí)例連接到默認(rèn)的 Synthesizer,如同由 getSynthesizer() 返回的結(jié)果。如果沒(méi)有可用的 Synthesizer,或者默認(rèn)的 Synthesizer 無(wú)法打開,則 sequencer 會(huì)連接到默認(rèn)的 Receiver,如同由 getReceiver() 返回的結(jié)果。該連接是通過(guò)從 Sequencer 檢索 Transmitter 實(shí)例并設(shè)置其 Receiver 來(lái)建立的。關(guān)閉和重新打開 sequencer 將恢復(fù)到默認(rèn)設(shè)備的連接。
此方法等效于調(diào)用 getSequencer(true)。
如果定義了系統(tǒng)屬性 javax.sound.midi.Sequencer,或者在文件 "sound.properties" 中定義了該屬性,則它可用于標(biāo)識(shí)默認(rèn)的 sequencer。有關(guān)詳細(xì)信息,請(qǐng)參閱類描述。
返回:
連接到默認(rèn) Receiver 上的默認(rèn) sequencer
拋出:
MidiUnavailableException - 如果由于資源限制使 sequencer 不可用,或者任何已安裝的 MidiDevice 上都沒(méi)有可用的 Receiver,或者系統(tǒng)中未安裝 sequencer。
throws MidiUnavailableException
獲得連接到默認(rèn)設(shè)備上的默認(rèn)的 Sequencer。返回的 Sequencer 實(shí)例連接到默認(rèn)的 Synthesizer,如同由 getSynthesizer() 返回的結(jié)果。如果沒(méi)有可用的 Synthesizer,或者默認(rèn)的 Synthesizer 無(wú)法打開,則 sequencer 會(huì)連接到默認(rèn)的 Receiver,如同由 getReceiver() 返回的結(jié)果。該連接是通過(guò)從 Sequencer 檢索 Transmitter 實(shí)例并設(shè)置其 Receiver 來(lái)建立的。關(guān)閉和重新打開 sequencer 將恢復(fù)到默認(rèn)設(shè)備的連接。
此方法等效于調(diào)用 getSequencer(true)。
如果定義了系統(tǒng)屬性 javax.sound.midi.Sequencer,或者在文件 "sound.properties" 中定義了該屬性,則它可用于標(biāo)識(shí)默認(rèn)的 sequencer。有關(guān)詳細(xì)信息,請(qǐng)參閱類描述。
返回:
連接到默認(rèn) Receiver 上的默認(rèn) sequencer
拋出:
MidiUnavailableException - 如果由于資源限制使 sequencer 不可用,或者任何已安裝的 MidiDevice 上都沒(méi)有可用的 Receiver,或者系統(tǒng)中未安裝 sequencer。
Real Time Sequencer,后來(lái)我就在jre/lib文件夾下面找到了sound.properties文件,把里面的
javax.sound.midi.Sequencer項(xiàng)的注釋去掉,改為javax.sound.midi.Sequencer
=com.sun.media.sound.RealTimeSequencerProvider ,不過(guò),還有一樣更簡(jiǎn)便的方法.那就是在程序初始化的時(shí)候加上如下代碼:
System.setProperty("javax.sound.midi.Sequencer","com.sun.media.sound.RealTimeSequencerProvider");把這個(gè)屬性設(shè)為系統(tǒng)屬性也有同樣的效果,這樣編碼在程序里面更好一些,因?yàn)槲覀兛偛豢赡茏層脩羧ジ乃麄兊膕ound.properties文件吧.
呵呵,一切都好了,就像沒(méi)有裝JMF一樣,代碼依然用
Sequencer midi=MidiSystem.getSequencer();
來(lái)獲取MIDI的已連接的播放設(shè)備
在此分享一下,希望對(duì)有此問(wèn)題的朋友有一些幫助
盡管千里冰封
依然擁有晴空
你我共同品味JAVA的濃香.