Sumber Media ASF

Media Foundation menyediakan sumber media ASF yang dapat digunakan aplikasi untuk mewakili file ASF di lapisan alur arsitektur.

Untuk memutar file ASF, aplikasi dapat menggunakan sumber media ASF untuk menyalurkan data ke dalam alur pemutaran. Dalam skenario pengodean, aplikasi dapat menggunakan sumber media ASF sebagai sumber untuk dikonversi ke format lain atau untuk mengonversi file laju bit yang lebih tinggi ke file laju bit yang lebih rendah tanpa mengubah format. Sumber media ASF harus digunakan dalam lapisan alur, yaitu, aplikasi harus menggunakan Sesi Media untuk mengontrol operasi. Tingkat akses ini memungkinkan aplikasi untuk mendapatkan peristiwa saat Sesi Media sedang berlangsung. Untuk mendapatkan akses tingkat bawah ke konten ASF, aplikasi harus menggunakan komponen WMContainer Layer ASF.

Sumber media ASF mengimplementasikan antarmuka IMFMediaSource , yang merupakan antarmuka generik untuk sumber media di Media Foundation. Seperti sumber media lainnya, sumber media ASF menyediakan deskriptor presentasi yang terutama menjelaskan Objek Header ASF. Selain itu, sumber media ASF menyediakan deskriptor aliran yang mewakili setiap aliran dalam konten media. Untuk informasi selengkapnya, lihat Struktur File ASF.

Membuat Sumber Media ASF

Untuk membuat sumber media ASF, aplikasi harus menggunakan Pemecah Masalah Sumber. Untuk membuat sumber media ASF, aplikasi harus menyediakan sumber di mana pemecah masalah sumber membuat sumber media ASF. Informasi sumber harus disediakan dengan menentukan URL file sumber atau aliran byte yang berisi media. Jika aplikasi memilih untuk membuat sumber media ASF dengan menentukan URL, aplikasi harus memanggil IMFSourceResolver::CreateObjectFromURL untuk operasi sinkron atau IMFSourceResolver::Begin... EndCreateObjectFromURL untuk operasi asinkron. Proses untuk membuat sumber media dari aliran byte serupa. Aplikasi harus memanggil IMFSourceResolver::CreateObjectFromByteStream untuk operasi sinkron atau IMFSourceResolver::Begin... EndCreateObjectFromBytestream untuk operasi asinkron. Panggilan ini harus menentukan MF_RESOLUTION_MEDIASOURCE dalam parameter dwFlags . Untuk informasi selengkapnya tentang menggunakan bendera ini, lihat Menggunakan Pemecah Masalah Sumber.

Jika aplikasi menentukan URL, untuk file lokal, string URL dapat berisi jalur file media atau dapat diawali dengan "file: "skema. Ekstensi nama file harus ".asf", ".wm", L".wma", atau ".wmv". Untuk file ASF di jaringan, pemecah masalah sumber membuat Sumber Jaringan, yang menggunakan sumber media ASF.

Selama proses pembuatan objek, pemecah masalah sumber mencari daftar penangan skema dan penangan aliran byte di registri sistem dan memuat handler pencocokan terdekat yang dapat mengurai konten media dan juga membuat objek sumber media di bawahnya. Terlepas dari metode yang digunakan untuk membuat sumber media (URL dan aliran byte), pemecah masalah sumber membuat aliran byte dan membaca konten media sumber ke aliran byte. Untuk informasi selengkapnya, lihat Penangan Skema dan Handler Byte-Stream.

Untuk contoh kode tentang cara membuat sumber media, lihat Menggunakan Pemecah Masalah Sumber.

Pengaturan Konfigurasi untuk Sumber Media ASF

Pemecah masalah sumber meminta kemampuan aliran byte yang mendasarinya dan menentukan operasi diizinkan pada sumber media yang baru dibuat. Salah satu kemampuan tersebut adalah mencari. Jika operasi pencarian diizinkan, aplikasi dapat menentukan mode pencarian yang digunakan sumber media saat mencari ke titik tertentu dalam presentasi.

