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

Во время десериализации объекта класс, ответственный за десериализацию объекта, создает экземпляр сериализированного класса и затем продолжает заполнять сериализированные поля и свойства только после получения экземпляра для заполнения.

можно сделать конструктора private или internal, если Вы хотите, настолько долго поскольку это без параметров.

18
задан Roman R. 1 July 2012 в 13:38
поделиться

2 ответа

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

4
ответ дан 30 November 2019 в 08:58
поделиться

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

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

Специфичные для DirectShow:

Для создания устройств сбора изображений под окнами вы должны предоставить либо устройство (драйвер), которое реализует интерфейсы классов потоков ( или более новый 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, созданный для этой записи «виртуального устройства».

16
ответ дан 30 November 2019 в 08:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: