Bagikan melalui


Model Buffer Bucket Bocor (Microsoft Media Foundation)

Saat Anda mengalirkan media melalui jaringan, dekoder menerima data yang dikodekan pada tingkat konstanta teoritis (laju transmisi). Dekoder mengonsumsi data ini untuk menghasilkan output yang didekodekan. Namun, dalam kasus umum, dekoder mengonsumsi data pada tingkat variabel , karena kemudian encoder dapat menggunakan laju pengodean variabel.

Model "wadah bocor" adalah cara untuk memodelkan persyaratan buffering untuk pemutaran yang lancar. Dalam model ini, dekoder mempertahankan buffer. Data yang dikodekan masuk dari jaringan ke buffer, dan dari buffer ke dalam dekoder. Jika buffer underflows, itu berarti dekoder menghapus data dari buffer lebih cepat daripada jaringan yang mengirimkannya. Jika buffer meluap, itu berarti jaringan mengirimkan data lebih cepat daripada dekoder yang mengonsumsinya.

Topik ini menjelaskan model buffer "wadah bocor" untuk pengodean dan pendekodean.

Wadah Bocor

Untuk memahami model ember bocor, pertimbangkan ember dengan lubang kecil di bagian bawah. Tiga parameter menentukan wadah:

  • Kapasitas (B)
  • Laju di mana air mengalir keluar dari ember (R)
  • Kelengkapan awal wadah (F)

Dalam metafora ini, ember adalah buffer:

ilustrasi yang menunjukkan buffer sebagai ember, laju input saat air memasuki ember, dan laju output saat air keluar melalui lubang di ember

Jika air dituangkan ke dalam ember pada tingkat yang tepat R, wadah akan tetap pada F, karena laju input sama dengan laju output. Jika tingkat input meningkat sementara R tetap konstan, ember mengumpulkan air. Jika laju input lebih besar dari R untuk periode berkelanjutan, akhirnya bucket meluap. Namun, laju input dapat bervariasi di sekitar R tanpa meluapkan wadah, selama tingkat input rata-rata tidak melebihi kapasitas wadah. Semakin besar kapasitas, semakin banyak tingkat input dapat bervariasi dalam jangka waktu tertentu.

Di ASF, wadah bocor didefinisikan oleh tiga parameter:

  • Laju bit rata-rata, dalam byte per detik, yang sesuai dengan laju output (R)
  • Jendela buffer, diukur dalam milidetik, yang sesuai dengan kapasitas wadah (B).
  • Kelengkapan buffer awal, yang umumnya diatur ke nol.

Laju bit mengukur jumlah rata-rata bit per detik dalam aliran yang dikodekan. Jendela buffer mengukur jumlah milidetik data pada laju bit yang dapat muat di buffer. Ukuran buffer dalam bit sama dengan R * (B / 1000).

Data payload ASF dapat memasuki wadah bocor pada waktu yang tidak teratur dan dalam jumlah yang tidak teratur, tetapi harus meninggalkan wadah pada laju bit positif yang konstan. Karena jendela buffer, ada kemungkinan penundaan antara waktu payload memasuki wadah dan ketika keluar. Penundaan maksimum yang dapat terjadi adalah B/R. Data payload yang masuk ke dalam wadah sesuai dengan waktu presentasi dan tidak boleh meluapkan wadah. Selain waktu presentasi, setiap payload juga memiliki waktu pengiriman—waktu di mana data payload meninggalkan wadah sesuai dengan laju bit. Waktu pengiriman harus lebih awal dari waktu presentasi untuk memastikan bahwa, ketika wadah bocor hampir penuh, setiap payload meninggalkan wadah sebelum atau pada waktu presentasinya. Untuk mencapai hal ini, waktu presentasi digeser ke depan oleh nilai B/R ( preroll), dan waktu pengiriman mendapatkan head start mulai dari nol. Waktu pengiriman harus tidak lebih lambat dari waktu presentasi karena itu akan menunjukkan bahwa payload memasukkan wadah terlambat dan tidak dapat disertakan dalam objek data. Nilai pra-pendaftaran disertakan dalam Objek Header ASF .

