步驟 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;
}
此方法會執行下列步驟:
- 呼叫 CPlayer::CreateSession 以建立媒體會話的新實例。 請參閱 步驟 4:建立媒體會話。
- 從 URL 建立媒體來源。 此步驟的完整程式碼會顯示在 使用來源解析程式主題中。
- 呼叫 IMFMediaSource::CreatePresentationDescriptor 以取得媒體來源的簡報描述元。 簡報描述項會描述來源檔案中的每個資料流程。
- 建立播放拓撲。 此步驟的程式碼會顯示在 建立播放拓撲主題中。
- 呼叫 IMFMediaSession::SetTopology 以在媒體會話上設定拓撲。
SetTopology方法會以非同步方式完成。 完成時,會呼叫 CPlayer 物件的 IMFAsyncCallback::Invoke 方法;請參閱 步驟 5:處理媒體會話事件。
相關主題