Перечисление устройств записи видео
В этом разделе описывается перечисление устройств захвата видео в системе пользователя и создание экземпляра устройства.
Чтобы перечислить устройства записи видео в системе, сделайте следующее:
- Вызовите MFCreateAttributes для создания хранилища атрибутов. Эта функция получает указатель МВФAttributes.
- Вызовите МВФAttributes::SetGUID, чтобы задать атрибут MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE. Задайте для значения атрибута значение MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_GUID.
- Вызов MFEnumDeviceSources. Эта функция получает массив указателей МВФActivate и размер массива. Каждый указатель представляет собой отдельное устройство записи видео.
Чтобы создать экземпляр устройства захвата, вызовите МВФActivate::ActivateObject, чтобы получить указатель на интерфейс IMFMediaSource.
Примечание.
Windows позволяет пользователям предоставлять или запрещать доступ к камере устройства в приложении "Параметры Windows" в разделе "Конфиденциальность и безопасность —> камера". При инициализации устройства записи приложения должны проверить, имеют ли они доступ к камере и обрабатывают ситуацию, когда доступ запрещен пользователем. Дополнительные сведения см. в разделе "Обработка параметра конфиденциальности камеры Windows".
Следующий код показывает эти действия.
HRESULT CreateVideoDeviceSource(IMFMediaSource **ppSource)
{
*ppSource = NULL;
IMFMediaSource *pSource = NULL;
IMFAttributes *pAttributes = NULL;
IMFActivate **ppDevices = NULL;
// Create an attribute store to specify the enumeration parameters.
HRESULT hr = MFCreateAttributes(&pAttributes, 1);
if (FAILED(hr))
{
goto done;
}
// Source type: video capture devices
hr = pAttributes->SetGUID(
MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE,
MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_GUID
);
if (FAILED(hr))
{
goto done;
}
// Enumerate devices.
UINT32 count;
hr = MFEnumDeviceSources(pAttributes, &ppDevices, &count);
if (FAILED(hr))
{
goto done;
}
if (count == 0)
{
hr = E_FAIL;
goto done;
}
// Create the media source object.
hr = ppDevices[0]->ActivateObject(IID_PPV_ARGS(&pSource));
if (FAILED(hr))
{
goto done;
}
*ppSource = pSource;
(*ppSource)->AddRef();
done:
SafeRelease(&pAttributes);
for (DWORD i = 0; i < count; i++)
{
SafeRelease(&ppDevices[i]);
}
CoTaskMemFree(ppDevices);
SafeRelease(&pSource);
return hr;
}
После создания источника мультимедиа отпустите указатели интерфейса и освободийте память для массива:
SafeRelease(&pAttributes);
for (DWORD i = 0; i < count; i++)
{
SafeRelease(&ppDevices[i]);
}
CoTaskMemFree(ppDevices);
См. также