Драйвер виртуальной веб-камеры - PullRequest
17 голосов
/ 27 октября 2009

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

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

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

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

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


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

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

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

Теперь я знаю, он падает на 8-й звонок HRESULT CVCamStream :: QueryInterface (REFIID riid, void ** ppv)

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

Он находится в 17-й строке Filters.cpp

Почему вы думаете, что я получаю сбой ??

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

Ответы [ 2 ]

16 голосов
/ 27 октября 2009

Существует несколько 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, созданный для этой записи «виртуального устройства».

4 голосов
/ 27 октября 2009

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

...