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 以降が必要です。