如何播放文件序列
[与本页关联的功能 MFPlay 是一项旧版功能。 它已被 MediaPlayer 和 IMFMediaEngine 取代。 这些功能已针对 Windows 10 和 Windows 11 进行了优化。 Microsoft 强烈建议新代码尽可能使用 MediaPlayer 和 IMFMediaEngine,而不是 DirectShow。 如果可能,Microsoft 建议应重写使用旧 API 的现有代码,以尽可能地使用新的 API。]
本主题介绍如何使用 MFPlay 播放一系列音频/视频文件。
MFPlay 入门主题演示如何播放单个媒体文件。 还可以使用 MFPlay 播放一系列文件。
同步(阻止)方法
- 调用 IMFPMediaPlayer::CreateMediaItemFromURL 方法。 该方法会创建媒体项。
- 调用 IMFPMediaPlayer::SetMediaItem 以对媒体项排队用于播放。
- 调用 IMFPMediaPlayer::Play 以开始播放。
这些步骤在以下代码中显示。
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。
相关主题