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 にあります。
手順は以下の通りです。
- MFCreateAttribure関数を呼び出しアトリビュートストアを作成
- MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE に MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_GUID を指定
- MFEnumDeviceSource 関数を呼び出し、デバイスを列挙
- IMFActivate::ActivateObjectメソッドを呼び出し、そのアクティベーション オブジェクトからメディア ソース オブジェクトを作成
- シンボリック リンクを作成(デバイス ロストのチェックに必要)
- MFPlay プレイヤーを作成
- 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() を呼び出す必要があります。