Bagikan melalui


Membangun Grafik Filter DVD

[Fitur yang terkait dengan halaman ini, DirectShow, adalah fitur warisan. Ini telah digantikan oleh MediaPlayer, IMFMediaEngine, dan Pengambilan 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 Pengambilan Audio/Video 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.]

Seperti halnya aplikasi DirectShow apa pun, aplikasi pemutaran DVD dimulai dengan membangun grafik filter. DirectShow menyediakan komponen berikut untuk pemutaran DVD:

Pemutaran DVD juga memerlukan dekoder MPEG-2. Dekode MPEG-2 perangkat keras dan perangkat lunak tersedia dari pihak ketiga. Pertama, buat instans objek DVD Graph Builder.

IDvdGraphBuilder *pBuild = NULL;
hr = CoCreateInstance(CLSID_DvdGraphBuilder, NULL, 
    CLSCTX_INPROC_SERVER, IID_IDvdGraphBuilder, (void **)&pBuild);

Pada titik ini, Anda dapat memilih dan mengonfigurasi perender video sebelum membuat grafik lainnya. Langkah ini, yang bersifat opsional, dijelaskan secara lebih rinci di bagian berikutnya. Jika Anda menghilangkan langkah ini, DVD Graph Builder memilih perender default. Selanjutnya, buat grafik dengan memanggil metode IDvdGraphBuilder::RenderDvdVideoVolume .

AM_DVD_RENDERSTATUS buildStatus;
hr = pBuild->RenderDvdVideoVolume(L"Z:\\video_ts", 0, &buildStatus);

Parameter pertama adalah nama direktori yang berisi file DVD. Pada cakram DVD, file-file ini berada di direktori bernama VIDEO_TS. Jika parameter pertama adalah NULL, DVD Graph Builder menggunakan drive pertama yang berisi volume DVD.

Parameter kedua berisi berbagai bendera opsional untuk memilih jenis dekoder (perangkat keras atau perangkat lunak) dan opsi lainnya.

Parameter ketiga adalah struktur AM_DVD_RENDERSTATUS yang menerima informasi status. Jika metode RenderDvdVideoVolume mengembalikan S_FALSE, itu berarti panggilan berhasil sebagian (atau sebagian gagal, jika Anda pesimis). Misalnya, metode mungkin gagal merender aliran subgambar, meskipun aliran lain berhasil dirender. Jika metode RenderDvdVideoVolume mengembalikan kode kesalahan atau nilai S_FALSE, Anda dapat memeriksa struktur AM_DVD_RENDERSTATUS untuk detail tentang kesalahan tersebut.

Selanjutnya, dapatkan penunjuk ke Filter Graph Manager dengan memanggil IDvdGraphBuilder::GetFiltergraph. Metode ini mengembalikan penunjuk ke antarmuka IGraphBuilder Filter Graph Manager.

IGraphBuilder *pGraph = NULL;
hr =  pBuild->GetFiltergraph(&m_pGraph);

Gunakan metode IDvdGraphBuilder::GetDvdInterface untuk mengambil antarmuka terkait DVD, termasuk yang berikut ini:

Misalnya, kode berikut mengembalikan antarmuka IDvdControl2 .

IDvdControl2 *pDvdControl = NULL;
hr = pBuild->GetDvdInterface(IID_IDvdControl2, (void**)&pDvdControl);

Cara yang disarankan untuk membangun grafik filter pemutaran DVD adalah dengan meminta objek DVD Graph Builder melakukannya untuk Anda secara otomatis. Pendekatan ini ditunjukkan di bawah ini dan dalam aplikasi sampel DVD. Jika Anda perlu membuat grafik filter DVD secara manual, Anda dapat melakukannya dengan mengikuti aturan dasar pembuatan grafik yang dibahas di tempat lain dalam dokumentasi DirectShow. Umumnya, Anda tidak boleh menambahkan, menghapus, menyambungkan, atau memutuskan filter individual secara manual dalam grafik yang dibuat oleh DVD Graph Builder, karena tindakan tersebut dapat membingungkan kode pembersihan.

Mengonfigurasi Perender Video

DirectShow menyediakan beberapa filter perender video. Sebelum membuat grafik, Anda dapat memilih perender video mana yang Anda sukai. Pilih perender dengan memanggil IDvdGraphBuilder::GetDvdInterface dan meminta antarmuka yang khusus untuk perender tersebut:

Jika Anda meminta salah satu antarmuka ini sebelum membuat grafik filter, DVD Graph Builder membuat perender video yang sesuai. Nantinya, saat Anda membuat grafik, DVD Graph Builder akan mencoba menggunakan perender tersebut. Tetapi jika tidak dapat membangun grafik menggunakan perender yang Anda pilih, grafik tersebut dapat beralih ke perender lain. Misalnya, dekoder MPEG-2 Anda mungkin tidak kompatibel dengan filter VMR, dalam hal ini DVD Graph Builder akan default ke Overlay Mixer.

