如何播放文件序列
[MFPlay 可用于“要求”部分中指定的操作系统。 它可能在后续版本中变更或不可用。 ]
本主题介绍如何使用 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。
相关主题
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