Jam Presentasi
Jam presentasi adalah objek yang menghasilkan waktu jam untuk presentasi. Waktu yang dilaporkan oleh jam presentasi disebut waktu presentasi. Semua aliran dalam presentasi disinkronkan ke waktu presentasi. Jam presentasi mengekspos antarmuka berikut.
Antarmuka | Deskripsi |
---|---|
IMFPresentationClock | Antarmuka utama untuk menggunakan jam presentasi. |
IMFRateControl | Mengontrol laju jam. |
IMFTimer | Menyediakan panggilan balik timer. |
IMFShutdown | Mematikan jam presentasi. |
Sink media menggunakan waktu presentasi untuk menjadwalkan kapan harus merender sampel. Setiap kali sink media menerima sampel baru, sink tersebut mendapatkan stempel waktu dari sampel dan merender sampel pada waktu yang ditunjukkan, atau sedekat mungkin dengan waktu tersebut. Karena semua sink media dalam topologi memiliki jam presentasi yang sama, beberapa aliran (seperti audio dan video) disinkronkan. Sumber dan transformasi media tidak menggunakan jam presentasi, karena tidak menjadwalkan kapan harus mengirimkan sampel. Sebaliknya, mereka menghasilkan sampel setiap kali alur meminta sampel baru.
Jika Anda menggunakan Sesi Media untuk pemutaran, Sesi Media menangani semua detail pembuatan jam presentasi, memilih sumber waktu, dan memberi tahu sink media. Aplikasi Anda mungkin menggunakan jam presentasi untuk mendapatkan waktu presentasi saat ini selama pemutaran, tetapi sebaliknya tidak akan memanggil metode apa pun pada jam presentasi.
Waktu Jam dan Status Jam
Untuk mendapatkan waktu jam terbaru dari jam presentasi, panggil IMFPresentationClock::GetTime. Waktu jam selalu dalam satuan 100 nanodetik, jadi satu detik adalah 10.000.000 (10^7) tick. Ini sesuai dengan frekuensi 10 MHz.
Jam presentasi memiliki tiga status: Berjalan, dijeda, dan dihentikan.
- Untuk menjalankan jam, panggil IMFPresentationClock::Start. Metode Mulai menentukan waktu mulai jam. Saat jam berjalan, waktu jam mengalami kenaikan dari waktu mulai, pada laju jam saat ini.
- Untuk menjeda jam, panggil IMFPresentationClock::P ause. Saat jam dijeda, waktu jam tidak maju, dan GetTime mengembalikan waktu di mana jam dijeda.
- Untuk menghentikan jam, panggil IMFPresentationClock::Stop. Ketika jam dihentikan, waktu jam tidak maju, dan GetTime mengembalikan nol.
Secara default, jam maju pada tingkat 1,0, yang berarti 1 tick per 100 nanodetik. Untuk mengubah laju di mana jam maju, kueri jam presentasi untuk antarmuka IMFRateControl dan panggil IMFRateControl::SetRate.
Objek dapat menerima pemberitahuan perubahan status (termasuk perubahan tarif) dari jam presentasi. Untuk menerima pemberitahuan, terapkan antarmuka IMFClockStateSink dan panggil IMFPresentationClock::AddClockStateSink pada jam presentasi. Sebelum mematikan, panggil IMFPresentationClock::RemoveClockStateSink untuk membatalkan pendaftaran objek. Sink media menggunakan mekanisme ini untuk menerima pemberitahuan dari jam.
Waktu Presentasi
Sink media mencoba menjadwalkan setiap sampel sehingga sampel dirender pada waktu yang benar, atau sedekat mungkin dengan waktu yang benar. Definisi berikut berlaku:
- Waktu presentasi. Waktu ketika sampel harus dirender. Waktu diberikan dalam satuan 100 nanodetik.
- Waktu media. Waktu relatif terhadap awal konten. Misalnya, jika file video berdurasi 10 detik, titik setengah jalan melalui file memiliki waktu media 5 detik.
- Stempel waktu. Waktu yang ditandai pada sampel media. Untuk mendapatkan stempel waktu, panggil IMFSample::GetSampleTime. Ketika sumber media menghasilkan sampel, sumber media mengatur stempel waktu yang sama dengan waktu media. Sesi Media menerjemahkan stempel waktu ke dalam waktu presentasi.
Secara default, waktu media dan waktu presentasi sama, Misalnya, jika bingkai video muncul 5 detik ke dalam file sumber, waktu media dan waktu presentasi keduanya 5 detik. Jika Anda menggunakan Sumber Pengurut, model waktu agak lebih rumit, untuk mengaktifkan transisi yang lancar antar segmen. Untuk informasi selengkapnya tentang model pengaturan waktu sumber pengurut, lihat Waktu Presentasi Urutan.
Sumber media selalu mengatur stempel waktu yang sama dengan waktu media. Jika waktu presentasi tidak selaras dengan waktu media, Sesi Media mengonversi stempel waktu pada sampel media. Pada saat sink menerima sampel, stempel waktu sampel telah dikonversi ke waktu presentasi. Sink menjadwalkan sampel terhadap waktu jam presentasi saat ini. (Sink tanpa tarif adalah pengecualian, karena mengabaikan jam presentasi.)
Jika aplikasi mencari posisi baru, Sesi Media memulai ulang jam presentasi pada waktu pencarian yang ditentukan. Misalnya, jika aplikasi mencari ke posisi 5 detik dalam file, Sesi Media memulai jam pada 5 detik. Sumber media mungkin mengirimkan sampel dengan stempel waktu yang sedikit lebih awal jika waktu pencarian tidak jatuh pada batas bingkai kunci. Ini diperlukan agar dekode dapat mendekode semua bingkai. Sesi Media menghilangkan atau memangkas sampel sebelum mencapai sink media, agar sesuai dengan waktu pencarian yang diminta. Misalnya, jika waktu pencarian adalah 5 detik, sampel audio pertama mungkin dimulai pada 4,5 detik. Sesi Media akan memangkas 0,5 detik pertama dari sampel audio pertama yang didekodekan.
Membuat Jam Presentasi
Untuk membuat jam presentasi, panggil MFCreatePresentationClock. Untuk mematikan jam, kueri antarmuka IMFShutdown dan panggil IMFShutdown::Shutdown. Pemanggil MFCreatePresentationClock bertanggung jawab untuk memanggil Shutdown; dalam kebanyakan kasus, ini adalah Sesi Media daripada aplikasi.
Sumber Waktu Presentasi
Terlepas dari namanya, jam presentasi sebenarnya tidak menerapkan jam. Sebaliknya, ia mendapatkan waktu jam dari objek lain, yang disebut sumber waktu presentasi. Sumber waktu dapat menjadi objek apa pun yang menghasilkan tanda centang jam yang akurat dan mengekspos antarmuka IMFPresentationTimeSource . Ilustrasi berikut menunjukkan proses ini.
Ketika jam presentasi pertama kali dibuat, jam presentasi tidak memiliki sumber waktu. Untuk mengatur sumber waktu, panggil IMFPresentationClock::SetTimeSource dengan pointer ke antarmuka IMFPresentationTimeSource sumber waktu. Sumber waktu mendukung status yang sama dengan jam presentasi (berjalan, dijeda, dan berhenti), dan harus mengimplementasikan antarmuka IMFClockStateSink . Jam presentasi menggunakan antarmuka ini untuk memberi tahu sumber waktu kapan harus mengubah status. Dengan cara ini, sumber waktu menyediakan tanda centang jam, tetapi jam presentasi memulai perubahan status dalam jam.
Beberapa sink media memiliki akses ke jam yang akurat, dan karenanya mengekspos antarmuka IMFPresentationTimeSource . Secara khusus, perender audio dapat menggunakan frekuensi kartu suara sebagai jam. Dalam pemutaran audio, berguna bagi perender audio untuk bertindak sebagai sumber waktu, sehingga video disinkronkan ke laju pemutaran audio. Ini umumnya menghasilkan hasil yang lebih baik daripada mencoba mencocokkan audio dengan jam eksternal.
Media Foundation juga menyediakan sumber waktu presentasi berdasarkan jam sistem. Untuk membuat objek ini, panggil MFCreateSystemTimeSource. Sumber waktu sistem dapat digunakan ketika tidak ada sink media yang menyediakan sumber waktu.
Secara umum, sink media harus menggunakan jam presentasi yang disediakan untuk itu, terlepas dari sumber waktu mana yang digunakan jam presentasi. Aturan ini berlaku bahkan ketika sink media mengimplementasikan IMFPresentationTimeSource. Jika jam presentasi menggunakan beberapa sumber waktu lain, sink media harus mengikuti sumber waktu tersebut, bukan jam internalnya sendiri.
Ada dua situasi ketika sink media tidak akan mengikuti jam presentasi:
Beberapa sink media tidak memiliki tarif. Jika sink media tidak memiliki tarif, sink akan mengonsumsi sampel secepat mungkin, tanpa menjadwalkannya sesuai dengan jam presentasi. Biasanya, sink tanpa tarif menulis data ke file, sehingga diinginkan untuk menyelesaikan operasi secepat mungkin. Sink tanpa tarif mengembalikan bendera MEDIASINK_RATELESS dalam metode IMFMediaSink::GetCharacteristics . Ketika semua sink dalam topologi tidak bernilai, Sesi Media mendorong data melalui alur secepat mungkin.
Beberapa sink media tidak dapat mencocokkan laju dengan sumber waktu selain diri mereka sendiri. Jika demikian, sink mengembalikan bendera MEDIASINK_CANNOT_MATCH_CLOCK dalam metode GetCharacteristics-nya . Alur masih dapat menggunakan sumber waktu lain, tetapi hasilnya akan kurang dari optimal. Sink kemungkinan akan tertinggal dan menyebabkan gangguan selama pemutaran.
Topik terkait