Bagikan melalui


Menggunakan Kontrol Tampilan Video

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

Antarmuka IMFVideoDisplayControl mengontrol bagaimana perender video (EVR) yang ditingkatkan menampilkan video di dalam jendela aplikasi. Antarmuka ini dapat digunakan di DirectShow atau Media Foundation. Secara internal, kontrol tampilan video disediakan oleh penyaji default EVR. Jika Anda menulis penyaji kustom, Anda dapat menyediakan antarmuka yang sama atau menentukan antarmuka kustom.

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

Untuk mendapatkan penunjuk ke antarmuka IMFVideoDisplayControl , lakukan hal berikut:

  1. Dapatkan penunjuk ke antarmuka IMFGetService.

    • 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 tidak.)

  3. Panggil IMFGetService::GetService untuk mendapatkan antarmuka IMFVideoDisplayControl. Pengidentifikasi layanan MR_VIDEO_RENDER_SERVICE.

Anda dapat menggunakan antarmuka IMFVideoDisplayControl untuk melakukan tugas berikut:

  • Atur jendela kliping.

  • Atur persegi panjang sumber dan tujuan.

  • Perbarui jendela video sebagai respons terhadap pesan jendela.

  • Aktifkan atau nonaktifkan mode layar penuh.

Jendela Kliping

Aplikasi harus menyediakan jendela tempat EVR menggambar video. Untuk mengatur jendela kliping, panggil IMFVideoDisplayControl::SetVideoWindow dengan handel ke jendela aplikasi.

Jika Anda membuat sink media EVR melalui objek aktivasinya, langkah ini tidak diperlukan. Objek aktivasi secara otomatis memanggil SetVideoWindow, menggunakan handel jendela yang Anda berikan dalam fungsi MFCreateVideoRendererActivate.

Persegi Sumber dan Tujuan

Selama pemutaran, penyaji mengambil sebagian gambar video yang disusun dan menggambarnya ke area jendela video. Bagian dari gambar yang disusun adalah persegi panjang sumber, dan area jendela video adalah persegi panjang tujuan.

Persegi panjang sumber didefinisikan menggunakan koordinat yang dinormalisasi di mana titik (0,0, 0,0) sesuai dengan sudut kiri atas video, dan (1,0, 1,0) sesuai dengan sudut kanan bawah video. Persegi panjang sumber dapat menjadi wilayah mana pun dalam persegi panjang ini. Persegi panjang tujuan ditentukan dalam piksel, relatif terhadap area klien jendela. Persegi panjang sumber default adalah seluruh gambar, dan persegi panjang tujuan default adalah persegi panjang kosong.

Untuk mengatur persegi panjang sumber dan tujuan, panggil IMFVideoDisplayControl::SetVideoPosition.

Jika Anda membuat sink media EVR melalui objek aktivasinya, langkah ini tidak diperlukan. Objek aktivasi secara otomatis mengatur persegi panjang tujuan sama dengan seluruh area klien jendela. Namun, Anda harus memanggil SetVideoPosition jika Anda ingin mengubah persegi panjang sumber atau mengatur persegi panjang tujuan yang berbeda.

Pesan Jendela

Selama pemutaran, aplikasi Anda harus merespons pesan jendela tertentu, sebagai berikut:

  • WM_PAINT: Panggil IMFVideoDisplayControl::RepaintVideo untuk mengecat ulang video. Selain itu, hindari pengecatan di atas persegi panjang tujuan saat video diputar, karena ini dapat menyebabkan kedap-kedlip.

  • WM_SIZE: Anda mungkin perlu memanggil SetVideoPosition untuk mengubah ukuran persegi tujuan.

Tidak seperti filter Video Mixing Renderer (VMR) di DirectShow, Anda tidak perlu memberi tahu EVR saat menerima pesan WM_DISPLAYCHANGE.

Perender Video yang Ditingkatkan