如何播放一連串的檔案
[與此頁面 MFPlay 相關聯的功能是舊版功能。 它已被 MediaPlayer 和 IMFMediaEngine 取代。 這些功能已針對 Windows 10 和 Windows 11 進行優化。 Microsoft強烈建議新程式代碼盡可能使用 MediaPlayer 和 IMFMediaEngine,而不是 DirectShow。 Microsoft建議使用舊版 API 的現有程式代碼,盡可能改寫成使用新的 API。]
本主題描述如何使用 MFPlay 播放一系列音訊/視訊檔案。
開始使用 MFPlay 主題示範如何播放單一媒體檔案。 您也可以使用 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。
- 第二個參數會指定方法是否封鎖。 如這裡所示,指定 TRUE 值會導致 方法封鎖,直到建立媒體項目為止。
- 第三個參數會將任意 DWORD_PTR 值與媒體專案產生關聯。 您稍後可以呼叫 IMFPMediaItem::GetUserData 來取得此值。
- 第四個參數會接收媒體專案之 IMFPMediaItem 介面的指標。
異步 (非封鎖) 方法
如果您從UI線程呼叫 CreateMediaItemFromURL ,請避免封鎖選項,因為可能需要相當長的時間才能完成。 方法通常會開啟檔案或網路連線,並讀取足夠的數據來剖析檔案標頭,這一切可能需要一些時間。 因此,通常最好將第二個參數設定為 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。
相關主題