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, bukan 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 Enhanced Video Renderer.
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 | Memetakan 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:
EVR mengatur jenis media pada aliran referensi.
EVR memanggil IMFVideoPresenter::P rocessMessage pada penyaji dengan pesan MFVP_MESSAGE_INVALIDATEMEDIATYPE.
Penyaji mengatur jenis media pada aliran output mixer.
EVR mengatur jenis media pada sub-aliran.
Jika jenis media pada aliran referensi berubah, jenis media lain mixer tidak lagi valid. Metodemixer IMFTransform::P rocessOutput 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 antarmukaIMediaEventSinkEVR. Antarmuka ini didokumenkan dalam dokumentasi DirectShow SDK.
Peristiwa | 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 metodeProcessInputdipanggil. Jika mixer menerima pesan MFT_MESSAGE_NOTIFY_END_STREAMING, mixer harus beralih kembali ke mode isian warna.
Menerapkan IMFVideoDeviceID
AntarmukaIMFVideoDeviceIDberisi 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 antarmukaIMFTopologyServiceLookupClient. 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 antarmukaIMFActivate. |
MF_ACTIVATE_CUSTOM_VIDEO_MIXER_CLSID | CLSID dari mixer. |
Topik terkait