gpt4 book ai didi

Java:CaptureDeviceManager#getDeviceList() 为空?

转载 作者:行者123 更新时间:2023-12-01 15:36:28 26 4
gpt4 key购买 nike

我试图打印出使用 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.properties 文件,该文件包含在 JMF 安装目录下的“lib”文件夹中。这意味着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 性能包 + 网络摄像头。

关于Java:CaptureDeviceManager#getDeviceList() 为空?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8768142/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com