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

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

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

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

          也就是在生成音頻設(shè)備的時候,這個方法會生成并初始化好音頻設(shè)備,我們在播放音頻的時候,一定需要調(diào)此方法的。

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

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


          這一句拋出來的,而audioDeviceClassName 是通過System.getProperty("j3d.audiodevice");來獲得的,之所以會拋出這個異常,還是因為系統(tǒng)沒有j3d.audiodevice的屬性,后來我輸出System的所有Properties看了一下,果然沒有j3d.audiodevice的屬性,那就怪了,為什么我的電腦會沒有這個屬性呢?

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




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

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

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

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

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

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

          不知你這種方法可不可以解決這種問題  回復(fù)  更多評論
            
          # re: JAVA3D播放不出聲音的解決辦法
          2007-10-06 17:07 | 李想
          加我QQ好么?在我主頁里有  回復(fù)  更多評論
            
          # re: JAVA3D播放不出聲音的解決辦法
          2007-10-06 18:16 | 千里冰封
          加了,等待你通過驗證了  回復(fù)  更多評論
            
          # re: JAVA3D播放不出聲音的解決辦法
          2007-10-07 23:18 | wm
          以前曾遇上過這個問題,通過安裝openal或者直接使用JavaSoundMixer都可解決,但是遺憾的是java支持的音頻格式都太大,如果是一段比較大的音頻,再加上稍大的場景,會出現(xiàn)內(nèi)存溢出,不知有什么辦法可讓java播放壓縮格式  回復(fù)  更多評論
            
          # re: JAVA3D播放不出聲音的解決辦法
          2008-06-22 14:47 | 150535011 qq
          可以幫我解決 JMF 的打包問題么 謝謝了  回復(fù)  更多評論
            
          # re: JAVA3D播放不出聲音的解決辦法
          2013-05-01 14:39 | 234567
          可以解決  回復(fù)  更多評論
            
          主站蜘蛛池模板: 永城市| 和林格尔县| 同德县| 蚌埠市| 栾川县| 定陶县| 广东省| 石楼县| 古蔺县| 白山市| 桂阳县| 循化| 青河县| 神农架林区| 察哈| 青海省| 英超| 普兰店市| 崇明县| 呼和浩特市| 灌云县| 黄浦区| 长岛县| 华安县| 和林格尔县| 翁牛特旗| 东城区| 合山市| 呼玛县| 昭通市| 伊川县| 桑日县| 宜春市| 扶风县| 大田县| 铜梁县| 民勤县| 临汾市| 新田县| 资兴市| 汶川县|