[与本页关联的功能 MFPlay 是一项旧版功能。 它已被 MediaPlayer 和 IMFMediaEngine 取代。 这些功能已针对 Windows 10 和 Windows 11 进行了优化。 Microsoft 强烈建议新代码尽可能使用 MediaPlayer 和 IMFMediaEngine,而不是 DirectShow。 如果可能,Microsoft 建议应重写使用旧 API 的现有代码,以尽可能地使用新的 API。]
本主题介绍如何使用 MFPlay 从摄像相机预览视频。
MFPlay 提供在 Microsoft Media Foundation 中从捕获设备预览视频的最简单方法。 如果满足以下条件,应使用 MFPlay:
- 无需将视频捕获到文件。
- 无需对视频的呈现方式进行精细控制。 (例如,无需控制 Direct3D 设备的创建。)
- 在渲染之前,无需处理相机中的视频数据。
否则,源读取器可能是更好的选择。
若要将 MFPlay 与视频捕获设备配合使用,请执行以下步骤:
- 为捕获设备创建媒体源。 请参阅枚举视频捕获设备。
- 调用 MFPCreateMediaPlayer 以创建播放器对象的实例。
- 调用 IMFPMediaPlayer::CreateMediaItemFromObject 方法。 传入指向媒体源的 IMFMediaSource 接口的指针。 该方法接收指向 IMFPMediaItem 接口的指针。
- 调用 IMFPMediaPlayer::SetMediaItem。
- 调用 IMFPMediaPlayer::Play 以开始预览。
以下代码演示了这些步骤:
IMFPMediaItem *pItem = NULL;
if (SUCCEEDED(hr))
{
hr = MFPCreateMediaPlayer(
NULL, // URL.
FALSE, // Do not start playback yet.
0, // Option flags.
NULL, // Callback interface.
hwnd,
&g_pPlayer
);
}
if (SUCCEEDED(hr))
{
hr = g_pPlayer->CreateMediaItemFromObject(
g_pSource,
TRUE, // Blocking call.
0, // User data.
&pItem
);
}
if (SUCCEEDED(hr))
{
hr = g_pPlayer->SetMediaItem(pItem);
}
if (SUCCEEDED(hr))
{
hr = g_pPlayer->Play();
}
SafeRelease(&pItem);
在典型应用程序中,你将提供指向 MFPCreateMediaPlayer 函数中的回调接口的指针,然后使用回调接口从播放器获取事件。 为简单起见,此处显示的代码将跳过这些步骤。 有关详细信息,请参阅 MFPlay 入门。
正在关闭
在应用程序退出之前,请关闭媒体源和播放器对象,如下所示:
- 对媒体源调用 IMFMediaSource::Shutdown。
- 对播放器对象调用 IMFPMediaPlayer::Shutdown。
if (g_pSource)
{
g_pSource->Shutdown();
g_pSource->Release();
g_pSource = NULL;
}
if (g_pPlayer)
{
g_pPlayer->Shutdown();
g_pPlayer->Release();
g_pPlayer = NULL;
}
要求
MFPlay 需要 Windows 7。
相关主题