Untuk streaming bebas kesalahan melalui jaringan, aliran terkompresi dalam konten media harus mempertahankan laju bit yang konstan sepanjang durasi pemutaran. Model wadah kebocoran ASF memastikan bahwa data media dikirim di seluruh jaringan pada laju bit yang konstan. Parameter wadah bocor ditentukan dalam Objek Properti Stream Yang Diperluas dari Objek Header ASF. Di Microsoft Media Foundation, mereka ditetapkan sebagai atribut pada jenis media yang mewakili aliran.

Nilai wadah bocor didefinisikan baik dalam sink file ASF dan objek multiplexer ASF yang mendasar, dan encoder Windows Media. Nilai-nilai ini bisa sama atau berbeda. Misalnya, pertimbangkan skenario streaming, yang mengharuskan sampel audio dikirimkan lebih lambat dari sampel video sehingga file dapat di-streaming tanpa latensi. Untuk mencapai hal ini, wadah kebocoran aliran audio di sink media dapat diatur ke nilai yang lebih tinggi dari nilai yang ditetapkan dalam encoder audio Windows Media.

Untuk mengatur nilai B/R dalam encoder, aplikasi harus mengatur properti MFPKEY_RAVG, MFPKEY_BAVG, MFPKEY_RMAX, dan MFPKEY_BMAX . Untuk informasi tentang mengatur properti di encoder, lihat Properti Pengodean.

Wadah yang Digunakan

Tujuan encoder adalah untuk memastikan bahwa konten tidak pernah meluapkan buffer. Encoder menggunakan nilai laju bit dan jendela buffer sebagai panduan. Jumlah bit aktual yang diteruskan selama periode waktu apa pun yang sama dengan jendela buffer tidak pernah bisa lebih besar dari dua kali ukuran buffer.

Pertimbangkan contoh berikut: Anda memiliki wadah 3 galon dengan lubang di dalamnya di mana 1 galon dapat mengalir per menit. Anda meletakkan ember di bawah spigot dan membuka katup untuk mengeluarkan air dengan kecepatan 1 galon per menit. Air mengalir keluar dari ember secepat masuk, tidak meninggalkan ekstra dalam ember. Kemudian Anda meningkatkan aliran dari spigot menjadi 2 galon per menit. Setiap menit air mengalir pada tingkat ini, 2 galon masuk ke ember dan 1 galon bocor keluar, meninggalkan 1 galon dalam ember. Pada akhir 3 menit, 6 galon air telah masuk ke ember, 3 galon telah bocor, dan ember penuh.

Dalam praktiknya, tingkat data maksimum teoritis selama interval yang sama dengan jendela buffer tidak pernah tercapai. Contoh sebelumnya mengasumsikan tingkat data konstanta. Mengingat wadah 3 galon yang sama, Anda dapat meningkatkan laju aliran dari spigot menjadi 6 galon per menit selama satu menit dan kemudian mematikan spigot selama dua menit. Meskipun jumlah total air yang dimasukkan ke dalam ember berada dalam maksimum teoritis untuk jendela buffer, konsentrasi jumlah tersebut ke dalam satu bagian jendela menyebabkan ember meluap. Pada 6 galon per menit, ember 3 galon meluap tak lama setelah 30 detik berlalu. Oleh karena itu, jumlah maksimum aktual data yang dapat dikirimkan ke buffer selama durasi interval apa pun yang sama dengan pengaturan jendela buffer tergantung pada ukuran sampel individual dan kapan dikirimkan.

