如何播放文件序列

[MFPlay 可用于“要求”部分中指定的操作系统。 它可能在后续版本中变更或不可用。 ]

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

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

同步 (阻止) 方法

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

使用 MFPlay 进行音频/视频播放