Antarmuka ini juga memberi Anda kesempatan untuk mengonfigurasi perender sebelum terhubung ke dekoder. Misalnya, Anda dapat mengatur VMR untuk menggunakan mode tanpa jendela alih-alih mode berjendela default. Untuk informasi selengkapnya tentang perender video, lihat topik Tentang Penyajian Video di DirectShow.

Pada Windows XP dan yang lebih baru, DVD Graph Builder selalu menggunakan Video Mixing Renderer 7 (VMR-7), kecuali:

  • Antarmuka kueri pemanggil hanya menemukan Overlay Mixer, seperti IMixerPinConfig2. Ini mengirimkan petunjuk ke DVD Graph Builder bahwa aplikasi ingin menggunakan Overlay Mixer dan bukan VMR. Pemutar Media Windows juga memiliki opsi kotak dialog untuk memaksa penggunaan Overlay Mixer.
  • Dekoder yang diinstal tidak kompatibel dengan VMR. Selama pembuatan grafik, antarmuka IAMDecoderCaps baru digunakan untuk memeriksa dukungan VMR decoder. Jika tidak ada, DVD Graph Builder akan menggunakan Overlay Mixer.
  • Saat menggunakan dekoder perangkat keras, dekoder tidak dapat tersambung ke Manajer Port Video (VPM). Jika dekoder perangkat keras tidak dapat menggunakan VPM, maka tidak dapat menggunakan VMR, sehingga DVD Graph Builder kemudian mencoba membangun grafik menggunakan Overlay Mixer.
  • Kartu tampilan diketahui memiliki sumber daya dan/atau kemampuan yang tidak cukup untuk mendukung VMR tetapi tidak melaporkan ini dengan benar di driver. (Beberapa kasus yang diketahui secara khusus dikecualikan oleh DVD Graph Builder.)
  • Koneksi antara dekoder dan VMR gagal karena alasan apa pun, biasanya karena kurangnya VRAM untuk membuat permukaan yang diperlukan. Dalam kasus ini, DVD Graph Builder menonaktifkan penggunaan VMR dan mencoba menggunakan Overlay Mixer untuk membangun grafik.

Mode Berjendela

Dalam mode berjendela (Overlay Mixer atau VMR), perender membuat jendela videonya sendiri. Untuk menjadikan jendela ini anak dari jendela aplikasi, panggil IVideoWindow::p ut_Owner dengan handel ke aplikasi. Panggil juga IVideoWindow::p ut_WindowStyle untuk mengatur gaya WS_CHILD dan WS_CLIPSIBLINGS di jendela video perender. Untuk mendapatkan pesan mouse dari jendela video perender, panggil IVideoWindow::p ut_MessageDrain dengan handel ke jendela aplikasi. Metode ini menyiapkan "pengurasan pesan" — jendela video meneruskan pesan mouse apa pun yang diterimanya ke jendela pengurasan pesan.

pVideoWindow->put_Owner((OAHWND)hwnd);
pVideoWindow->put_WindowStyle(WS_CHILD | WS_CLIPSIBLINGS);
pVideoWindow->put_MessageDrain((OAHWND)hwnd) ;

Pengurasan pesan membuat pemilihan tombol menu DVD agak rumit. Dengan asumsi jendela video tidak mengisi seluruh area klien aplikasi, beberapa peristiwa mouse akan jatuh di luar jendela video. Ketika Anda mendapatkan peristiwa mouse dari dalam jendela video, Anda harus memprosesnya untuk navigasi menu DVD. Peristiwa mouse dari luar jendela video tidak boleh diproses. Dengan pengurasan pesan, tidak ada cara untuk membedakan antara keduanya. Selain itu, koordinat untuk peristiwa mouse dari jendela video relatif terhadap area klien jendela video; tetapi peristiwa mouse dari luar jendela video relatif terhadap area klien aplikasi.

Mode Tanpa Jendela

Mode tanpa jendela menghindari masalah dengan pesan mouse sama sekali. Anda tidak memerlukan pengurasan pesan, karena VMR (atau EVR) tidak membuat jendelanya sendiri dalam mode tanpa jendela. Sebaliknya, ia menarik langsung ke jendela aplikasi Anda. Jika persegi panjang tujuan lebih kecil dari area klien aplikasi, DVD Navigator memperhitungkan hal ini ketika menghitung posisi tombol DVD. Oleh karena itu, ketika Anda mendapatkan pesan mouse, Anda dapat meneruskan koordinat langsung ke DVD Navigator, seperti yang dijelaskan di bagian Menu Navigasi.

Aplikasi DVD