<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

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

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

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

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

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

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

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

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


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

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




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

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

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

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

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

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

    不知你這種方法可不可以解決這種問題  回復  更多評論
      
    # re: JAVA3D播放不出聲音的解決辦法
    2007-10-06 17:07 | 李想
    加我QQ好么?在我主頁里有  回復  更多評論
      
    # re: JAVA3D播放不出聲音的解決辦法
    2007-10-06 18:16 | 千里冰封
    加了,等待你通過驗證了  回復  更多評論
      
    # re: JAVA3D播放不出聲音的解決辦法
    2007-10-07 23:18 | wm
    以前曾遇上過這個問題,通過安裝openal或者直接使用JavaSoundMixer都可解決,但是遺憾的是java支持的音頻格式都太大,如果是一段比較大的音頻,再加上稍大的場景,會出現內存溢出,不知有什么辦法可讓java播放壓縮格式  回復  更多評論
      
    # re: JAVA3D播放不出聲音的解決辦法
    2008-06-22 14:47 | 150535011 qq
    可以幫我解決 JMF 的打包問題么 謝謝了  回復  更多評論
      
    # re: JAVA3D播放不出聲音的解決辦法
    2013-05-01 14:39 | 234567
    可以解決  回復  更多評論
      
    主站蜘蛛池模板: 久久成人免费播放网站| 亚洲AV无码成H人在线观看| 亚洲人成人网站18禁| 四虎精品亚洲一区二区三区| 日韩电影免费观看| 亚洲精品亚洲人成在线| 亚洲无线观看国产精品| 欧美大尺寸SUV免费| 国产又黄又爽胸又大免费视频| 亚洲黄色在线视频| 亚洲国产天堂久久久久久| 131美女爱做免费毛片| 四虎精品成人免费视频| 亚洲国产精品日韩在线| 久久亚洲国产精品123区| 麻豆最新国产剧情AV原创免费| a免费毛片在线播放| 国产成人亚洲精品| 久久亚洲精品中文字幕无码| 日本免费一二区在线电影| 免费A级毛片无码A∨中文字幕下载| 无码天堂亚洲国产AV| 亚洲视频一区二区在线观看| 亚洲精品国精品久久99热| www.黄色免费网站| 久久国产精品免费网站| 一级毛片a免费播放王色| 亚洲欧洲日产国码久在线| 亚洲视频免费一区| 亚洲成色www久久网站夜月| 免费国产在线观看| 成年性羞羞视频免费观看无限| 成全在线观看免费观看大全| 老司机精品视频免费| 在线综合亚洲中文精品| 亚洲美女视频网址| 亚洲av无码专区在线播放| 国产日产亚洲系列最新| 亚洲A∨精品一区二区三区| 免费黄色网址入口| 最近中文字幕免费mv视频7 |