Menggabungkan Pengambilan dan Pratinjau Video
[Fitur yang terkait dengan halaman ini, DirectShow, adalah fitur warisan. Ini telah digantikan oleh MediaPlayer, IMFMediaEngine, dan Perekaman 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.]
Bagian sebelumnya menjelaskan cara mengambil video ke berbagai format file. Bagian Pratinjau Video menjelaskan cara membuat grafik pratinjau langsung. Namun, banyak aplikasi harus melakukan keduanya sekaligus. Untuk membangun pratinjau gabungan dan grafik penulisan file, cukup lakukan dua panggilan ke ICaptureGraphBuilder2::RenderStream:
// Render the preview stream to the video renderer.
hr = pBuild->RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video, pCap,
NULL, NULL);
// Render the capture stream to the mux.
hr = pBuild->RenderStream(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video, pCap,
NULL, pMux);
Dalam kode ini, Capture Graph Builder menyembunyikan beberapa detail:
Jika filter pengambilan memiliki pin pratinjau atau pin port video, ditambah pin pengambilan, metode RenderStream hanya perlu menampilkan kedua pin, seperti yang ditunjukkan dalam ilustrasi berikut.
Jika filter hanya memiliki pin pengambilan, Capture Graph Builder menggunakan filter Smart Tee untuk membagi aliran pengambilan. Ilustrasi berikut menunjukkan grafik dengan Smart Tee.
Filter Smart Tee memiliki pin penangkap dan pin pratinjau. Ini mengambil satu aliran video dari filter pengambilan dan membaginya menjadi dua aliran, satu untuk pengambilan dan satu untuk pratinjau. Untuk mempertahankan throughput pada pin pengambilan, pin pratinjau menghilangkan bingkai sesuai kebutuhan. Ini juga menghilangkan penanda waktu dari setiap sampel sebelum mengirimkannya, karena alasan yang dibahas dalam topik Filter Pengambilan Video DirectShow.
Meskipun Smart Tee membagi aliran, Smart Tee tidak secara fisik menduplikasi data video. Sebagai gantinya, ia menggunakan objek sampel media kustom yang berbagi buffer. Sampel ditandai "baca-saja" untuk memastikan bahwa filter hilir tidak menulis pada data.
Jika grafik pengambilan Anda memiliki jendela pratinjau, beberapa hal dapat menyebabkan Filter Graph Manager menghentikan seluruh grafik, termasuk aliran pengambilan:
- Mengunci komputer.
- Menekan CTRL+ALT+DELETE di komputer yang merupakan anggota domain.
- Menjalankan aplikasi Direct3D layar penuh, seperti permainan atau pengaman layar.
- Beralih monitor atau mengubah resolusi tampilan.
- Menjalankan program yang menyebabkan Windows menampilkan dialog Kontrol Akun Pengguna (UAC). (Windows Vista atau yang lebih baru.)
- Menjalankan jendela DOS layar penuh.
Salah satu peristiwa ini dapat mengganggu sesi pengambilan, mungkin menyebabkan kehilangan data. (Berikut adalah apa yang terjadi secara internal: Perender video kehilangan sumber daya Direct3D atau DirectDraw yang dibutuhkannya. Dalam proses pemulihan sumber daya tersebut, perender video harus terhubung kembali dengan filter upstream, menyebabkan Manajer Grafik Filter menghentikan grafik.)
Dua solusi yang mungkin untuk masalah ini adalah sebagai berikut:
- Jangan sertakan aliran pratinjau. Namun, ketahuilah bahwa metode ICaptureGraphBuilder2::RenderStream secara otomatis menambahkan jendela pratinjau saat perangkat pengambilan memiliki pin port video. Lihat Pin Port Video di Pengambilan File.
- Gunakan Stream Buffer Engine untuk mengirim aliran pratinjau ke grafik dalam proses lain.
-
Mengambil Video ke File