Динамически создавать несколько виртуальных устройств веб-камеры DirectShow
Я пытаюсь создать виртуальный фильтр DirectShow веб-камеры с несколькими виртуальными устройствами.
Камеры определяются следующим образом:
CFactoryTemplate g_Templates[] =
{
{
SUB_DEVICE_NAME_0,
&CLSID_VirtualCam_0,
CVCam::CreateInstance0,
NULL,
&AMSFilterVCam_0
},
{
SUB_DEVICE_NAME_1,
&CLSID_VirtualCam_1,
CVCam::CreateInstance1,
NULL,
&AMSFilterVCam_1
}
};
Инициализация выполняется с помощью этих
static
методы:
CUnknown * WINAPI CVCam::CreateInstance0(LPUNKNOWN lpunk, HRESULT *phr)
{
return new CVCam(NAME(DEVICE_NAME_0), lpunk, phr, CLSID_VirtualCam_0, 0);
}
CUnknown * WINAPI CVCam::CreateInstance1(LPUNKNOWN lpunk, HRESULT *phr)
{
return new CVCam(NAME(DEVICE_NAME_1), lpunk, phr, CLSID_VirtualCam_1, 1);
}
Можно ли сделать это более динамично, чтобы нам не приходилось жестко кодировать каждую камеру, а можно было передавать параметр во время выполнения?
С уважением,
1 ответ
Возможно динамическое добавление и удаление камеры. Однако это сильно отличается от того, что вы думаете в основной части вопроса. Базовые классы DirectShow предлагают вам определенные помощники для преобразования статических объявлений в регистрацию, а пример кода DirectShow показывает, как экспорт DLL подключается к этим помощникам для нужд регистрации .
Чтобы сделать его динамичным, вам нужно расширить то, что
AMoveDllRegisterServer2
делает для большинства проектов фильтров и адаптирует его реализацию для ваших нужд.
Эта часть
RegisterFilters
может быть хорошей отправной точкой, вы хотели бы сделать цикл или что-то в этом роде. Вам придется иметь дело с дополнительными
fm->RegisterFilter(...
вызовы соответственно дополнительных виртуальных камер, которые вы хотите.