代码改变世界

CaptureDeviceManager.getDeviceList方法返回null对象问题探究

2010-07-10 23:49 by FantasySoft, ... 阅读, ... 评论, 收藏, 编辑

最近由于项目的需要,偶开始倒腾Java的媒体框架——Java Media Framework(缩写为JMF)。在编写一个实时语音聊天的程序的时候,需要使用以下方法获得音频采集设备的列表:

  • CaptureDeviceManager.getDeviceList(Format format)

这是一个很简单的方法。但是,当我在Eclipse中将代码编译完毕并且运行之,这个方法却返回了null,而不是所预期的音频采集设备列表!通过搜索,我发现也有不少朋友也遇到了这样的问题,更是有朋友发现在IDE中运行JMF程序的时候,该方法返回null,但是在命令行的状态下运行程序却能得到正确的结果。于是乎,我把问题锁定到classpath上面,毕竟在IDE中运行程序,所使用的classpath是有IDE本身确定的。以Eclipse为例,我们可以在RUN Configurations中对classpath进行设置如下图所示:

那么,我们又该对classpath进行怎样的设置呢?原来,出现这样的问题是在于JMF无法找到自己安装时所生成的jmf.properties文件(位于JMF安装目录下的lib中)。在IDE中运行程序的时候,classpath并没有指向JMF安装目录下lib中的jmf.jar,所以,程序就找不到jmf.properties文件,也就没法获得设备列表了。将jmf.jar加入至classpath,程序运行正常。

该问题的解决方案虽然很简单,但是,Michael觉得有必要将其记录下来,毕竟它的出现确实让人太迷惑了。因为在默认的JRE System Library中就包含了jmf.jar(除了jmf.jar之外,还有sound.jar,这两个位于jdk.home/jre/lib/ext目录下的jar包实际上是在安装JMF的时候,安装程序复制到该目录下的),也就是说,我们并不需要添加其它的jar都可以编译并且运行基于JMF的程序了。这无疑为问题的解决平添了一道屏障,而中文的论坛以及博客也没有给出该问题的解决方案。有关该问题解答的英文版本在这里。(补充:为了能够同时使用开源的FMJ和JMF对项目进行测试,最简单的办法就是将位于jdk.home/jre/lib/ext目录下的jmf.jar以及sound.jar删除

这个问题让Michael了解到:在编写以及发布JMF程序的时候,我们需要关注jmf.properties文件的位置以及如何根据不同的机器生成该文件。毕竟不是没一台机器都安装的jmf,如果需要发布基于JMF的程序,我们又应该做足哪些准备工作呢?这是由该问题引发的疑问,您是否有答案呢?欢迎您的回复,谢谢!