Подтвердить что ты не робот

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

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

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

Мне нужно написать драйвер устройства режима ядра, поэтому.

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

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


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

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

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

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

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

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

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

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

4b9b3361

Ответ 1

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

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

Спецификация DirectShow:

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

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

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


Как написать исходное устройство программного обеспечения:

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

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

#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, созданный для этой записи "виртуального устройства".

Ответ 2

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