一連のファイルを再生する方法
[このページに関連付けられている機能である MFPlay はレガシ機能です。 これは MediaPlayer および IMFMediaEngine に置き換えられました。 これらの機能は、Windows 10 および Windows 11 用に最適化されています。 Microsoftでは、新しいコードで可能な限り DirectShow ではなく MediaPlayer と IMFMediaEngine を使用することを強くお勧めします。 Microsoft は、レガシ API を使用する既存コードを、新しい API を使用するように可能であれば書き直すことを提案しています。]
このトピックでは、MFPlay を使用して一連のオーディオ/ビデオ ファイルを再生する方法について説明します。
「MFPlay の概要」トピックでは、1 つのメディア ファイルを再生する方法を示します。 MFPlay を使用して一連のファイルを再生することもできます。
同期 (ブロッキング) メソッド
- IMFPMediaPlayer::CreateMediaItemFromURL メソッドを呼び出します。 このメソッドは、メディア項目を作成します。
- IMFPMediaPlayer::SetMediaItem を呼び出して、再生用のメディア項目をキューに入れます。
- IMFPMediaPlayer::P lay を呼び出して再生を開始します。
これらの手順を次のコードに示します。
HRESULT OpenMediaFile(IMFPMediaPlayer *pPlayer, PCWSTR pwszURL)
{
HRESULT hr = S_OK;
IMFPMediaItem *pItem = NULL;
hr = pPlayer->CreateMediaItemFromURL(
sURL,
TRUE, // Blocking call
0, // User data.
&pItem
);
if (SUCCEEDED(hr))
{
hr = pPlayer->SetMediaItem(pItem);
}
if (SUCCEEDED(hr))
{
hr = pPlayer->Play();
}
if (pItem)
{
pItem->Release();
}
return hr;
}
CreateMediaItemFromURL メソッドは次のパラメーターを受け取ります。
- 最初のパラメーターは、ファイルの URL です。
- 2 番目のパラメーターは、メソッドがブロックされるかどうかを指定します。 次に示すように、値 TRUE を指定すると、メディア項目が作成されるまでメソッドがブロックされます。
- 3 番目のパラメーターは、任意の DWORD_PTR 値をメディア項目に関連付けます。 この値は、後で IMFPMediaItem::GetUserData を呼び出すことによって取得できます。
- 4 番目のパラメーターは、メディア項目の IMFPMediaItem インターフェイスへのポインターを受け取ります。
非同期 (非ブロッキング) メソッド
UI スレッドから CreateMediaItemFromURL を呼び出す場合は、ブロック オプションを使用しないでください。完了するまでにかなりの時間がかかる可能性があるためです。 このメソッドは通常、ファイルまたはネットワーク接続を開き、ファイル ヘッダーを解析するのに十分なデータを読み取りますが、これには時間がかかることがあります。 したがって、通常は 2 番目のパラメーターを FALSE に設定することをお勧めします。 このオプションにより、メソッドは非同期的に実行されます。 非同期オプションを使用する場合、最後のパラメーターは NULL である必要があります:
hr = pPlayer->CreateMediaItemFromURL(
sURL,
FALSE, // Non-blocking call.
0, // User data.
NULL // Must be NULL for the non-blocking call.
);
メディア項目が作成されると、アプリケーションは MFP_EVENT_TYPE_MEDIAITEM_CREATED イベントを受け取ります。 このイベントのデータ構造には、メディア項目へのポインターが含まれています。 このポインターを SetMediaItem メソッドに渡して、再生のために項目をキューに入れます。
void OnMediaItemCreated(MFP_MEDIAITEM_CREATED_EVENT *pEvent)
{
HRESULT hr = S_OK;
if (FAILED(pEvent->header.hrEvent))
{
// Handle error. (Not shown.)
}
else
{
hr = g_pPlayer->SetMediaItem(pEvent->pMediaItem);
}
}
要件
MFPlay には Windows 7 が必要です。
関連トピック