步骤 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:处理媒体会话事件。
相关主题