我正在尝试打印出所有使用CaptureDeviceManager类中的#getDeviceList()方法支持的捕获设备,并且返回的Vector的大小为0。
为什么?我有一个可运行的网络摄像头-因此应该至少有一个。我正在运行Mac OS X Lion-使用JMF 2.1.1e。
谢谢!
CaptureDeviceManager.getDeviceList(Format format)未检测到设备。而是从JMF注册表读取jmf.properties文件。它在类路径中搜索jmf.properties文件。
如果您的JMF安装成功,则将类路径配置为包括所有相关的JMF jar和目录。 JMF安装随附在JMF安装目录下的'lib'文件夹中的jmf.properties文件。这意味着jmf.properties将由JMStudio找到,并且您通常会看到JMStudio应用程序正确执行。 (如果您的JMF安装在“ C:\ Program Files”下,然后以管理员身份运行以解决UAC问题)>]
当您创建自己的应用程序以检测设备时,可能会出现上述问题。我已经看到了几个与同一个问题有关的问题。这是因为您的应用程序的类路径可能不同,并且可能不包括环境类路径。在此处检查您的IDE属性。问题是CaptureDeviceManager
找不到jmf.properties文件,因为它不存在。您已正确找到,您可以从JMF安装文件夹中复制jmf.properties
文件。由于JMF在安装过程中会检测到该设备,因此它将包含正确的设备列表(请务必进行检查以确保能够正常运行)。[如果您想自己进行设备检测,则创建一个空的jmf.properties文件,并将其放在类路径中的某个位置(它在执行期间最初可能会抛出java.io.EOFException,但是可以由JMF类正确处理)。然后使用以下代码检测网络摄像头...
import javax.media.*; import java.util.*; public static void main(String[] args) { VFWAuto vfwObj = new VFWAuto(); Vector devices = CaptureDeviceManager.getDeviceList(null); Enumeration deviceEnum = devices.elements(); System.out.println("Device count : " + devices.size()); while (deviceEnum.hasMoreElements()) { CaptureDeviceInfo cdi = (CaptureDeviceInfo) deviceEnum.nextElement(); System.out.println("Device : " + cdi.getName()); } }
VFWAuto类的代码如下。这是JMStudio源代码的一部分。您可以很好地了解如何检测设备并将其记录在注册表中。测试时,将两个类放在同一包中。忽略VFWAuto类中的main方法。
import com.sun.media.protocol.vfw.VFWCapture; import java.util.*; import javax.media.*; public class VFWAuto { public VFWAuto() { Vector devices = (Vector) CaptureDeviceManager.getDeviceList(null).clone(); Enumeration enum = devices.elements(); while (enum.hasMoreElements()) { CaptureDeviceInfo cdi = (CaptureDeviceInfo) enum.nextElement(); String name = cdi.getName(); if (name.startsWith("vfw:")) CaptureDeviceManager.removeDevice(cdi); } int nDevices = 0; for (int i = 0; i < 10; i++) { String name = VFWCapture.capGetDriverDescriptionName(i); if (name != null && name.length() > 1) { System.err.println("Found device " + name); System.err.println("Querying device. Please wait..."); com.sun.media.protocol.vfw.VFWSourceStream.autoDetect(i); nDevices++; } } } public static void main(String [] args) { VFWAuto a = new VFWAuto(); System.exit(0); } }
假设您使用的是Windows平台,并且具有可正常使用的网络摄像头,那么此代码应可以检测设备并填充jmf.properties文件。在下一次运行时,您还可以注释掉VFWAuto部分及其对象引用,并且可以看到CaptureDeviceManager从jmf.properties文件读取。
VFWAuto类是jmf.jar的一部分。您还可以在JMStudio示例源代码中看到DirectSoundAuto和JavaSoundAuto类,用于检测音频设备。以与VFWAuto相同的方式进行尝试。
我的配置是Windows 7 64位+ JMF 2.1.1e Windows性能包+网络摄像头。
我有同样的问题,我通过在flush()
对象上调用ObjectInputStream
解决了。
在调用CaptureDeviceManager.getDeviceList()之前,必须先将可用设备加载到内存中。