Aplikasi dapat mengatur mode pencarian, agar sumber media dapat digunakan, selama pembuatan objek. Setelah sumber media ASF dibuat dengan mode pencarian yang ditentukan, sumber media tidak dapat diubah atau diubah secara dinamis selama presentasi. Preferensi pencarian ditentukan sebagai properti dalam panggilan aplikasi ke metode pemecah masalah sumber yang relevan yang digunakan untuk membuat sumber media. Kumpulan properti ini diatur dalam penyimpanan properti dan diteruskan ke parameter pProps . Jika properti ini tidak diteruskan, sumber media berfungsi dengan pengaturan default. Untuk informasi selengkapnya tentang mengatur properti ini, lihat Mengonfigurasi Sumber Media.

Jika pencarian diizinkan, sumber media ASF mendukung mode pencarian berikut:

  • Pencarian yang tepat: Dalam mode ini, sumber media ASF bergantung pada Objek Indeks ASF dari file ASF. Jika file tidak memiliki Objek Indeks, pencarian yang tepat dinonaktifkan dan salah satu mode lain digunakan tergantung pada properti yang ditentukan aplikasi yang diatur pada sumber media.
  • Perkiraan pencarian: Mode ini diminta oleh aplikasi dengan meneruskan MFPKEY_ASFMediaSource_ApproxSeek di penyimpanan properti ke metode pemecah masalah sumber yang relevan. Namun, perkiraan pencarian hanya digunakan jika aliran byte tidak mendukung pencarian berbasis waktu. Dalam mode ini, sumber media menentukan waktu mulai yang relatif lebih dekat dengan waktu pencarian. Jika file ASF berisi Objek Indeks ASF, file tersebut digunakan untuk menghitung waktu mulai. Perkiraan pencarian kurang akurat tetapi lebih cepat daripada pencarian yang tepat karena waktu yang diambil merender sampel pertama pada waktu mulai yang telah ditentukan lebih cepat.
  • Pencarian berulang: Untuk mengatur mode ini, aplikasi harus mengatur properti MFPKEY_ASFMediaSource_IterativeSeekIfNoIndex . Pencarian berulang adalah algoritma untuk menemukan posisi dalam file ASF yang tidak berisi Objek Indeks ASF. Dalam mode ini, sumber media menentukan perkiraan kasar titik pencarian dengan membaca offset aliran byte. Ini menggunakan serangkaian perkiraan, berdasarkan laju bit rata-rata, untuk semakin dekat dengan waktu pencarian target. (Algoritma mirip dengan pencarian biner.) Pencarian berulang dapat memakan waktu lebih lama daripada mencari dengan menggunakan Objek Indeks, sehingga dinonaktifkan secara default. Jika Anda mengatur properti ini, gunakan properti berikut untuk mengatur parameter pencarian: MFPKEY_ASFMediaSource_IterativeSeek_Max_CountMFPKEY_ASFMediaSource_IterativeSeek_Tolerance_In_MilliSecond. Properti ini masing-masing mengatur jumlah maksimum perulangan dan toleransi. Algoritma berhenti ketika mencapai jumlah maksimum iterasi, atau ketika menemukan paket yang jaraknya dari waktu pencarian berada dalam toleransi yang ditentukan.

Singkatnya, aplikasi memiliki opsi untuk memilih perkiraan atau pencarian berulang ketika file ASF tidak berisi Objek Indeks ASF.

Model Objek Sumber Media ASF

Sumber media ASF mengimplementasikan antarmuka IMFMediaSource dan mengekspos antarmuka berikut. Aplikasi bisa mendapatkan referensi ke antarmuka ini dengan memanggil IMFMediaSource::QueryInterface pada sumber media ASF.