Sejauh ini contoh hanya membahas buffer yang digunakan oleh dekoder, tetapi buffer wadah bocor juga digunakan oleh encoder yang membuat konten terkompresi. Encoder membuat penyesuaian apa pun yang diperlukan untuk algoritma kompresi untuk menjaga laju bit sampel terkompresi dalam batas yang dijelaskan oleh laju bit dan jendela buffer, dengan asumsi bahwa sampel akan dikirimkan ke dekoder pada tingkat konstan. Anda dapat menganggap wadah encoder sebagai mencerminkan wadah dekoder. Wadah encoder diisi pada tingkat variabel yang ditentukan oleh ukuran sampel individu dan kebocoran pada tingkat konstanta yang sama dengan laju bit rata-rata.

Pertimbangkan contoh encoder dan decoder berikut yang tersambung bersama melalui jaringan. Anda mengodekan file video pada 30 bingkai per detik dengan laju bit 6.000 bit per detik dan jendela buffer 3 detik (ukuran buffer total 18.000 bit). Sampel pertama dikodekan sebagai bingkai kunci dan membutuhkan 7.000 bit. Buffer encoder sekarang berisi 7.000 bit. 29 bingkai berikutnya adalah semua bingkai delta yang totalnya 3.000 bit. Jadi konten detik pertama (30 bingkai) akan menempatkan kelengkapan buffer pada 10.000 bit jika tidak ada yang bocor. Kita tahu bahwa laju bit aliran adalah 6.000 bit per detik, jadi setelah detik pertama konten yang dikodekan dimasukkan ke dalam buffer encoder, kelengkapan turun menjadi 4.000 bit. Dalam aplikasi decoding, aliran ini dikirimkan ke buffer decoder pada 6.000 bit per detik. Setelah satu detik, buffer berisi 6.000 bit. Sampel pertama berisi 7.000 bit, sehingga buffer decoder harus diisi lebih banyak sebelum dekoder mulai menghapus sampel.

Mengatur Nilai Wadah Bocor untuk Aliran ASF

Dalam skenario pengodean file, aplikasi dapat mengatur nilai wadah bocor saat mengonfigurasi aliran di Profil ASF.

Setelah membuat aliran dan memiliki referensi ke antarmuka IMFASFStreamConfig aliran, Anda dapat mengatur nilai dengan menggunakan atribut berikut:

Untuk informasi tentang menambahkan aliran dan mendapatkan penunjuk IMFASFStreamConfig , lihat Menambahkan Informasi Aliran ke Sink File ASF.

Nilai-nilai ini berisi sekumpulan informasi berikut:

  • Laju bit rata-rata: Dapatkan laju bit rata-rata dari jenis media output yang dipilih selama negosiasi jenis media. Gunakan atribut MF_MT_AUDIO_AVG_BYTES_PER_SECOND (untuk aliran audio) atau atribut MF_MT_AVG_BITRATE (untuk streaming video).
  • Jendela buffer: Jika Anda memiliki instans encoder dan memiliki jenis media output yang dinegosiasikan, Anda dapat memperbarui nilai ini nanti dengan mengkueri encoder untuk antarmuka IWMCodecLeakyBucket lalu memanggil IWMCodecLeakyBucket::GetBufferSizeBits (wmcodecifaces.h, wmcodecdspuuid.lib). Jika tidak, Gunakan nilai default 3000 milidetik.
  • Ukuran buffer awal: Atur ke 0.

Nilai yang disediakan oleh aplikasi bergantung pada jenis pengodean dan jenis media aliran. Misalnya, Pengodean Laju Bit Konstan memerlukan laju bit tetap yang telah ditentukan dan jendela buffer. Aplikasi dapat menentukan nilai wadah bocor ini dengan mengatur properti pengodean MFPKEY_VIDEOWINDOW dan atribut MF_ASFSTREAMCONFIG_LEAKYBUCKET1 pada aliran. Nilai jendela buffer yang ditentukan digunakan untuk memastikan bahwa file yang dikodekan memiliki waktu pengiriman yang benar yang ditandai pada paket data dan nilai pra-pendaftaran muncul di Objek Header ASF. Cukup untuk mengatur MF_ASFSTREAMCONFIG_LEAKYBUCKET1 karena nilai yang ditentukan ini disalin ke dalam atribut MF_ASFSTREAMCONFIG_LEAKYBUCKET2 .

