步骤 3:打开媒体文件

本主题是 教程如何使用 Media Foundation 播放媒体文件的步骤 3。 完整的代码显示在主题 媒体会话播放示例中。

方法 CPlayer::OpenURL 从 URL 打开媒体文件。

//  Open a URL for playback.
HRESULT CPlayer::OpenURL(const WCHAR *sURL)
{
    // 1. Create a new media session.
    // 2. Create the media source.
    // 3. Create the topology.
    // 4. Queue the topology [asynchronous]
    // 5. Start playback [asynchronous - does not happen in this method.]

    IMFTopology *pTopology = NULL;
    IMFPresentationDescriptor* pSourcePD = NULL;

    // Create the media session.
    HRESULT hr = CreateSession();
    if (FAILED(hr))
    {
        goto done;
    }

    // Create the media source.
    hr = CreateMediaSource(sURL, &m_pSource);
    if (FAILED(hr))
    {
        goto done;
    }

    // Create the presentation descriptor for the media source.
    hr = m_pSource->CreatePresentationDescriptor(&pSourcePD);
    if (FAILED(hr))
    {
        goto done;
    }

    // Create a partial topology.
    hr = CreatePlaybackTopology(m_pSource, pSourcePD, m_hwndVideo, &pTopology);
    if (FAILED(hr))
    {
        goto done;
    }

    // Set the topology on the media session.
    hr = m_pSession->SetTopology(0, pTopology);
    if (FAILED(hr))
    {
        goto done;
    }

    m_state = OpenPending;

    // If SetTopology succeeds, the media session will queue an 
    // MESessionTopologySet event.

done:
    if (FAILED(hr))
    {
        m_state = Closed;
    }

    SafeRelease(&pSourcePD);
    SafeRelease(&pTopology);
    return hr;
}

此方法执行以下步骤:

  1. 调用 CPlayer::CreateSession 以创建媒体会话的新实例。 请参阅 步骤 4:创建媒体会话
  2. 从 URL 创建媒体源。 使用 源冲突解决程序主题中显示了此步骤的完整代码。
  3. 调用 IMFMediaSource::CreatePresentationDescriptor 获取媒体源的表示描述符。 演示文稿描述符描述源文件中的每个流。
  4. 创建播放拓扑。 创建 播放拓扑主题中显示了此步骤的代码。
  5. 调用 IMFMediaSession::SetTopology 在媒体会话上设置拓扑。

SetTopology 方法异步完成。 完成后,将调用 CPlayer 对象的 IMFAsyncCallback::Invoke 方法;请参阅 步骤 5:处理媒体会话事件

下一 步:步骤 4:创建媒体会话

音频/视频播放

如何使用 Media Foundation 播放媒体文件