다음을 통해 공유


비디오 캡처 디바이스 열거

이 항목에서는 사용자 시스템에서 비디오 캡처 디바이스를 열거하는 방법과 디바이스 인스턴스를 만드는 방법에 대해 설명합니다.

시스템에서 비디오 캡처 디바이스를 열거하려면 다음을 수행합니다.

  1. 속성 저장소를 만들려면 MFCreateAttributes 를 호출합니다. 이 함수는 IMFAttributes 포인터를 받습니다 .
  2. IMFAttributes::SetGUID를 호출하여 MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE 특성을 설정합니다. 특성 값을 MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_GUID 설정합니다.
  3. MFEnumDeviceSources를 호출 합니다. 이 함수는 IMFActivate 포인터의 배열과 배열 크기를 받습니다. 각 포인터는 고유한 비디오 캡처 디바이스를 나타냅니다.

캡처 디바이스의 인스턴스를 만들려면 IMFActivate::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);

비디오 캡처