Antarmuka Deskripsi
IMFMediaSource Diperlukan untuk semua sumber media.
IMFMediaEventGenerator Diperlukan untuk semua sumber media. Memungkinkan aplikasi untuk mendapatkan peristiwa dari sumber media melalui Sesi Media.
IMFGetService Mengkueri sumber media untuk antarmuka layanan yang ditentukan.
IPropertyStore Mengatur dan mendapatkan properti pada sumber media. Setiap properti berisi nama deskriptif dan nilai.
IMFMetadata Menjelaskan metadata untuk file ASF.
IMFMetadataProvider Mengambil kumpulan metadata, baik untuk seluruh presentasi, atau untuk satu aliran dalam presentasi.
IMFRateSupport Mengkueri rentang laju pemutaran yang didukung, termasuk pemutaran terbalik.
IMFRateControl Mendapatkan atau mengatur laju pemutaran.
IMFTrustedInput Mendapatkan ITA untuk setiap aliran ASF yang terkandung dalam sumbernya.
IMFPMPClient Memungkinkan sumber media untuk menerima penunjuk ke antarmuka IMFPMPHost , yang digunakan untuk membuat objek dalam proses PMP.
IMFTimecodeTranslate Mengonversi antara kode waktu Society of Motion Picture dan Television Engineers (SMPTE) dan 100 unit waktu nanodetik.

 

ASF Media Source Services

Sumber media ASF menyediakan berbagai layanan yang terlingkup untuk file ASF. Untuk mendapatkan penunjuk ke layanan tertentu, aplikasi harus menggunakan salah satu pengidentifikasi layanan berikut dalam panggilannya ke MFGetService. Untuk informasi, lihat Antarmuka Layanan.

Pengidentifikasi Layanan Deskripsi
MF_RATE_CONTROL_SERVICE Dengan menggunakan pengidentifikasi ini, aplikasi bisa mendapatkan penunjuk ke antarmuka IMFRateSupport atau IMFRateControl . Dengan menggunakan objek dukungan tarif yang diterapkan oleh sumber media, aplikasi dapat memeriksa apakah tingkat tertentu didukung oleh file media ASF yang mendasar juga mendapatkan laju tercepat dan paling lambat. Dengan menggunakan objek kontrol laju yang bisa didapatkan aplikasi dan mengatur laju pemutaran. Jika aplikasi menentukan laju tertentu untuk pemutaran, sumber media ASF terlebih dahulu memeriksa apakah tingkat yang diminta berada dalam batas tarif (ditentukan oleh laju tercepat dan paling lambat) dan kemudian menetapkan tarif. Ini tidak memeriksa kondisi variabel karena laju bit mungkin berubah setiap saat tergantung pada bandwidth jaringan. Untuk informasi selengkapnya, Kontrol Laju.
MF_METADATA_PROVIDER_SERVICE Dengan menggunakan pengidentifikasi ini, aplikasi bisa mendapatkan penunjuk ke antarmuka IMFMetadataProvider dari sumber media ASF. Antarmuka ini menyediakan akses ke informasi tentang file ASF khususnya Objek Header ASF dan aliran yang terkandung dalam konten media. Informasi header diekspos melalui atribut deskriptor presentasi dan informasi streaming disediakan melalui atribut pendeskripsi aliran. Untuk informasi selengkapnya tentang atribut ini, lihat Atribut Media Foundation untuk Objek Header ASF. Selain informasi yang diekspos melalui atribut, ada juga metadata deskriptif, yang ditetapkan sebagai properti.
MF_PROPERTY_HANDLER_SERVICE Dengan menggunakan pengidentifikasi ini, aplikasi bisa mendapatkan pointer ke antarmuka IPropertyStore dari sumber media ASF. Penyimpanan properti berisi semua metadata yang terkait dengan file ASF. Pengidentifikasi ini baru di Windows 7 dan menggantikan MF_METADATA_PROVIDER_SERVICE untuk mendapatkan properti metadata.
MFNETSOURCE_STATISTICS_SERVICE Untuk informasi selengkapnya, lihat Mengambil Statistik Jaringan di Pengelogan Klien.
MF_TIMECODE_SERVICE Dengan menggunakan pengidentifikasi ini, aplikasi bisa mendapatkan penunjuk ke antarmuka IMFTimecodeTranslate sumber media. Implementasi ini dapat digunakan untuk melakukan terjemahan kode waktu seperti mengonversi kode waktu SMPTE menjadi unit kedua 100 nano dan kembali.

 

Terjemahan Kode Waktu

