Compartilhar via


Media Foundation ② WebCam キャプチャ

Media Foundation で WebCam からビデオをキャプチャしてMFPlayで表示する方法を Audio/Video Capure in Media Foundation を基に解説します。Windows 7 SDK (RC) がインストールしてあれば、サンプルコードは C:\Program Files\Microsoft SDKs\Windows\v7.0\Samples\Multimedia\MediaFoundation\SimpleCapture にあります。

手順は以下の通りです。

  1. MFCreateAttribure関数を呼び出しアトリビュートストアを作成
  2. MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE に MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_GUID を指定
  3. MFEnumDeviceSource 関数を呼び出し、デバイスを列挙
  4. IMFActivate::ActivateObjectメソッドを呼び出し、そのアクティベーション オブジェクトからメディア ソース オブジェクトを作成
  5. シンボリック リンクを作成(デバイス ロストのチェックに必要)
  6. MFPlay プレイヤーを作成
  7. 4 で作成したメディア ソースを第1引数にして、6 で作成したMFPlayプレイヤーの CreateMediaItemFromObject メソッドを呼び出し、メディア アイテムを作成。

#define CHECK_HR(hr) { if (FAILED(hr)) { goto done; } }

HRESULT CreateVideoCaptureDevice()
{
HRESULT hr = S_OK;
UINT32 count = 0;

    IMFAttributes *pConfig = NULL;
IMFActivate **ppDevices = NULL;
IMFMediaSource *pSource = NULL;

    // ①アトリビュート ストアを作成
CHECK_HR(hr = MFCreateAttributes(&pConfig, 1));

      // ②ビデオ キャプチャ デバイスを要求
CHECK_HR(hr = pConfig->SetGUID(
MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE,
MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_GUID
));
// ③デバイスの列挙
CHECK_HR(hr = MFEnumDeviceSources(
pConfig, &ppDevices, &count));

      // ④リスト内の最初のデバイスからメディア ソースを作成
if (count > 0)
{
CHECK_HR(hr = ppDevices[0]->ActivateObject(
__uuidof(IMFMediaSource),
(void**)&pSource
));
}
else
{
hr = MF_E_NOT_FOUND;
}

// ⑤シンボリックリンクを作成
CHECK_HR(hr = pActivate->GetAllocatedString( MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_SYMBOLIC_LINK,
&m_pwszSymbolicLink,
&m_cchSymbolicLink
));

// ⑥MFPlayプレイヤーを作成
CHECK_HR(hr = MFPCreateMediaPlayer(
NULL,
FALSE,
0,
NULL,
m_hwnd,
&m_pPlayer
));

// ⑦このメディア ソース用のメディア アイテムを作成
CHECK_HR(hr = m_pPlayer->CreateMediaItemFromObject(
pSource,
FALSE,
0,
NULL
));

done:
for (DWORD i = 0; i < count; i++)
{
ppDevices[i]->Release();
}
CoTaskMemFree(ppDevices);
SAFE_RELEASE(pSource);
return hr;
}

注意: Media Foundationを使うとき、初めに MFStartup(MF_VERSION) を、最後に MFShutdown() を呼び出す必要があります。