如何播放文件序列

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

本主题介绍如何使用 MFPlay 播放一系列音频/视频文件。

MFPlay 入门主题演示如何播放单个媒体文件。 还可以使用 MFPlay 播放一系列文件。

同步(阻止)方法

  1. 调用 IMFPMediaPlayer::CreateMediaItemFromURL 方法。 该方法会创建媒体项。
  2. 调用 IMFPMediaPlayer::SetMediaItem 以对媒体项排队用于播放。
  3. 调用 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。

对音频/视频播放使用 MFPlay