2009-10-26 2 views
17

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

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

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

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

Любая помощь будет принята с благодарностью. СООБЩЕНИЕ


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

Я попытался код здесь: http://tmhare.mvps.org/downloads.htm (найти Capture Source Filter)

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

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

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

Это в 17-й линии Filters.cpp

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

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

+0

Вы имеете в виду WDK, а не DDK, верно? Кроме того, чтобы получить лучшее представление о том, что вы ищете, где testcap находится в образцах, я не могу его найти. – mrduclaw

+0

Еще раз. Не пытайтесь написать драйвер, потому что драйверы, как правило, действительно большие. Я попытаюсь изучить мой код, чтобы зарегистрировать программные устройства и показать его здесь. – Christopher

+0

Если вам действительно нужно идти по пути к драйверу Windows ... См. [Этот вопрос] (http://stackoverflow.com/questions/1137540/connecting-windows-driver-to-userland-service) для описания того, как связь с драйвером устройства. Удачи. – Christopher

ответ

4

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

16

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

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

DirectShow конкретны:

Для создания устройств захвата изображений под окнами, вы должны предоставить либо устройство (драйвер), который реализует интерфейсы streamclasses (или более поздней версии Avstream), или вы должны написать UserMode COM объект который должен быть добавлен в счетчик 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, созданный для данной записи 'виртуальных устройств'.

+1

Связанная статья о том, как это делается на C# http://www.codeproject.com/Articles/437617/DirectShow-Virtual-Video-Capture-Source-Filter-in –