共用方式為


步驟 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:建立媒體會話

音訊/視訊播放

如何使用媒體基礎播放媒體檔案