千里冰封
          JAVA 濃香四溢
          posts - 151,comments - 2801,trackbacks - 0

          今天在利用JAVA3D播放聲音的時(shí)候,碰到一個(gè)很奇怪的問(wèn)題,那就是聲音設(shè)備無(wú)法初始化。它拋出如下異常:
          java.lang.UnsupportedOperationException: No AudioDevice specified

          但是教程上面包括SUN的例子里面都是這樣寫(xiě)的,他那樣寫(xiě)肯定有它的道理,他不可能寫(xiě)一個(gè)錯(cuò)誤的代碼吧?那心里就納悶了,為什么我的電腦就是播放不了呢,難道又像播放MIDI一樣,因?yàn)檠b了JMF的原因?我把JMF也缷了,電腦也重啟了,還是不行,該不會(huì)是人品問(wèn)題吧:(

          后來(lái)查看錯(cuò)誤的調(diào)用順序,發(fā)現(xiàn)是這句話拋出了異常:
          ......
          viewer.createAudioDevice();
          ......

          也就是在生成音頻設(shè)備的時(shí)候,這個(gè)方法會(huì)生成并初始化好音頻設(shè)備,我們?cè)诓シ乓纛l的時(shí)候,一定需要調(diào)此方法的。

          然后再看這句話里面的代碼,說(shuō)到這里,突然覺(jué)得用JAVA挺爽的,可以看到你用的類的JAVA的源碼,Viewver是JAVA3D里面的類,查看這個(gè)方法,發(fā)現(xiàn)這個(gè)方法如下:

          public AudioDevice createAudioDevice() {
              
          if (physicalEnvironment == null) {
                  System.err.println(
          "Java 3D: createAudioDevice: physicalEnvironment is null");
                  
          return null;
              }

              
          try {
                  String audioDeviceClassName 
          =
                  (String) java.security.AccessController.doPrivileged(
                      
          new java.security.PrivilegedAction() {
                      
          public Object run() {
                          
          return System.getProperty("j3d.audiodevice");
                      }
                      });

                  
          if (audioDeviceClassName == null) {
                  
          throw new UnsupportedOperationException("No AudioDevice specified");
                  }

                      
          // Issue 341: try the current class loader first before trying the
                      
          // system class loader
                  Class audioDeviceClass = null;
                      
          try {
                          audioDeviceClass 
          = Class.forName(audioDeviceClassName);
                      } 
          catch (ClassNotFoundException ex) {
                          
          // Ignore excpetion and try system class loader
                      }

                      
          if (audioDeviceClass == null) {
                          ClassLoader audioDeviceClassLoader 
          =
                              (ClassLoader) java.security.AccessController.doPrivileged(
                                  
          new java.security.PrivilegedAction() {
                                      
          public Object run() {
                                          
          return ClassLoader.getSystemClassLoader();
                                      }
                                  });

                          
          if (audioDeviceClassLoader == null) {
                              
          throw new IllegalStateException("System ClassLoader is null");
                          }

                          audioDeviceClass 
          = Class.forName(audioDeviceClassName, true

          audioDeviceClassLoader);
                      }

                  Class physEnvClass 
          = PhysicalEnvironment.class;
                  Constructor audioDeviceConstructor 
          =
                      audioDeviceClass.getConstructor(
          new Class[] {physEnvClass});
                  PhysicalEnvironment[] args 
          = new PhysicalEnvironment[] { physicalEnvironment };
                  AudioEngine3DL2 mixer 
          =
                  (AudioEngine3DL2) audioDeviceConstructor.newInstance((Object[])args);
                  mixer.initialize();
                  
          return mixer;
              }
              
          catch (Throwable e) {
                  e.printStackTrace();
                  physicalEnvironment.setAudioDevice(
          null);
                  System.err.println(
          "Java 3D: audio is disabled");
                  
          return null;
              }
              }

          然后再細(xì)看異常是在
          if (audioDeviceClassName == null) {
            throw new UnsupportedOperationException("No AudioDevice specified");
               }


          這一句拋出來(lái)的,而audioDeviceClassName 是通過(guò)System.getProperty("j3d.audiodevice");來(lái)獲得的,之所以會(huì)拋出這個(gè)異常,還是因?yàn)橄到y(tǒng)沒(méi)有j3d.audiodevice的屬性,后來(lái)我輸出System的所有Properties看了一下,果然沒(méi)有j3d.audiodevice的屬性,那就怪了,為什么我的電腦會(huì)沒(méi)有這個(gè)屬性呢?

          后來(lái)才知道,本來(lái)這個(gè)屬性裝了JAVA3D以后都會(huì)有的,但是由于JAVA3D1.3發(fā)現(xiàn)了一個(gè)BUG,一個(gè)播放聲音的BUG,所以在后續(xù)的版本中把這個(gè)屬性去掉了,也就是不再讓人用JAVA3D來(lái)播放聲音了。我用的是JAVA3D1.5,所以就沒(méi)有這個(gè)屬性了,所以音頻設(shè)備也就初始化不了了。
          那怎么樣呢?JAVA不裝這個(gè)屬性,我們自己指定就是了,于是在viewer.createAudioDevice();代碼調(diào)用之前,我調(diào)用如下代碼為它設(shè)置這個(gè)屬性,讓它可以自己找到音頻播放設(shè)備:
          System.setProperty("j3d.audiodevice", "com.sun.j3d.audioengines.javasound.JavaSoundMixer");
          這樣就好了,我們?cè)诓シ诺臅r(shí)候,使用的就是com.sun.j3d.audioengines.javasound.JavaSoundMixer來(lái)播放了,不過(guò),因?yàn)橛蠦UG的報(bào)道,所以用它播放可能會(huì)出現(xiàn)一些問(wèn)題,聽(tīng)說(shuō)現(xiàn)在JOAL正在努力解決這個(gè)問(wèn)題。讓我們共同期待吧。
          JOAL的地址:https://joal.dev.java.net
          JOGL的地址:https://jogl.dev.java.net




          盡管千里冰封
          依然擁有晴空

          你我共同品味JAVA的濃香.
          posted on 2007-10-06 09:02 千里冰封 閱讀(2034) 評(píng)論(8)  編輯  收藏 所屬分類: JAVA擴(kuò)展

          FeedBack:
          # re: JAVA3D播放不出聲音的解決辦法[未登錄](méi)
          2007-10-06 09:38 | 咖啡
          沒(méi)有用過(guò),以后看看  回復(fù)  更多評(píng)論
            
          # re: JAVA3D播放不出聲音的解決辦法
          2007-10-06 09:40 | 阿蜜果
          聽(tīng)一個(gè)朋友推薦過(guò),還沒(méi)去看呢。
          學(xué)習(xí)一下,呵呵
          好勤奮呀!  回復(fù)  更多評(píng)論
            
          # re: JAVA3D播放不出聲音的解決辦法
          2007-10-06 17:07 | 李想
          我也在探索同樣問(wèn)題 不過(guò)我們的解決方式略有不同

          JOAL的用不了!我試過(guò)了 無(wú)論手動(dòng)添加JRE還是用OpenAL安裝它根本不認(rèn)那個(gè)類~

          我的解決方法:
          http://hi.baidu.com/cerberusearl/blog/item/42e294357e0dcb88a71e12b3.html/cmtid/5d1059d94a479bea38012f5c#5d1059d94a479bea38012f5c

          遺憾的是雖然能放出聲音來(lái)但不斷出錯(cuò) 而且PointSound和ConeSound根本沒(méi)有應(yīng)有的效果 而是像背景音樂(lè)一樣

          不知你這種方法可不可以解決這種問(wèn)題  回復(fù)  更多評(píng)論
            
          # re: JAVA3D播放不出聲音的解決辦法
          2007-10-06 17:07 | 李想
          加我QQ好么?在我主頁(yè)里有  回復(fù)  更多評(píng)論
            
          # re: JAVA3D播放不出聲音的解決辦法
          2007-10-06 18:16 | 千里冰封
          加了,等待你通過(guò)驗(yàn)證了  回復(fù)  更多評(píng)論
            
          # re: JAVA3D播放不出聲音的解決辦法
          2007-10-07 23:18 | wm
          以前曾遇上過(guò)這個(gè)問(wèn)題,通過(guò)安裝openal或者直接使用JavaSoundMixer都可解決,但是遺憾的是java支持的音頻格式都太大,如果是一段比較大的音頻,再加上稍大的場(chǎng)景,會(huì)出現(xiàn)內(nèi)存溢出,不知有什么辦法可讓java播放壓縮格式  回復(fù)  更多評(píng)論
            
          # re: JAVA3D播放不出聲音的解決辦法
          2008-06-22 14:47 | 150535011 qq
          可以幫我解決 JMF 的打包問(wèn)題么 謝謝了  回復(fù)  更多評(píng)論
            
          # re: JAVA3D播放不出聲音的解決辦法
          2013-05-01 14:39 | 234567
          可以解決  回復(fù)  更多評(píng)論
            
          主站蜘蛛池模板: 南雄市| 康平县| 丰宁| 吴川市| 福建省| 温泉县| 南澳县| 泗阳县| 洪雅县| 鄄城县| 砚山县| 黄梅县| 和田市| 木兰县| 旅游| 金华市| 洛隆县| 科尔| 延边| 东港市| 阿荣旗| 沛县| 黎城县| 凌云县| 漯河市| 苏尼特右旗| 陈巴尔虎旗| 兴化市| 三河市| 黄陵县| 诸暨市| 霍林郭勒市| 大新县| 芜湖市| 策勒县| 德惠市| 中方县| 东乌| 闵行区| 犍为县| 介休市|