Динамически создавать несколько виртуальных устройств веб-камеры 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(...вызовы соответственно дополнительных виртуальных камер, которые вы хотите.

Другие вопросы по тегам