Jaa


Media Foundation ① MFPlay

以前紹介したように、Media Foundation は Windows 7 でかなり使いやすくなりました。今回はメディア再生APIの MFPlay の使い方をGetting Started with MFPlayを基に解説します。

MFPlayを使うとき、インクルードファイルはmfplay.h、ライブラリはmfplay.libが必要です。また、WINVERは_WIN32_WINNT_WIN7です。サンプルコードは C:\Program Files\Microsoft SDKs\Windows\v7.0\Samples\Multimedia\MediaFoundation\SimplePlay にありますので、実際にコードを見て、ビルドしてみてください。

メディアファイルの再生

メディアを再生するには、以下のようにMFPCreateMediaPlayer関数を呼び出すだけです。

IMFPMediaPlayer         *g_pPlayer = NULL;

hr = MFPCreateMediaPlayer(
    sURL,       // ファイル名
    TRUE,        // 自動的に開始するかどうか
    0,             // フラグ
    NULL,        // コールバック ポインター
    hwnd,       // 表示ウィンドウ
    &g_pPlayer
    );

  • 第1引数はファイル名(あるいはURL)
  • 第2引数はファイルロード後自動的に再生を開始するかどうかを指定する真偽値、TRUEが自動再生
  • 第3引数はオプションで、デフォルト値は0.
  • 第4引数はオプションで、コールバック インターフェイスのポインターMFPlayは非同期でメディアを処理するので、多くの場合このコールバック関数を使用
  • 第5引数はウィンドウ ハンドル。オーディオのみの場合はNULL
  • 第6引数は返されるプレイヤー オブジェクトのIMFPlayerインターフェイス、このオブジェクトを使ってスタート、ポーズなどの制御をおこなう

再生の制御

Stop(), Play(), Pause()などのIMFPMediaPlayerインターフェイスのメソッドを使う。現在の状態はGetState()で取得する。

再生レート(速度)を変更するにはSetRate()メソッドを使う。1.0が標準速度、0.5が0.5倍速、2.0が2倍速です。マイナスにすると巻き戻し再生になります。

プレイヤーのイベントを処理

以下のようにMFPCreateMediPlayerの第4引数にコールバック インターフェイス ポインターを渡すと、MediaPlayerCallback::OnMediaPlayerEvent()コールバックを実装して、プレイヤーからのイベントに対応できます。

MediaPlayerCallback     *g_pPlayerCB = NULL;

g_pPlayerCB = new (std::nothrow) MediaPlayerCallback();

hr = MFPCreateMediaPlayer(
    sURL,
    FALSE,          
    0,              
    g_pPlayerCB,    
    hwnd,          
    &g_pPlayer
    );

...

void MediaPlayerCallback::OnMediaPlayerEvent(
                                  MFP_EVENT_HEADER * pEventHeader)
{
    if (FAILED(pEventHeader->hrEvent))
    {
        ShowErrorMessage(L"Playback error", pEventHeader->hrEvent);
        return;
    }

    switch (pEventHeader->eEventType)
    {
        ...
    }
}

メディア ファイルの情報を取得

MFPlayは渡されたメディアから、IMFPMediaItemインターフェイスを公開するメディア アイテムと呼ばれるオブジェクトを生成します。明示的にCreateMediaItemFromURL()メソッドを呼び出してメディア アイテムを作成することもできます。また、SetMediaItem()メソッドを使うと、同じプレイヤーで別のメディアを再生できます。

    hr = MFPCreateMediaPlayer(
        NULL,
        FALSE,       
        0,              
        g_pPlayerCB,
        hwnd,           
        &g_pPlayer
        );
    hr = g_pPlayer->CreateMediaItemFromURL(sURL, FALSE, 0, NULL);

IMFPMediaItemインターフェイスを使うと、メディアにビデオが含まれているか、オーディオが含まれているか、メディアの尺(時間幅)などの情報を取得できます。

MFPlayの制限

  • デフォルトではストリーミングに対応していません。rtsp*, mms*, mcastプロトコルには対応していないので、その場合は Source Resolver が必要。
  • DRMで保護されたメディアに対応していません。
  • サーバーサイド プレイリストに対応していません。
  • 動作には Windows 7 以降が必要です。