Menggunakan Kontrol Video Mixer

[Komponen yang dijelaskan di halaman ini, Enhanced Video Renderer, adalah fitur warisan. Ini telah digantikan oleh Simple Video Renderer (SVR) yang diekspos melalui komponen MediaPlayer dan IMFMediaEngine . Untuk memutar konten video, Anda harus mengirim data ke salah satu komponen ini dan memungkinkan mereka membuat instans perender video baru. Komponen-komponen ini telah dioptimalkan untuk Windows 10 dan Windows 11. Microsoft sangat menyarankan agar kode baru menggunakan MediaPlayer atau API IMFMediaEngine tingkat bawah untuk memutar media video di Windows alih-alih EVR, jika memungkinkan. Microsoft menyarankan agar kode yang ada yang menggunakan API warisan ditulis ulang untuk menggunakan API baru jika memungkinkan.]

Mixer EVR menyediakan beberapa antarmuka yang dapat digunakan aplikasi untuk mengontrol bagaimana mixer memproses video. Antarmuka ini dapat digunakan di DirectShow atau Media Foundation.

Antarmuka Deskripsi
Antarmuka IMFVideoMixerBitmap Alpha-blends gambar bitmap statis ke video.
Antarmuka IMFVideoMixerControl Mengontrol bagaimana EVR mencampur sub-aliran video.
Antarmuka IMFVideoProcessor Mengontrol penyesuaian warna, filter gambar, dan kemampuan pemrosesan video lainnya. Antarmuka ini menyediakan akses ke fungsionalitas yang diterapkan oleh driver grafis, sehingga kemampuan yang tepat akan bergantung pada driver grafis pengguna.

 

Cara yang benar untuk mendapatkan penunjuk ke antarmuka ini tergantung pada apakah Anda menggunakan versi DirectShow dari EVR atau versi Media Foundation. Untuk Media Foundation EVR, itu juga tergantung pada apakah Anda menggunakan EVR secara langsung atau menggunakannya melalui Sesi Media. (Biasanya aplikasi akan menggunakan EVR melalui Sesi Media, bukan secara langsung).

Untuk mendapatkan penunjuk ke salah satu antarmuka ini, lakukan hal berikut:

  1. Dapatkan penunjuk ke antarmuka IMFGetService pada EVR.

    • Jika Anda menggunakan filter DirectShow EVR, panggil QueryInterface pada filter.

    • Jika Anda menggunakan sink media EVR secara langsung, panggil QueryInterface di sink media.

    • Jika Anda menggunakan Sesi Media, panggil QueryInterface pada Sesi Media.

  2. Jika Anda menggunakan Sesi Media, tunggu Sesi Media mengirim peristiwa MESessionTopologyStatus dengan nilai status MF_TOPOSTATUS_READY. (Lewati langkah ini jika Anda tidak menggunakan Sesi Media.)

  3. Panggil IMFGetService::GetService untuk mendapatkan antarmuka mixer. Gunakan MR_VIDEO_MIXER_SERVICE pengidentifikasi layanan.

Alpha Memadukan Bitmap ke Video

Anda dapat menggunakan antarmuka IMFVideoMixerBitmap untuk memadupadankan bitmap statis ke video selama pemutaran. Anda dapat menyimpan bitmap di permukaan Direct3D, yang ditentukan sebagai penunjuk IDirect3DSurface9 , atau menggunakan bitmap GDI.

Jika Anda menggunakan permukaan Direct3D untuk bitmap, permukaan dapat berisi data alfa per piksel, yang akan digunakan saat mixer alpha-blends gambar. Atau, Anda dapat menentukan kunci warna—yaitu, satu warna yang akan transparan di mana pun muncul di bitmap. Selain itu, Anda dapat menentukan nilai alfa yang akan diterapkan ke seluruh gambar. Anda juga dapat mengatur persegi panjang sumber untuk memotong bitmap, dan persegi panjang tujuan untuk memosisikan bitmap dalam bingkai video.

Untuk mengatur bitmap, panggil IMFVideoMixerBitmap::SetAlphaBitmap. Metode ini mengambil penunjuk ke struktur MFVideoAlphaBitmap yang menentukan bitmap dan parameter alpha-blending. Misalnya kode, lihat topik referensi untuk metode SetAlphaBitmap .

Setelah anda mengatur bitmap, Anda dapat memperbarui parameter blending, termasuk persegi panjang sumber dan tujuan, dengan memanggil IMFVideoMixerBitmap::UpdateAlphaBitmapParameters. Pembaruan berlaku pada bingkai video berikutnya. Video harus diputar agar pembaruan terjadi. Anda dapat menggunakan metode ini untuk melakukan animasi sederhana pada bitmap. (Jika Anda membutuhkan efek yang lebih canggih, pertimbangkan untuk menulis mixer EVR kustom.)

Untuk menghapus bitmap, panggil IMFVideoMixerBitmap::ClearAlphaBitmap.

Mengontrol Sub-aliran

EVR dapat mencampur satu atau beberapa substream video ke aliran video utama. Untuk mengontrol pencampuran sub-aliran, gunakan antarmuka IMFVideoMixerControl.

Pengaturan Prosesor Video

Mixer EVR menggunakan DirectX Video Acceleration (DXVA) untuk melakukan pemrosesan video pada aliran input. Kemampuan pemrosesan yang tepat tergantung pada driver grafis. Kemampuan pemrosesan video dijelaskan dengan menggunakan struktur DXVA2_VideoProcessorCaps. Serangkaian kemampuan tertentu disebut mode pemrosesan video, setiap mode yang diidentifikasi oleh GUID. Untuk daftar GUID yang telah ditentukan sebelumnya, lihat IDirectXVideoProcessorService::GetVideoProcessorDeviceGuids. Driver mungkin menentukan GUID khusus vendor tambahan, mewakili kombinasi kemampuan yang berbeda.

