Langkah 3: Buka File Media
Topik ini adalah langkah 3 dari tutorial Cara Memutar File Media dengan Media Foundation. Kode lengkap ditampilkan dalam topik Contoh Pemutaran Sesi Media.
Metode CPlayer::OpenURL
ini membuka file media dari 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;
}
Metode ini melakukan langkah-langkah berikut:
- Memanggil CPlayer::CreateSession untuk membuat instans baru Sesi Media. Lihat Langkah 4: Membuat Sesi Media.
- Membuat sumber media dari URL. Kode lengkap untuk langkah ini ditampilkan dalam topik Menggunakan Pemecah Masalah Sumber.
- Memanggil IMFMediaSource::CreatePresentationDescriptor untuk mendapatkan deskriptor presentasi sumber media. Deskriptor presentasi menjelaskan setiap aliran dalam file sumber.
- Membuat topologi pemutaran. Kode untuk langkah ini ditampilkan dalam topik Membuat Topologi Pemutaran.
- Memanggil IMFMediaSession::SetTopology untuk mengatur topologi pada Sesi Media.
Metode SetTopology selesai secara asinkron. Setelah selesai, metode IMFAsyncCallback::Invoke objek CPlayer dipanggil; lihat Langkah 5: Menangani Peristiwa Sesi Media.
Berikutnya: Langkah 4: Membuat Sesi Media
Topik terkait