Mixer Kustom

[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.]

Topik ini menjelaskan cara menulis mixer kustom untuk perender video (EVR) yang ditingkatkan. Anda dapat menggunakan mixer kustom dengan sink media Media Foundation EVR, atau filter DirectShow EVR. Untuk informasi selengkapnya tentang mixer dan penyaji, lihat Penyaji Video yang Ditingkatkan.

Mixer adalah transformasi Media Foundation (MFT) dengan satu atau beberapa input (aliran referensi ditambah sub-aliran) dan satu output. Aliran input menerima sampel dari hulu. Aliran output mengirimkan sampel ke penyaji. EVR bertanggung jawab untuk memanggil IMFTransform::P rocessInput pada mixer, dan penyaji bertanggung jawab untuk memanggil IMFTransform::P rocessOutput.

Minimal, mixer EVR harus menerapkan antarmuka berikut:

Antarmuka Deskripsi
IMFTransform Menyediakan fungsionalitas MFT dasar.
IMFTopologyServiceLookupClient Memungkinkan mixer untuk mendapatkan antarmuka dari EVR.
IMFVideoDeviceID Memungkinkan mixer untuk mendapatkan antarmuka dari EVR.
IMFAttributes Digunakan untuk mengekspos atribut MF_SA_D3D_AWARE ke EVR.

 

Secara opsional, MFT dapat mengimplementasikan salah satu antarmuka berikut:

Antarmuka Deskripsi
IEVRTrustedVideoPlugin Diperlukan untuk memutar konten yang dilindungi.
IMFGetService Mengekspos antarmuka seperti IMFVideoMixerBitmap dan IMFVideoProcessor ke aplikasi.
IMFQualityAdvise Memungkinkan manajer kualitas untuk menyesuaikan kualitas video.
IMFVideoMixerBitmap Memungkinkan aplikasi untuk mencampur bitmap statis ke video.
IMFVideoPositionMapper Peta koordinat pada bingkai video output untuk berkoordinasi pada bingkai video input.
IMFVideoProcessor Mengekspos beberapa fitur pemrosesan video DXVA ke aplikasi.

 

Negosiasi format dengan mixer berfungsi sebagai berikut:

  1. EVR mengatur jenis media pada aliran referensi.

  2. EVR memanggil IMFVideoPresenter::P rocessMessage pada penyaji dengan pesan MFVP_MESSAGE_INVALIDATEMEDIATYPE.

  3. Penyaji mengatur jenis media pada aliran output mixer.

  4. EVR mengatur jenis media pada sub-aliran.

Jika jenis media pada aliran referensi berubah, jenis media lain mixer tidak lagi valid. Metode IMFTransform::P rocessOutput mixer kemudian akan gagal dan mengembalikan MF_E_TRANSFORM_STREAM_CHANGE. Penyaji tidak boleh melakukan apa pun pada saat ini. EVR akan memulai proses negosiasi format lagi.

Ketika aliran input mencapai akhir aliran, EVR memanggil IMFTransform::P rocessMessage pada mixer dengan MFT_MESSAGE_NOTIFY_END_OF_STREAM.

Mixer mengirimkan peristiwa berikut ke EVR, menggunakan antarmuka IMediaEventSink EVR. Antarmuka ini didokumenkan dalam dokumentasi DirectShow SDK.

Aktivitas Deskripsi
EC_SAMPLE_NEEDED Mixer memerlukan sampel input baru.

 

EVR mungkin memanggil ProcessOutput pada mixer sebelum streaming dimulai. Mixer tidak boleh gagal dalam panggilan ini. Sebaliknya, itu harus mengisi permukaan output dengan piksel hitam. Mixer harus terus mengisi sampel output warna sampai menerima pesan MFT_MESSAGE_NOTIFY_BEGIN_STREAMING atau metode ProcessInput dipanggil. Jika mixer menerima pesan MFT_MESSAGE_NOTIFY_END_STREAMING , mixer harus beralih kembali ke mode pengisian warna.

Menerapkan IMFVideoDeviceID

Antarmuka IMFVideoDeviceID berisi satu metode, GetDeviceID, yang mengembalikan GUID perangkat. GUID perangkat memastikan bahwa penyaji dan mixer menggunakan teknologi yang kompatibel. Jika GUID perangkat tidak cocok, EVR gagal diinisialisasi.

Mixer dan penyaji standar menggunakan Direct3D 9, dengan GUID perangkat sama dengan IID_IDirect3DDevice9. Jika Anda ingin menggunakan penyaji kustom Anda dengan mixer standar, GUID perangkat penyaji harus IID_IDirect3DDevice9. Jika Anda mengganti kedua komponen, Anda dapat menentukan GUID perangkat baru.

Menerapkan IMFTopologyServiceLookupClient

Mixer harus mengimplementasikan antarmuka IMFTopologyServiceLookupClient . Sebelum streaming dimulai, EVR memanggil IMFTopologyServiceLookupClient::InitServicePointers dan meneruskan penunjuk ke antarmuka IMFTopologyServiceLookup EVR. Mixer menggunakan pointer ini untuk mendapatkan penunjuk antarmuka dari EVR.

Minimal, mixer harus mengkueri antarmuka berikut:

Ketika EVR memanggil IMFTopologyServiceLookupClient::ReleaseServicePointers, mixer harus melepaskan pointer apa pun yang diperoleh dari panggilan ke InitServicePointers.

Atribut Mixer

Mixer harus mendukung atribut berikut.

Atribut Deskripsi
MF_SA_D3D_AWARE Menentukan apakah mixer mendukung DirectX Video Acceleration (DXVA).
MF_SA_REQUIRED_SAMPLE_COUNT Jumlah sampel video yang harus dialokasikan EVR untuk setiap aliran mixer. Atribut ini berlaku untuk aliran individual; gunakan penyimpanan atribut yang dikembalikan oleh IMFTransform::GetInputStreamAttributes.

 

Mengatur Mixer pada EVR

Untuk mengatur mixer kustom pada EVR, panggil IMFVideoRenderer::InitializeRenderer. Filter DirectShow EVR dan sink media EVR menerapkan metode ini.

Objek Aktivasi EVR. Jika Anda menggunakan objek aktivasi EVR, Anda dapat menyediakan mixer kustom dengan mengatur salah satu atribut berikut pada objek aktivasi EVR:

Atribut Deskripsi
MF_ACTIVATE_CUSTOM_VIDEO_MIXER_ACTIVATE Penunjuk ke objek aktivasi untuk mixer. Objek aktivasi harus mengimplementasikan antarmuka IMFActivate .
MF_ACTIVATE_CUSTOM_VIDEO_MIXER_CLSID CLSID dari mixer.

 

Perender Video yang Ditingkatkan