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 にあります。
手順は以下の通りです。
#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; }
// ⑥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() を呼び出す必要があります。