Драйвер виртуальной веб-камеры

Я хочу разработать виртуальный драйвер для веб-камеры, который из режима пользователя передаст на него изображение, и оно будет отображаться как вывод веб-камеры.

Я не хочу использовать фильтр DirectX, CSourceStream и т. Д. Потому что они не работают в некоторых программах, которые не используют DirectX для захвата изображения с веб-камеры.

Я должен написать драйвер устройства режима ядра так.

Есть идеи? Я пробовал testcap из образцов DDK, но он не обрабатывает изображение из пользовательского режима и не получает никакого ввода, просто отображает 7 цветов в веб-камере...

Любая помощь будет принята с благодарностью. Спасибо


Спасибо вам всем!

Я попробовал код здесь: http://tmhare.mvps.org/downloads.htm (найти фильтр исходного кода Capture)

Это сработало хорошо, когда я скомпилировал его в Yahoo, MSN, но он разбил AIM, веб-камеру Flash Internet Explorer, веб-камеру Firefox Flash и Skype... У меня произошел сбой в QueryInterface после 8-минутного звонка, я обнаружил, что он отслеживает много трюков..

Теперь я знаю, что происходит сбой при 8-м вызове HRESULT CVCamStream::QueryInterface(REFIID riid, void **ppv)

Восьмой вызов, когда он длится до конца, если, я имею в виду: return CSourceStream::QueryInterface(riid, ppv);

Это в 17-й строке Filters.cpp

Почему вы думаете, что я получаю крах??

Спасибо всем за то, что помогли мне найти правильное решение - DirectShow, а не драйвер.

2 ответа

Есть несколько API от Microsoft, которые предоставляют доступ к данным изображения.

  • Твен: используется для захвата одного изображения со сканеров и т. Д.
  • WIA: Это, похоже, выродилось в одну библиотеку кодеков изображений.
  • VfW: очень старый (Win16) API, который действительно работает только для кодирования / декодирования видеофайлов, но имеет поддержку для получения некоторых видео.
  • DirectShow: ранее входил в DirectX SDK, в настоящее время в Platform SDK. Это место для текущих (общих) потоковых решений.
  • Windows Media / Media Foundation: кажется, это больше ориентировано на воспроизведение / перекодирование видео.
  • Специфичные для производителя библиотеки: Pylon / Halcon / Imaging Control /...

DirectShow конкретно:

Чтобы создать устройства получения изображений под Windows, вы должны предоставить либо устройство (драйвер), которое реализует интерфейсы потоковых классов (или более новый Avstream), либо вы должны написать COM-объект пользовательского режима, который должен быть добавлен в перечислитель VideoInputCategory.

Образец Avstream предоставляет все для реального устройства получения изображений. Только нижний слой для реального устройства действительно отсутствует.

Если вы можете спроектировать устройство, вы должны создать DCAM или UVC-совместимое устройство. Для обоих есть встроенные драйверы от Windows.


Как написать программный источник устройства:

Вы должны создать фильтр DirectShow, который предоставляет как минимум один выходной контакт, и зарегистрируйте его в VideoInputCategory. Может быть несколько интерфейсов, которые определенные приложения требуют от приложения захвата, но они зависят от самого приложения. Простыми приложениями для проверки фильтров являются GraphEdit и AMCap, которые поставляются в Plattform SDK.

Некоторый код:

#include <InitGuid.h>
#include <streams.h>


const AMOVIESETUP_MEDIATYPE s_VideoPinType =
{
    &MEDIATYPE_Video,   // Major type
    &MEDIATYPE_NULL     // Minor type
};

const AMOVIESETUP_PIN s_VideoOutputPin =
{
    L"Output",              // Pin string name
    FALSE,                  // Is it rendered
    TRUE,                   // Is it an output
    FALSE,                  // Can we have none
    FALSE,                  // Can we have many
    &CLSID_NULL,            // Connects to filter
    NULL,                   // Connects to pin
    1,                      // Number of types
    &s_VideoPinType         // Pin details
};

const AMOVIESETUP_FILTER s_Filter =
{
    &CLSID_MyFilter,        // Filter CLSID
    L"bla",         // String name
    MERIT_DO_NOT_USE,               // Filter merit
    1,                              // Number pins
    &s_VideoOutputPin               // Pin details
};

    REGFILTER2 rf2;
    rf2.dwVersion = 1;
    rf2.dwMerit = MERIT_DO_NOT_USE;
    rf2.cPins = 1;
    rf2.rgPins = s_Filter.lpPin;

    HRESULT hr = pFilterMapper->RegisterFilter( CLSID_MyFilter, _FriendlyName.c_str(), 0, 
        &CLSID_VideoInputDeviceCategory, _InstanceID.c_str(), &rf2 );
    if( FAILED( hr ) )
    {
        return false;
    }

    std::wstring inputCat = GUIDToWString( CLSID_VideoInputDeviceCategory );
    std::wstring regPath = L"CLSID\\" + inputCat + L"\\Instance";
    win32_utils::CRegKey hKeyInstancesDir;
    LONG rval = openKey( HKEY_CLASSES_ROOT, regPath, KEY_WRITE, hKeyInstancesDir );
    if( rval == ERROR_SUCCESS )
    {
        win32_utils::CRegKey hKeyInstance;
        rval = createKey( hKeyInstancesDir, _InstanceID, KEY_WRITE, hKeyInstance );

        ....

_InstanceID - это GUID, созданный для этой записи "виртуального устройства".

Вы не можете решить, как другая программа будет называть ваш драйвер. Большинство программ будет использовать DirectShow. Некоторые будут использовать технологию Win3.x VFW. Многие новые программы, включая сканер Windows XP и мастер камеры, могут вызывать вас через интерфейс WIA. Если вы не хотите реализовывать все это, вам нужно как минимум предоставить интерфейс DirectShow через WDM и позволить vfwwdm32.dll предоставить вам интерфейс VFW или написать свой собственный драйвер VFW.

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