Menerapkan Kontrol Laju

Topik ini menjelaskan bagaimana objek alur kustom dapat mendukung laju pemutaran variabel, termasuk pemutaran terbalik. Untuk informasi tentang menggunakan kontrol tarif 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:

  1. Terapkan antarmuka IMFGetService .
  2. Mendukung layanan MF_RATE_CONTROL_SERVICE . (Lihat Antarmuka Layanan.)
  3. Terapkan antarmuka IMFRateSupport , yang mendapatkan tingkat pemutaran yang didukung oleh objek .
  4. Terapkan antarmuka IMFRateControl , yang mendapatkan atau mengatur laju pemutaran.

Sumber Media

Jika sumber media mendukung kontrol laju, sumber media 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 dalam alur.

Laju pemutaran tidak memengaruhi waktu presentasi sampel, sehingga sumber media tidak boleh menyesuaikan stempel waktunya. Sebaliknya, jam presentasi berjalan pada kecepatan yang lebih cepat atau lebih lambat. Untuk pemutaran terbalik, sumber mengirimkan sampel dalam urutan terbalik, dengan stempel waktu yang menurun.

Parameter fThin dari metode IMFRateControl::SetRate menunjukkan apakah sumber media harus men tipis konten. Penipisan berlaku terutama untuk streaming video. Dalam mode tipis, sumber menghilangkan bingkai delta dan hanya memberikan bingkai kunci. Pada laju pemutaran yang sangat tinggi, sumber mungkin melewati beberapa bingkai kunci (misalnya, memberikan setiap bingkai kunci lainnya).

Sumber tidak harus menjatuhkan sampel audio dalam mode yang di-thinned. Namun, pada tingkat pemutaran yang sangat tinggi, sumber mungkin tidak dapat membaca data dengan 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 waktu ke sampel video (dengan asumsi bahwa sumber memiliki kedua jenis aliran).

Saat streaming beralih antara mode yang di-thinned dan tidak di-thinned, streaming mengirimkan peristiwa MEStreamThinMode .

Ketika sumber media menyelesaikan panggilan ke SetRate, sumber media mengirimkan peristiwa MESourceRateChanged .

Selama pemutaran balik:

  • 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 akan mengirimkan peristiwa MEEndOfStream .

Transformasi Media Foundation

Secara umum, transformasi Media Foundation (MFT) tidak memerlukan dukungan eksplisit untuk kontrol laju, kecuali MFT mengimplementasikan pemutaran balik yang tidak ditipiskan.

Jika MFT tidak mengimplementasikan antarmuka IMFRateSupport , Sesi Media mengasumsikan hal berikut:

  • MFT mendukung laju pemutaran arbiter untuk pemutaran maju, baik ditipiskan maupun tidak ditipiskan.
  • MFT mendukung pemutaran terbalik yang di-thinned, tetapi tidak mendukung pemutaran terbalik yang tidak ditipis.

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 balik.

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 memerah 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 balik yang tidak ditipiskan. Jika MFT mendukung pemutaran terbalik yang tidak di-thinned, Sesi Media mengirimkan semua sampel, dalam urutan terbalik, tanpa menghilangkan sampel atau membersihkan MFT.

Jika MFT mendukung pemutaran balik yang tidak di-thinned, MFT harus mengimplementasikan antarmuka IMFRateControl . Sesi Media akan menggunakan antarmuka ini untuk memberi tahu MFT ketika pemutaran terbalik terjadi. Pada saat 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 mengimplementasikan IMFRateControl. Ketika laju pemutaran berubah, jam presentasi memanggil metode IMFClockStateSink::OnClockSetRate media sink .

Kontrol Laju

Mencari, Maju Cepat, dan Putar Terbalik