Cara Membuat Daftar Putar
Topik ini menjelaskan cara menggunakan Sumber Urutan untuk memutar urutan file.
Gambaran Umum
Untuk memutar file media secara berurutan, aplikasi harus menambahkan topologi secara berurutan untuk membuat daftar putar, dan mengantrekan topologi ini pada Sesi Media untuk pemutaran.
Sumber pengurut memastikan pemutaran yang mulus dengan menginisialisasi dan memuat topologi berikutnya sebelum Sesi Media mulai memutar topologi saat ini. Ini memungkinkan aplikasi untuk memulai topologi berikutnya dengan cepat setiap kali diperlukan.
Sesi Media bertanggung jawab untuk mengumpankan data ke sink dan memutar topologi di sumber urutan. Selain itu, Sesi Media mengelola waktu presentasi untuk segmen.
Untuk informasi selengkapnya tentang cara sumber pengurut mengelola topologi, lihat Tentang Sumber Pengurut.
Panduan ini berisi langkah-langkah berikut:
- Prasyarat
- Menginisialisasi Media Foundation
- Membuat Objek Media Foundation
- Membuat Sumber Media
- Membuat Topologi Parsial
- Menambahkan Topologi ke Sumber Sequencer
- Mengatur Topologi Pertama pada Sesi Media
- MengantreKan Topologi Berikutnya pada Sesi Media
- Merilis Sumber Pengurut
Contoh kode yang ditunjukkan topik ini adalah kutipan dari topik Kode Contoh Sumber Sequencer, yang berisi kode contoh lengkap.
Prasyarat
Sebelum memulai panduan ini, biasakan diri Anda dengan konsep Media Foundation berikut:
Baca juga Cara Memutar File Media dengan Media Foundation, karena contoh kode shwon di sini memperluas kode dalam topik tersebut.
Menginisialisasi Media Foundation
Sebelum Anda dapat menggunakan antarmuka atau metode Media Foundation apa pun, inisialisasi Media Foundation dengan memanggil fungsi MFStartup . Untuk informasi selengkapnya, lihat Menginisialisasi Media Foundation.
hr = MFStartup(MF_VERSION);
Membuat Objek Media Foundation
Selanjutnya, buat objek Media Foundation berikut:
- Sesi media. Objek ini mengekspos antarmuka IMFMediaSession , yang menyediakan metode untuk memutar, menjeda, dan menghentikan topologi saat ini.
- Sumber pengurut. Objek ini mengekspos antarmuka IMFSequencerSource , yang menyediakan metode untuk menambahkan, memperbarui, dan menghapus topologi secara berurutan.
- Panggil fungsi MFCreateMediaSession untuk membuat Sesi Media.
- Panggil IMFMediaEventQueue::BeginGetEvent untuk meminta peristiwa pertama dari Sesi Media.
- Panggil fungsi MFCreateSequencerSource untuk membuat sumber pengurut.
Kode berikut membuat Sesi Media dan meminta peristiwa pertama:
// Create a new instance of the media session.
HRESULT CPlayer::CreateSession()
{
// Close the old session, if any.
HRESULT hr = CloseSession();
if (FAILED(hr))
{
goto done;
}
assert(m_state == Closed);
// Create the media session.
hr = MFCreateMediaSession(NULL, &m_pSession);
if (FAILED(hr))
{
goto done;
}
// Start pulling events from the media session
hr = m_pSession->BeginGetEvent((IMFAsyncCallback*)this, NULL);
if (FAILED(hr))
{
goto done;
}
m_state = Ready;
done:
return hr;
}
Membuat Sumber Media
Selanjutnya, buat sumber media untuk segmen daftar putar pertama. Gunakan Pemecah Masalah Sumber untuk membuat sumber media dari URL. Untuk melakukan ini, panggil fungsi MFCreateSourceResolver untuk membuat resolver sumber lalu panggil metode IMFSourceResolver::CreateObjectFromURL untuk membuat sumber media.
Untuk informasi tentang sumber media, lihat Sumber Media.
Membuat Topologi Parsial
Setiap segmen dalam sumber pengurut memiliki topologi parsialnya sendiri. Selanjutnya, buat topologi parsial untuk sumber media. Untuk topologi parsial, simpul sumber topologi terhubung langsung ke simpul output, tanpa menentukan transformasi perantara. Sesi Media menggunakan objek pemuat topologi untuk menyelesaikan topologi. Setelah topologi diselesaikan, dekode yang diperlukan dan node transformasi lainnya ditambahkan. Sumber pengurut juga dapat berisi topologi lengkap.
Untuk membuat objek topologi, gunakan fungsi MFCreateTopology lalu gunakan antarmuka IMFTopologyNode untuk membuat simpul aliran.
Untuk petunjuk lengkap tentang menggunakan elemen pemrograman ini untuk membuat topologi, lihat Membuat Topologi Pemutaran.
Aplikasi dapat memutar bagian yang dipilih dari sumber asli dengan mengonfigurasi simpul sumber. Untuk melakukan ini, atur atribut MF_TOPONODE_MEDIASTART dan atribut MF_TOPONODE_MEDIASTOP pada node topologi MF_TOPOLOGY_SOURCESTREAM_NODE. Tentukan waktu mulai media dan waktu henti media relatif terhadap awal sumber asli sebagai jenis UINT64 .
Menambahkan Topologi ke Sumber Sequencer
Selanjutnya, tambahkan ke sumber pengurut topologi parsial yang Anda buat. Setiap elemen urutan, yang disebut segmen, diberi pengidentifikasi MFSequencerElementId . Untuk informasi selengkapnya tentang cara sumber pengurut mengelola topologi, lihat Tentang Sumber Pengurut.
Setelah semua topologi ditambahkan ke sumber pengurut, aplikasi harus menandai segmen terakhir dalam urutan untuk mengakhiri pemutaran di alur. Tanpa bendera ini, sumber pengurut mengharapkan lebih banyak topologi ditambahkan.
Panggil metode IMFSequencerSource::AppendTopology untuk menambahkan topologi tertentu ke sumber pengurut.
hr = m_pSequencerSource->AppendTopology( pTopology, SequencerTopologyFlags_Last, &SegmentId );
AppendTopology menambahkan topologi yang ditentukan ke urutan. Metode ini mengembalikan pengidentifikasi segmen dalam parameter pdwId .
Jika topologi adalah yang terakhir dalam sumber pengurut, teruskan SequencerTopologyFlags_Last dalam parameter dwFlags . Nilai ini didefinisikan dalam enumerasi MFSequencerTopologyFlags .
Panggil IMFSequencerSource::UpdateTopologyFlags untuk memperbarui bendera untuk topologi yang terkait dengan pengidentifikasi segmen dalam daftar input. Dalam hal ini, panggilan menunjukkan bahwa segmen yang ditentukan adalah segmen terakhir dalam sequencer. (Panggilan ini bersifat opsional jika topologi terakhir ditentukan dalam panggilan AppendTopology .)
BOOL bFirstSegment = (NumSegments() == 0); if (!bFirstSegment) { // Remove the "last segment" flag from the last segment. hr = m_pSequencerSource->UpdateTopologyFlags(LastSegment(), 0); if (FAILED(hr)) { goto done; } }
Aplikasi ini dapat mengganti topologi segmen dengan topologi lain dengan memanggil IMFSequencerSource::UpdateTopology dan meneruskan topologi baru dalam pTopology. Jika ada sumber asli baru dalam topologi baru, sumber ditambahkan ke cache sumber. Daftar pra-pendaftaran juga di-refresh.
Mengatur Topologi Pertama pada Sesi Media
Selanjutnya, antrekan topologi pertama dalam sumber urutan pada Sesi Media. Untuk mendapatkan topologi pertama dari sumber pengurut, aplikasi harus memanggil metode IMFMediaSourceTopologyProvider::GetMediaSourceTopology . Metode ini mengembalikan topologi parsial, yang diselesaikan oleh Sesi Media.
Untuk informasi tentang topologi parsial, lihat Tentang Topologi.
Ambil sumber media asli untuk topologi pertama sumber urutan.
Buat deskriptor presentasi untuk sumber media dengan memanggil metode IMFMediaSource::CreatePresentationDescriptor .
Ambil topologi terkait untuk presentasi dengan memanggil metode IMFMediaSourceTopologyProvider::GetMediaSourceTopology .
Atur topologi pertama pada Sesi Media dengan Memanggil IMFMediaSession::SetTopology.
Panggil SetTopology dengan parameter dwSetTopologyFlags diatur ke NULL. Ini menginstruksikan Sesi Media untuk memulai topologi yang ditentukan ketika topologi saat ini telah selesai. Karena dalam hal ini, topologi yang ditentukan adalah topologi pertama dan tidak ada presentasi saat ini, Sesi Media segera memulai presentasi baru.
Nilai NULL juga menunjukkan bahwa Sesi Media harus menyelesaikan topologi karena topologi yang dikembalikan oleh penyedia topologi selalu merupakan topologi parsial.
// Queues the next topology on the session.
HRESULT CPlaylist::QueueNextSegment(IMFPresentationDescriptor *pPD)
{
IMFMediaSourceTopologyProvider *pTopoProvider = NULL;
IMFTopology *pTopology = NULL;
//Get the topology for the presentation descriptor
HRESULT hr = m_pSequencerSource->QueryInterface(IID_PPV_ARGS(&pTopoProvider));
if (FAILED(hr))
{
goto done;
}
hr = pTopoProvider->GetMediaSourceTopology(pPD, &pTopology);
if (FAILED(hr))
{
goto done;
}
//Set the topology on the media session
m_pSession->SetTopology(NULL, pTopology);
done:
SafeRelease(&pTopoProvider);
SafeRelease(&pTopology);
return hr;
}
MengantreKan Topologi Berikutnya pada Sesi Media
Selanjutnya, aplikasi perlu menangani peristiwa MENewPresentation .
Sumber sequencer meningkatkan MENewPresentation ketika Sesi Media mulai memutar segmen yang memiliki segmen lain mengikutinya. Acara ini menginformasikan aplikasi tentang topologi berikutnya dalam sumber urutan dengan menyediakan deskriptor presentasi untuk segmen berikutnya dalam daftar pra-pendaftaran. Aplikasi harus mengambil topologi terkait, dengan menggunakan penyedia topologi, dan mengantrekannya pada Sesi Media. Sumber pengurut kemudian mendaftarkan topologi ini, yang memastikan transisi yang mulus antar presentasi.
Ketika aplikasi mencari di seluruh segmen, aplikasi menerima beberapa peristiwa MENewPresentation saat sumber pengurut me-refresh daftar pra-pendaftaran dan menyiapkan topologi yang benar. Aplikasi harus menangani setiap peristiwa dan mengantre topologi yang dikembalikan dalam data peristiwa, pada Sesi Media. Untuk informasi tentang melewatkan segmen, lihat Menggunakan Sumber Pengurut.
Untuk informasi tentang mendapatkan pemberitahuan sumber pengurut, lihat Peristiwa Sumber Pengurut.
Di penanganan aktivitas MENewPresentation , ambil deskriptor presentasi untuk segmen berikutnya dari data peristiwa.
Dapatkan topologi terkait untuk presentasi dengan memanggil metode IMFMediaSourceTopologyProvider::GetMediaSourceTopology .
Atur topologi pada Sesi Media dengan memanggil metode IMFMediaSession::SetTopology .
Sesi Media memulai presentasi baru ketika presentasi saat ini telah selesai.
HRESULT CPlaylist::OnNewPresentation(IMFMediaEvent *pEvent)
{
IMFPresentationDescriptor *pPD = NULL;
HRESULT hr = GetEventObject(pEvent, &pPD);
if (SUCCEEDED(hr))
{
// Queue the next segment on the media session
hr = QueueNextSegment(pPD);
}
SafeRelease(&pPD);
return hr;
}
Merilis Sumber Pengurut
Terakhir, matikan sumber pengurut. Untuk melakukannya, panggil metode IMFMediaSource::Shutdown pada sumber pengurut. Panggilan ini mematikan semua sumber media asli yang mendasar di sumber pengurut.
Setelah merilis sumber pengurut, aplikasi harus menutup dan mematikan Sesi Media dengan memanggil IMFMediaSession::Close dan IMFMediaSession::Shutdown, dalam urutan tersebut.
Untuk menghindari kebocoran memori, aplikasi harus merilis pointer ke antarmuka Media Foundation ketika tidak lagi diperlukan.
Langkah berikutnya
Panduan ini menggambarkan cara membuat daftar putar dasar dengan menggunakan sumber pengurut. Setelah membuat daftar putar, Anda mungkin ingin menambahkan fitur lanjutan seperti melewatkan segmen, mengubah status pemutaran, dan mencari dalam segmen. Daftar berikut ini menyediakan tautan ke topik terkait:
- Cara Mengontrol Status Presentasi: Sumber pengurut bergantung pada Sesi Media untuk menyediakan kontrol transportasi seperti, Putar, Jeda, dan Berhenti.
- Cara Melakukan Scrubbing menjelaskan langkah-langkah yang diperlukan untuk mencari posisi tertentu dalam aliran.
Topik terkait