ビデオ キャプチャ デバイスの列挙

このトピックでは、ユーザーのシステムでビデオ キャプチャ デバイスを列挙する方法と、デバイスのインスタンスを作成する方法について説明します。

システム上のビデオ キャプチャ デバイスを列挙するには、次の手順を実行します。

  1. MFCreateAttributes を呼び出して、属性ストアを作成します。 この関数は、 IMFAttributes ポインターを受け取ります。
  2. IMFAttributes::SetGUID を呼び出して、MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE属性を設定します。 属性値を MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_GUID に設定します。
  3. MFEnumDeviceSources を呼び出す この関数は、 IMFActivate ポインターと配列サイズを含む配列を受け取ります。 各ポインターは、個別のビデオ キャプチャ デバイスを表します。

キャプチャ デバイスのインスタンスを作成するには、 IMFActivate::ActivateObject を呼び出して、 IMFMediaSource インターフェイスへのポインターを取得します。

Note

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);

ビデオ キャプチャ