Sumber media ASF menyediakan layanan terjemahan kode waktu yang memungkinkan aplikasi Anda mengonversi kode waktu SMPTE ke waktu presentasi terdekat (dalam unit 100 nanodetik). Sebaliknya, aplikasi juga bisa mendapatkan kode waktu untuk waktu presentasi yang diminta. Layanan ini tersedia melalui antarmuka IMFTimecodeTranslate , yang diterapkan sumber media ASF. Metode panggilan pada penunjuk antarmuka ini asinkron yang dapat berjalan dari utas aplikasi utama Anda tanpa memblokir antarmuka pengguna aplikasi Anda.

Langkah-langkah berikut meringkas prosedur untuk terjemahan kode waktu:

  1. Dapatkan penunjuk ke antarmuka IMFTimecodeTranslate dari sumber media ASF dengan memanggil MFGetService dan menentukan pengidentifikasi MF_TIMECODE_SERVICE .
  2. Panggil IMFTimecodeTranslate::BeginConvertTimecodeToHNS atau IMFTimecodeTranslate::BeginConvertHNSToTimecode dan tentukan waktu yang akan diterjemahkan.. Untuk BeginConvertTimecodeToHNS , kode waktu harus ditentukan sebagai variabel PROPVARIANT dengan jenis data VT_I8 . Metode BeginConvertHNSToTimecode memerlukan waktu dalam unit 100-nanosecond sebagai jenis MFTIME .
  3. Selesaikan operasi asinkron dengan memanggil IMFTimecodeTranslate::EndConvertTimecodeToHNS atau IMFTimecodeTranslate::EndConvertTimecodeToHNS dengan tepat.

Selama pembuatan sumber media, pemecah masalah sumber membuat aliran byte untuk file tempat sumber media membaca konten ASF. Agar konversi waktu berhasil, aliran byte yang terkait dengan file ASF harus memiliki kemampuan pencarian; jika tidak, aplikasi mendapatkan kesalahan MF_E_BYTESTREAM_NOT_SEEKABLE dari panggilan Mulai... . Persyaratan lain untuk konversi waktu adalah bahwa file ASF, yang diwakili oleh sumber media ASF, harus memiliki Objek Indeks ASF. Waktu presentasi dan kode waktu diekstrak dari Objek Indeks ASF yang mempertahankan semua indeks dan titik pencarian yang sesuai untuk file ASF. Untuk terjemahan kode waktu-ke-waktu presentasi, file ASF harus berisi Objek Indeks Sederhana; untuk terjemahan waktu kode-ke-presentasi waktu, file ASF harus memiliki Objek Indeks. Operasi konversi mengandalkan pengindeks dasar (komponen WMContainer) untuk mengurai dan membaca Objek Indeks yang terkait dengan file ASF. Jika file tidak berisi Objek Indeks, aplikasi secara asinkron menerima kode kesalahan MF_E_NO_INDEX.

Untuk menerjemahkan waktu yang diminta oleh aplikasi, sumber media menghitung aliran dalam file dan menemukan aliran yang berisi Objek Indeks ASF yang sesuai. Jika aliran seperti itu ditemukan, sumber media mengurai paket ASF aliran diurai hingga kode waktu yang benar tercapai. Setelah menemukan sampel yang benar, sampel akan mengambil waktu presentasi yang sesuai atau kode waktu dari sampel, dan mengembalikannya ke pemanggil.

Dukungan Perintah Skrip

Saat Anda membangun topologi ASF yang berisi aliran skrip, simpul Aliran Skrip ditambahkan ke topologi. Simpul ini akan mengirim IMFSamples pada waktu yang tepat. IMFSample yang disediakan oleh simpul sumber skrip menyimpan data di IMFMediaBuffer yang terkait dengan sampel. Anda dapat memanggil CopyToBuffer pada sampel untuk mendapatkan IMFMediaBuffer lalu memanggil Kunci pada buffer untuk mendapatkan data.

Payload aliran skrip dikemas ke dalam buffer sebagai string jenis, diikuti oleh NULL, diikuti oleh string perintah, diikuti oleh NULL. String adalah Unicode dalam format ASF.

Misalnya, payload mungkin terlihat seperti berikut ini (di mana \0 menunjukkan karakter NULL):

URL\0http://contoso.com\0

Text\0Ini adalah caption\0

Komponen ASF Lapisan Alur

Dukungan ASF di Media Foundation