千里冰封
          JAVA 濃香四溢
          posts - 151,comments - 2801,trackbacks - 0
          我前天寫了一篇文章,是關(guān)于播放MIDI音樂(lè)的,可是看到留言卻發(fā)現(xiàn),我那段代碼在他的電腦上竟然播不出聲音來(lái),這個(gè)時(shí)候我想,是不是我的電腦不正常,因?yàn)槲铱吹骄W(wǎng)上的例子,得到播放器都是通過(guò)這種方法得到的,
          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(
          "------------------------------------");

                      }
          輸出如下:
          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。 

           

          現(xiàn)在可以肯定的是,JMF改變了我的系統(tǒng)默認(rèn)屬性,把Java Sound Sequencer當(dāng)做默認(rèn)設(shè)備了,本來(lái)默認(rèn)設(shè)備是:
          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的濃香.
          posted on 2007-09-24 09:29 千里冰封 閱讀(1218) 評(píng)論(2)  編輯  收藏 所屬分類: JAVASE

          FeedBack:
          # re: JMF和MIDI沖突的解決辦法
          2007-09-24 11:01 | 放水老倌
          發(fā)現(xiàn)你還是挺能寫呢嘛:)  回復(fù)  更多評(píng)論
            
          # re: JMF和MIDI沖突的解決辦法
          2007-09-24 11:06 | 千里冰封
          @放水老倌
          呵呵,多謝夸獎(jiǎng),以后多多光顧寒舍吧:)  回復(fù)  更多評(píng)論
            
          主站蜘蛛池模板: 金溪县| 罗田县| 阳朔县| 东乡县| 建昌县| 财经| 虞城县| 永靖县| 湘阴县| 崇信县| 花莲市| 托克逊县| 辉县市| 洞口县| 泾川县| 乡城县| 谢通门县| 嘉兴市| 朝阳县| 克什克腾旗| 新丰县| 宁明县| 济南市| 抚远县| SHOW| 靖西县| 休宁县| 阳曲县| 务川| 株洲县| 建宁县| 镇雄县| 南陵县| 青铜峡市| 十堰市| 永宁县| 浦江县| 周口市| 磐石市| 开化县| 盖州市|