Поделиться через


Перечисление устройств записи видео

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

Чтобы перечислить устройства записи видео в системе, сделайте следующее:

  1. Вызовите MFCreateAttributes для создания хранилища атрибутов. Эта функция получает указатель МВФAttributes.
  2. Вызовите МВФAttributes::SetGUID, чтобы задать атрибут MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE. Задайте для значения атрибута значение MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_GUID.
  3. Вызов 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);

Запись видео