Bagikan melalui


Menerapkan Kontrol Laju

Topik ini menjelaskan bagaimana objek alur kustom dapat mendukung laju pemutaran variabel, termasuk pemutaran terbalik. Untuk informasi tentang penggunaan pengendalian kecepatan dari aplikasi, lihat Pengendalian Kecepatan.

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 laju pemutaran yang didukung oleh objek.
  4. 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 apapun komponen lain 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 terkompresi, sumber menghapus bingkai delta dan mengirimkan hanya 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 memenuhi permintaan sampel pipeline. 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 pengendalian kecepatan, kecuali MFT menerapkan pemutaran terbalik tanpa pengurangan.

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.

Pemutaran Mundur

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 akan menggunakan teknik "thinning" untuk pemutaran mundur, seperti berikut:

  • Sesi Media mengirimkan bingkai kunci ke MFT dengan cara yang biasa, dengan memanggil IMFTransform::ProcessInput.

  • Media Session menghilangkan frame delta dan menggantinya dengan peristiwa MEStreamTick.

  • Di antara setiap sampel, Sesi Media membersihkan MFT, untuk menghindari kesalahan yang disebabkan oleh menurunnya stempel waktu.

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, Media Session mengirimkan semua sampel, dalam urutan terbalik, tanpa menghilangkan sampel atau mengosongkan MFT.

Jika suatu MFT mendukung pemutaran ulang terbalik yang tidak dipercepat, maka MFT tersebut seharusnya mengimplementasikan antarmuka IMFRateControl. Sesi Media akan menggunakan antarmuka ini untuk memberi tahu MFT ketika terjadi pemutaran terbalik. Pada titik itu, MFT harus bersiap agar stempel waktu berkurang dan agar frame 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).

Penerima Media

Jika media sink tidak berbatas laju, Sesi Media menganggap bahwa media sink dapat menangani kecepatan pemutaran apa pun. Media sink tidak perlu menerapkan IMFRateSupport. (Sink media tanpa laju tetap mengembalikan penanda MEDIASINK_RATELESS dari IMFMediaSink::GetCharacteristics.)

Jika tidak, penerima media harus menerapkan IMFRateSupport jika dapat menangani laju pemutaran selain 1.0.

Media sink tidak boleh menerapkan IMFRateControl. Ketika laju pemutaran berubah, jam presentasi memanggil metode IMFClockStateSink::OnClockSetRate dari media sink.

Kontrol Laju

Pencarian, Maju Cepat, dan Putar Mundur