Bagikan melalui


Menggunakan Mode Berjendela

[Fitur yang terkait dengan halaman ini, DirectShow, adalah fitur warisan. Ini telah digantikan oleh MediaPlayer, IMFMediaEngine, dan Tangkapan Audio/Video di Media Foundation. Fitur-fitur tersebut telah dioptimalkan untuk Windows 10 dan Windows 11. Microsoft sangat menyarankan agar kode baru menggunakan MediaPlayer, IMFMediaEngine dan Audio/Video Capture di Media Foundation alih-alih DirectShow, jika memungkinkan. Microsoft menyarankan agar kode yang ada yang menggunakan API warisan ditulis ulang untuk menggunakan API baru jika memungkinkan.]

Catatan

Filter Perender Video warisan selalu menggunakan mode berjendela. Filter VMR-7 dan VMR-9 menggunakan mode berjendela secara default, tetapi juga mendukung mode tanpa jendela.

 

Dalam mode berjendela, perender video membuat jendelanya sendiri di mana ia melukis bingkai video. Kecuali Anda menentukan sebaliknya, jendela ini adalah jendela tingkat atas dengan batas dan bilah judulnya sendiri. Namun, sebagian besar waktu, Anda akan melampirkan jendela video ke jendela aplikasi, sehingga video diintegrasikan ke dalam UI aplikasi Anda. Proses ini memerlukan langkah-langkah berikut:

  1. Kueri untuk IVideoWindow.
  2. Atur jendela induk.
  3. Atur gaya jendela baru.
  4. Posisikan jendela video di dalam jendela pemilik.
  5. Beri tahu jendela video pesan WM_MOVE.

Kueri untuk IVideoWindow

Sebelum memulai pemutaran, kueri Filter Graph Manager untuk antarmuka IVideoWindow :

IVideoWindow *pVidWin = NULL;
pGraph->QueryInterface(IID_IVideoWindow, (void **)&pVidWin);

Mengatur Jendela Induk

Untuk mengatur jendela induk, panggil metode IVideoWindow::p ut_Owner dengan handel ke jendela aplikasi Anda. Metode ini mengambil variabel jenis OAHWND, jadi transmisikan handel ke jenis ini:

pVidWin->put_Owner((OAHWND)hwnd);

Atur Gaya Jendela Baru

Ubah gaya jendela video dengan memanggil metode IVideoWindow::p ut_WindowStyle :

pVidWin->put_WindowStyle(WS_CHILD | WS_CLIPSIBLINGS);

Bendera WS_CHILD mengatur jendela menjadi jendela anak, dan bendera WS_CLIPSIBLINGS mencegah jendela menggambar di dalam area klien jendela anak lain.

Posisikan Jendela Video

Untuk mengatur posisi video relatif terhadap area klien jendela aplikasi, panggil metode IVideoWindow::SetWindowPosition . Metode ini mengambil persegi panjang yang menentukan tepi kiri, tepi atas, lebar, dan tinggi jendela video. Misalnya, kode berikut membentangkan jendela video agar pas dengan seluruh area klien jendela induk:

RECT rc;
GetClientRect(hwnd, &rc);
pVidWin->SetWindowPosition(0, 0, rc.right, rc.bottom);

Untuk mendapatkan ukuran asli video, panggil metode IBasicVideo::GetVideoSize pada Filter Graph Manager. Anda dapat menggunakan informasi tersebut untuk menskalakan video dan menjaga rasio aspek yang benar.

Merespons Pesan WM_MOVE

Untuk performa terbaik, Anda harus memberi tahu perender video setiap kali jendela bergerak saat grafik dijeda. Panggil metode IVideoWindow::NotifyOwnerMessage untuk meneruskan pesan WM_MOVE:

// (Inside your WindowProc)
case WM_MOVE:
    pVidWin->NotifyOwnerMessage((OAHWND)hWnd, msg, wParam, lParam);
    break;

Jika perender menggunakan overlay perangkat keras, pemberitahuan ini menyebabkan perender memperbarui posisi overlay. (VMR-9 tidak menggunakan overlay, jadi Anda tidak perlu memanggil metode ini jika Anda menggunakan VMR-9.)

Pembersihan

Sebelum aplikasi keluar, hentikan grafik dan reset pemilik jendela video ke NULL. Jika tidak, pesan jendela mungkin dikirim ke jendela yang salah, yang kemungkinan menyebabkan kesalahan. Selain itu, sembunyikan jendela video, atau Anda mungkin melihat kedipan gambar video di layar sesaat:

pControl->Stop(); 
pVidWin->put_Visible(OAFALSE);
pVidWin->put_Owner(NULL);  

Catatan

Jika induk jendela video adalah anak dari jendela aplikasi utama Anda (dengan kata lain, jika jendela video adalah anak dari anak anak), Anda harus membuat jendela video menggunakan CoCreateInstance dan menambahkannya ke grafik, alih-alih membiarkan Filter Graph Manager menambahkan perender video selama Intelligent Connect. Ini memastikan bahwa jendela video dan jendela anak Anda dicat ulang secara bersamaan. Jika tidak, jendela anak dapat melukis di atas jendela video.

 

Penyajian Video