Фильтр DirectShow не отображается как устройство ввода ввода

Начиная с замечательного примера Capture Source Filter Вот Я написал свое собственное устройство ввода ввода, которое отлично работает в Graph Studio Next, но оно не отображается как устройство захвата (то есть веб-камера) в приложениях, таких как Skype или аналогичных.

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

Некоторый соответствующий код:

dll.cpp

DEFINE_GUID(CLSID_VirtualCam, 0x8e14549a, 0xdb61, 0x4309, 0xaf, 0xa1, 0x35, 0x78, 0xe9, 0x27, 0xe9, 0x33);

const AMOVIESETUP_MEDIATYPE AMSMediaTypesVideo =
{
&MEDIATYPE_Video,
&MEDIASUBTYPE_NULL
};

const AMOVIESETUP_PIN AMSPinVCam[] =
{
{
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
&AMSMediaTypesVideo      // Pin Media types
}
};

const AMOVIESETUP_FILTER AMSFilterVCam =
{
&CLSID_VirtualCam,  // Filter CLSID
FILTER_NAME,     // String name
MERIT_PREFERRED,      // Filter merit
1,                     // Number pins
AMSPinVCam             // Pin details
};

CFactoryTemplate g_Templates[] =
{
{
FILTER_NAME,
&CLSID_VirtualCam,
CVCam::CreateInstance,
NULL,
&AMSFilterVCam
},
};

Filter.cpp

CVCam::CVCam(LPUNKNOWN lpunk, HRESULT *phr) : CSource(LPCSTR(FILTER_NAME), lpunk, CLSID_VirtualCam)
{
ASSERT(phr);
CAutoLock cAutoLock(&m_cStateLock);
m_paStreams = (CSourceStream **) new CVCamStream*[1];
m_paStreams[0] = new CVCamStream(phr, this, FILTER_NAME);
}

HRESULT CVCam::QueryInterface(REFIID riid, void **ppv)
{
if (riid == _uuidof(IAMStreamConfig) || riid == _uuidof(IKsPropertySet))
{
HRESULT hr;
hr = m_paStreams[0]->QueryInterface(riid, ppv);
if (hr != S_OK) return hr;
}
else return CSource::QueryInterface(riid, ppv);

return S_OK;
}

CVCamStream::CVCamStream(HRESULT *phr, CVCam *pParent, LPCWSTR pPinName) : CSourceStream(LPCSTR(FILTER_NAME),phr, pParent, pPinName), m_pParent(pParent)
{
hdc = GetDC(NULL);

Gdiplus::GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR gdiplusToken;
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);

screen_height = GetSystemMetrics(SM_CYVIRTUALSCREEN);
screen_width = GetSystemMetrics(SM_CXVIRTUALSCREEN);

GetMediaType(8, &m_mt);
}

CVCamStream::~CVCamStream()
{
Gdiplus::GdiplusShutdown(gdiplusToken);
DeleteDC(hdc);
}

HRESULT CVCamStream::QueryInterface(REFIID riid, void **ppv)
{
if(riid == _uuidof(IAMStreamConfig)) *ppv = (IAMStreamConfig*)this;
else if(riid == _uuidof(IKsPropertySet)) *ppv = (IKsPropertySet*)this;
else return CSourceStream::QueryInterface(riid, ppv);

AddRef();
return S_OK;
}

Я пропустил другие функции, которые практически совпадают с приведенным примером, и я думаю, что конфигурация выполнена в этих.

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

Конечно, фильтр зарегистрирован (я вижу это в Диспетчере фильтров DirectShow).

1

Решение

Проект устройства ввода DirectShow, на который вы ссылаетесь, к сожалению, не является API-интерфейсом, разработанным для внедрения вашей подобной камере реализации в любое приложение с поддержкой захвата видео.

Разработанный вами источник видео будет виден только приложению, использующему захват видео с использованием DirectShow API и имеющим битовую совместимость с вашим фильтром. Несмотря на то, что многие приложения все еще используют DirectShow, их скорость постепенно снижается со временем. Например, новый Skype не использует DirectShow, а Skype для бизнеса — это просто новое имя для бывшего Lync, означающее, что в плане захвата видео практически нет общего исходного кода для Skype.

У меня есть больше технических деталей в этом посте: Применимость виртуальных источников DirectShow и картинка из поста должна дать представление о том, для каких приложений ваш источник видео «viisble» (зеленые прямоугольники):

Смотрите также:

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]