Media Foundation ② WebCam キャプチャ

Published 04 June 09 05:08 PM | hiroyuk 

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() を呼び出す必要があります。

Comments

No Comments
Anonymous comments are disabled

About hiroyuk

マイクロソフト㈱エバンジェリスト。北海道大学理学部物理学科卒。リアルタイム3Dグラフィックスを専門とし、グラフィックスやシェーダに関する技術文章を執筆・講演。 DirectX SDK日本語ドキュメントの開発に携わるとともに、Windows Presentation Foundation プログラミング(オーム社)、Game Programming Gemsシリーズ、リアルタイム レンダリング第2版(ボーンデジタル)、Texturing & Modeling, A Procedural Approach などを翻訳・監修、XAMLプログラミング(ソフトバンク クリエイティブ)を執筆。趣味は薪割り。

Search

This Blog

DirectX 情報

Silverlight 情報

Windows 情報

WPF 情報

並列コンピューティング情報

著書

Syndication

Page view tracker