千里冰封
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 千里冰封 阅读(2009) 评论(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
可以解决  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: