Menerapkan Kontrol Laju
Topik ini menjelaskan bagaimana objek alur kustom dapat mendukung laju pemutaran variabel, termasuk pemutaran terbalik. Untuk informasi tentang menggunakan kontrol laju dari aplikasi, lihat Kontrol Laju.
Topik ini berisi bagian berikut:
Jika Anda menulis objek alur Microsoft Media Foundation (sumber media, transformasi, atau sink media), Anda mungkin perlu mendukung laju pemutaran variabel. Untuk melakukannya, terapkan antarmuka berikut:
- Terapkan antarmuka IMFGetService .
- Mendukung layanan MF_RATE_CONTROL_SERVICE. (Lihat Antarmuka Layanan.)
- Terapkan antarmuka IMFRateSupport , yang mendapatkan laju pemutaran yang didukung oleh objek.
- Terapkan antarmuka IMFRateControl , yang mendapatkan atau mengatur laju pemutaran.
Sumber Media
Jika sumber media mendukung kontrol laju, sumber tersebut harus mengimplementasikan IMFRateSupport dan IMFRateControl. Jika tidak, Sesi Media melaporkan bahwa laju pemutaran minimum dan maksimum adalah 1,0, terlepas dari komponen lain apa yang ada di alur.
Laju pemutaran tidak memengaruhi waktu presentasi sampel, sehingga sumber media tidak boleh menyesuaikan stempel waktunya. Sebagai gantinya, jam presentasi berjalan pada kecepatan yang lebih cepat atau lebih lambat. Untuk pemutaran terbalik, sumber mengirimkan sampel dalam urutan terbalik, dengan pengurangan stempel waktu.
Parameter fThin dari metode IMFRateControl::SetRate menunjukkan apakah sumber media harus men tipis konten. Penipisan terutama berlaku untuk streaming video. Dalam mode tipis, sumber menghilangkan bingkai delta dan hanya memberikan bingkai kunci. Pada tingkat pemutaran yang sangat tinggi, sumber mungkin melewati beberapa bingkai kunci (misalnya, mengirimkan setiap bingkai kunci lainnya).
Sumber tidak harus menghilangkan sampel audio dalam mode yang ditipiskan. Namun, pada tingkat pemutaran yang sangat tinggi, sumber mungkin tidak dapat membaca data dengan cukup cepat untuk mengisi permintaan sampel alur. Dalam hal ini, sumber mungkin perlu menghilangkan beberapa data audio. Jika demikian, ia harus mencoba mengirimkan sampel audio yang mendekati sampel video (dengan asumsi bahwa sumber memiliki kedua jenis aliran).
Saat aliran bertransisi antara mode yang ditipiskan dan tidak ditipiskan, aliran mengirimkan peristiwa MEStreamThinMode .
Ketika sumber media menyelesaikan panggilan ke SetRate, sumber media mengirimkan peristiwa MESourceRateChanged.
Selama pemutaran terbalik:
- Sumber media memberikan sampel dalam urutan terbalik, tanpa menyesuaikan stempel waktu.
- Stempel waktu dalam aliran harus berkurang secara monoton.
- Awal konten dianggap sebagai akhir aliran. Setelah setiap aliran media mengirimkan sampel pertama dalam aliran (yaitu, waktu presentasi = 0), aliran tersebut mengirimkan peristiwa MEEndOfStream .
Transformasi Media Foundation
Secara umum, transformasi Media Foundation (MFT) tidak memerlukan dukungan eksplisit untuk kontrol laju, kecuali MFT menerapkan pemutaran terbalik yang tidak ditipiskan.
Jika MFT tidak menerapkan antarmuka IMFRateSupport , Sesi Media mengasumsikan hal berikut:
- MFT mendukung laju pemutaran arbiter untuk pemutaran maju, baik yang ditipiskan maupun tidak ditipiskan.
- MFT mendukung pemutaran terbalik yang ditipiskan, tetapi tidak mendukung pemutaran terbalik yang tidak ditipiskan.
Jika salah satu kondisi ini tidak benar, MFT harus menerapkan IMFRateSupport dan IMFRateControl.
Putar Balik
Sesi Media dapat diputar secara terbalik meskipun satu atau beberapa transformasi dalam alur tidak secara eksplisit mendukung pemutaran terbalik.
Jika MFT tidak mengekspos antarmuka IMFRateSupport , Sesi Media menggunakan penipisan untuk pemutaran terbalik, sebagai berikut:
Sesi Media mengirimkan bingkai kunci ke MFT dengan cara yang biasa, dengan memanggil IMFTransform::P rocessInput.
Sesi Media menghilangkan bingkai delta dan menggantinya dengan peristiwa MEStreamTick .
Di antara setiap sampel, Sesi Media menghapus MFT, untuk menghindari kesalahan yang disebabkan oleh fakta bahwa stempel waktu menurun.
Sampel dianggap sebagai bingkai kunci jika atribut MFSampleExtension_CleanPoint diatur ke TRUE, dan dianggap sebagai bingkai delta jika atribut ini FALSE atau tidak diatur.
Jika MFT mengimplementasikan IMFRateSupport, Sesi Media menggunakan antarmuka ini untuk menemukan apakah MFT mendukung pemutaran terbalik yang tidak ditipiskan. Jika MFT mendukung pemutaran terbalik yang tidak ditipiskan, Sesi Media mengirimkan semua sampel, dalam urutan terbalik, tanpa menghilangkan sampel atau menghapus MFT.
Jika MFT mendukung pemutaran terbalik yang tidak ditipiskan, MFT harus mengimplementasikan antarmuka IMFRateControl . Sesi Media akan menggunakan antarmuka ini untuk memberi tahu MFT ketika pemutaran terbalik terjadi. Pada titik itu, MFT harus disiapkan agar stempel waktu berkurang dan agar bingkai delta tiba dalam urutan terbalik. Dekoder biasanya perlu menyangga sampel sampai menerima seluruh grup gambar (GOP), lalu mendekode seluruh GOP dan menghasilkan bingkai yang didekodekan dalam urutan yang benar (terbalik).
Sink Media
Jika sink media tidak memiliki tarif, Sesi Media mengasumsikan bahwa sink media dapat menangani laju pemutaran apa pun. Sink media tidak perlu menerapkan IMFRateSupport. (Sink media tanpa tarif mengembalikan bendera MEDIASINK_RATELESS dari METODE IMFMediaSink::GetCharacteristics .)
Jika tidak, sink media harus menerapkan IMFRateSupport jika dapat menangani laju pemutaran selain 1.0.
Sink media tidak boleh menerapkan IMFRateControl. Saat laju pemutaran berubah, jam presentasi memanggil metode IMFClockStateSink::OnClockSetRate sink media.
Topik terkait