CaptureDeviceManager.getDeviceList (Формат формата) не обнаруживает устройства. Вместо этого он читает из реестра JMF, который является файлом jmf.properties . Он ищет файл jmf.properties в пути к классам.
Если установка JMF прошла успешно, путь к классам был бы настроен на включение всех соответствующих JMF-файлов и каталогов. Установка JMF поставляется с файлом jmf.properties , который находится в папке 'lib' в каталоге установки JMF. Это означает, что jmf.properties будет находиться в JMStudio, и вы обычно увидите, что приложение JMStudio работает правильно. ( Если ваша установка JMF находится в папке «C: \ Program Files», запустите от имени администратора, чтобы обойти UAC )
При создании собственного приложения для обнаружения устройств может возникнуть проблема, описанная выше. Я видел несколько вопросов, связанных с той же проблемой. Это связано с тем, что путь к классу вашего приложения может отличаться и может не включать путь к классу среды. Проверьте свойства вашей IDE здесь. Проблема в том, что CaptureDeviceManager не может найти файл jmf.properties , поскольку его там нет.
Как вы правильно выяснили, вы можете скопировать файл jmf.properties из установочной папки JMF. Он будет содержать правильный список устройств, так как 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. Вы можете получить хорошее представление о том, как устройства обнаруживаются и записываются в реестр. Поместите оба класса в один пакет при тестировании. Не обращайте внимания на метод main в классе VFWAuto.
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. Вы также можете увидеть классы DirectSoundAuto и JavaSoundAuto для обнаружения аудиоустройств в примере исходного кода JMStudio. Попробуйте то же самое, что и для VFWAuto.
Моя конфигурация была 64-битная Windows 7 + пакет производительности Windows JMF 2.1.1e + веб-камера.