Untuk menemukan mode yang didukung dan kemampuan setiap mode, lakukan hal berikut:

  1. Panggil IMFGetService::GetService untuk mendapatkan penunjuk ke antarmuka IMFVideoProcessor mixer.

  2. Panggil IMFVideoProcessor::GetAvailableVideoProcessorModes. Metode ini mengembalikan array GUID, yang mengidentifikasi mode prosesor video yang tersedia. Daftar dikembalikan dalam urutan kualitas turun, mode dengan kualitas tertinggi muncul terlebih dahulu dalam daftar. Daftar dapat berubah tergantung pada format video.

  3. Untuk setiap GUID dalam daftar, panggil IMFVideoProcessor::GetVideoProcessorCaps untuk menemukan kemampuan mode prosesor video yang sesuai. Metode ini mengisi struktur DXVA2_VideoProcessorCaps dengan deskripsi kemampuan.

  4. Untuk memilih mode, panggil IMFVideoProcessor::SetVideoProcessorMode. Jika tidak, EVR secara otomatis memilih mode saat streaming dimulai. Dalam hal ini, Anda dapat memanggil IMFVideoProcessor::GetVideoProcessorMode untuk menemukan mode mana yang dipilih.

Sebagian besar bidang dalam struktur DXVA2_VideoProcessorCaps menjelaskan perilaku driver tingkat rendah dan tidak tertarik pada aplikasi umum. Bidang berikut kemungkinan besar menarik:

  • DeviceCaps. Bidang ini menunjukkan apakah pemrosesan video dilakukan dalam perangkat keras atau perangkat lunak, dan apakah driver grafis adalah driver DXVA 1.0 yang lebih lama.

  • DeinterlaceTechnology. Bidang ini memberikan beberapa indikasi tingkat kualitas deinterlacing apa yang dapat Anda harapkan jika video sumber terjalin.

  • ProcAmpControlCaps. Bidang ini menentukan kontrol penyesuaian warna mana yang tersedia. Untuk daftar kemungkinan penyesuaian warna, lihat ProcAmp Pengaturan. Jika driver tidak dapat melakukan penyesuaian warna, bidang ini adalah nol.

  • VideoProcessorOperations. Bidang ini berisi bendera yang menjelaskan kemampuan pemrosesan video lain-lain. Dua bendera penting tertentu adalah bendera DXVA2_VideoProcess_SubAliran dan bendera DXVA2_VideoProcess_SubAliran. Setidaknya salah satu bendera ini harus ada agar EVR dapat mencampur sub-aliran ke aliran video referensi. Jika tidak ada bendera, EVR terbatas pada satu streaming video.

  • NoiseFilterTechnology. Bidang ini menunjukkan filter kebisingan mana yang didukung oleh driver grafis. Jika driver tidak mendukung pemfilteran kebisingan, nilainya adalah DXVA2_NoiseFilterTech_Unsupported.

  • DetailFilterTechnology. Bidang ini menunjukkan filter detail mana yang didukung oleh driver grafis. Jika driver tidak mendukung pemfilteran kebisingan, nilainya DXVA2_DetailFilterTech_Unsupported.

Penyesuaian Warna dan Pemfilteran Gambar

Driver grafis mungkin mendukung penyesuaian warna (juga disebut amplifikasi proses atau hanya ProcAmp) dan pemfilteran gambar. Ketika dilakukan oleh GPU, penyesuaian warna dan pemfilteran gambar dapat dilakukan secara real time tanpa overhead CPU.

Untuk menggunakan fitur-fitur ini, lakukan langkah-langkah berikut:

  1. Pilih mode pemrosesan video seperti yang dijelaskan di bagian sebelumnya.

  2. Panggil IMFVideoProcessor::GetVideoProcessorCaps untuk menemukan kemampuan pemrosesan video seperti yang dijelaskan di bagian sebelumnya. Metode ini mengisi struktur DXVA2_VideoProcessorCaps yang menjelaskan kemampuan, termasuk apakah driver mendukung penyesuaian warna dan filter gambar.

  3. Untuk setiap penyesuaian warna yang didukung oleh driver, panggil IMFVideoProcessor::GetProcAmpRange untuk menemukan rentang nilai yang mungkin untuk pengaturan tersebut. Metode ini juga mengembalikan nilai default untuk pengaturan. Panggil IMFVideoProcessor::GetProcAmpValues untuk menemukan nilai pengaturan saat ini. Nilai tidak memiliki unit yang ditentukan. Terserah driver untuk menentukan rentang nilai.

  4. Panggil IMFVideoProcessor::SetFilteringValue untuk mengatur nilai penyesuaian warna.

  5. Jika driver mendukung pemfilteran gambar, maka setiap jenis filter (kebisingan dan detail) mendukung tiga pengaturan—tingkat, radius, dan ambang—dalam kroma dan luma. (Lihat Filter Gambar DXVA Pengaturan.) Untuk setiap pengaturan, panggil IMFVideoProcessor::GetFilteringRange untuk mendapatkan rentang nilai yang mungkin dan panggil IMFVideoProcessor::GetFilteringValue untuk mendapatkan nilai saat ini.

  6. Untuk mengubah pengaturan filter gambar, panggil IMFVideoProcessor::SetFilteringValue.

Perender Video yang Ditingkatkan