ビデオ キャプチャ デバイスの列挙
このトピックでは、ユーザーのシステムでビデオ キャプチャ デバイスを列挙する方法と、デバイスのインスタンスを作成する方法について説明します。
システム上のビデオ キャプチャ デバイスを列挙するには、次の操作を行います。
- MFCreateAttributes を呼び出して属性ストアを作成します。 この関数は、 IMFAttributes ポインターを 受け取ります。
- IMFAttributes::SetGUID を呼び出して、MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE属性を設定します。 属性値を MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_GUID に設定します。
- MFEnumDeviceSources を呼び出します。 この関数は、 IMFActivate ポインターの配列と配列サイズを受け取ります。 各ポインターは、個別のビデオ キャプチャ デバイスを表します。
キャプチャ デバイスのインスタンスを作成するには:
- IMFActivate::ActivateObject を呼び出して、IMFMediaSource インターフェイスへのポインターを取得します。
これらの手順を示すコードは次のようになります。
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);
関連トピック
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示