视频预览

[与本页关联的功能 MFPlay 是一项旧版功能。 它已被 MediaPlayerIMFMediaEngine 取代。 这些功能已针对 Windows 10 和 Windows 11 进行了优化。 Microsoft 强烈建议新代码尽可能使用 MediaPlayerIMFMediaEngine,而不是 DirectShow。 如果可能,Microsoft 建议应重写使用旧 API 的现有代码,以尽可能地使用新的 API。]

本主题介绍如何使用 MFPlay 从摄像相机预览视频。

MFPlay 提供在 Microsoft Media Foundation 中从捕获设备预览视频的最简单方法。 如果满足以下条件,应使用 MFPlay:

  • 无需将视频捕获到文件。
  • 无需对视频的呈现方式进行精细控制。 (例如,无需控制 Direct3D 设备的创建。)
  • 在渲染之前,无需处理相机中的视频数据。

否则,源读取器可能是更好的选择。

若要将 MFPlay 与视频捕获设备配合使用,请执行以下步骤:

  1. 为捕获设备创建媒体源。 请参阅枚举视频捕获设备
  2. 调用 MFPCreateMediaPlayer 以创建播放器对象的实例。
  3. 调用 IMFPMediaPlayer::CreateMediaItemFromObject 方法。 传入指向媒体源的 IMFMediaSource 接口的指针。 该方法接收指向 IMFPMediaItem 接口的指针。
  4. 调用 IMFPMediaPlayer::SetMediaItem
  5. 调用 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 入门

正在关闭

在应用程序退出之前,请关闭媒体源和播放器对象,如下所示:

  1. 对媒体源调用 IMFMediaSource::Shutdown
  2. 对播放器对象调用 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。

MFPlay

视频捕获