Untuk mode pengodean 2-pass, Anda perlu mengatur kedua atribut ini untuk menentukan nilai rata-rata dan maksimum.

Untuk pengodean VBR, aplikasi dapat mengkueri nilai wadah bocor yang digunakan oleh encoder hanya setelah kode lulus selesai. Oleh karena itu, saat mengonfigurasi sink media, aplikasi dapat memilih untuk tidak mengatur atribut atau properti yang terkait dengan wadah bocor. Setelah pengodean, aplikasi harus mengkueri encoder untuk properti MFPKEY_RAVG, MFPKEY_BAVG, MFPKEY_RMAX, dan MFPKEY_BMAX dan mengaturnya di sink media sehingga nilai yang akurat tercermin dalam Objek Header. Untuk contoh kode tentang cara memperbarui nilai untuk pengodean VBR, lihat "Memperbarui Properti Pengodean di File Sink" di Tutorial: 1-Pass Windows Media Encoding.

Jika Anda menyalin konten Windows Media dari sumber ke sink media tanpa pengodean, nilai wadah bocor harus diatur di sink media.

Nilai Bucket Bocor di Multiplekser ASF

Di Media Foundation, nilai wadah bocor digunakan oleh Multiplexer ASF untuk menyiapkan nilai wadah kebocoran internal yang digunakannya untuk menghasilkan paket data. Payload terkandung dalam sampel media dan serangkaian sampel media merupakan paket data ASF. Berdasarkan nilai wadah bocor dan waktu presentasi, multiplexer menetapkan waktu kirim untuk setiap sampel media sehingga laju bit paket yang dikirim di seluruh jaringan berada pada laju bit konstan (R).

Aplikasi tidak dapat mengatur nilai wadah bocor di multiplexer secara langsung. Nilai harus disediakan pada sink media ASF, yang menetapkan nilai yang sesuai pada multiplexer. Nilai yang diatur dalam MF_ASFSTREAMCONFIG_LEAKYBUCKET1 dan MF_ASFSTREAMCONFIG_LEAKYBUCKET2 digunakan oleh multiplexer untuk memvalidasi sampel yang dikirim ke sink media ASF dihasilkan dengan menggunakan nilai yang ditentukan.

Memperbarui Nilai Bucket Bocor di Sink Media ASF

Aplikasi dapat menimpa nilai wadah kebocoran tingkat aliran (diatur di profil ASF selama pembuatan aliran) dengan mengatur properti MFPKEY_ASFSTREAMSINK_CORRECTED_LEAKYBUCKET di penyimpanan properti sink media. Untuk mendapatkan referensi ke penyimpanan properti, gunakan objek ContentInfo yang diimplementasikan oleh sink media. Untuk informasi selengkapnya, lihat Mengatur Properti di Sink File.

Catatan Operasi ini hanya diperbolehkan untuk aliran audio.

Properti ini harus diatur setelah Anda mengatur jenis output pada encoder. Berdasarkan laju bit yang ditetapkan dalam jenis media, encoder menghitung ukuran buffer untuk memastikan bahwa sampel media yang dihasilkan tidak pernah meluapkan buffer. Encoder membuat penyesuaian yang diperlukan selama pemadatan untuk menjaga laju bit sampel terkompresi dalam batas yang dijelaskan oleh laju bit dan jendela buffer.

Mirip dengan atribut konfigurasi aliran untuk wadah bocor, atur laju bit rata-rata dan ukuran buffer, dan kepenuhan buffer awal dalam array DWORD. Untuk informasi selengkapnya, lihat bagian "Mengatur Nilai Wadah Bocor untuk Aliran ASF" dalam topik ini.

Dukungan ASF di Media Foundation

Codec Windows Media