Java:CaptureDeviceManager#getDeviceList()为空?

问题描述 投票:0回答:3

我正在尝试打印出所有使用CaptureDeviceManager类中的#getDeviceList()方法支持的捕获设备,并且返回的Vector的大小为0。

为什么?我有一个可运行的网络摄像头-因此应该至少有一个。我正在运行Mac OS X Lion-使用JMF 2.1.1e。

谢谢!

java macos vector webcam jmf
3个回答
1
投票

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性能包+网络摄像头。


0
投票

我有同样的问题,我通过在flush()对象上调用ObjectInputStream解决了。


0
投票

在调用CaptureDeviceManager.getDeviceList()之前,必须先将可用设备加载到内存中。

© www.soinside.com 2019 - 2024. All rights reserved.