Kapabilitas Video
[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.]
Metode IAMStreamConfig::GetStreamCaps menyajikan kemampuan video dalam array pasangan struktur AM_MEDIA_TYPE dan VIDEO_STREAM_CONFIG_CAPS . Anda dapat menggunakan ini untuk mengekspos semua format dan resolusi yang didukung pada pin seperti yang dibahas di bawah ini.
Untuk contoh getStreamCaps terkait audio, lihat Kemampuan Audio.
Misalkan kartu tangkapan Anda mendukung format JPEG di semua resolusi antara 160 x 120 piksel dan 320 x 240 piksel, termasuk. Perbedaan antara resolusi yang didukung adalah satu dalam hal ini karena Anda menambahkan atau mengurangi satu piksel dari setiap resolusi yang didukung untuk mendapatkan resolusi berikutnya yang didukung. Perbedaan resolusi yang didukung ini disebut granularitas.
Misalkan kartu Anda juga mendukung ukuran 640 x 480. Berikut ini menggambarkan resolusi tunggal ini dan rentang resolusi di atas (semua ukuran antara 160 x 120 piksel dan 320 x 240 piksel).
Selain itu, misalkan mendukung format RGB warna 24-bit pada resolusi antara 160 x 120 dan 320 x 240, tetapi dengan granularitas 8. Ilustrasi berikut menunjukkan beberapa ukuran yang valid dalam kasus ini.
Untuk menempatkannya dengan cara lain, dan mencantumkan lebih banyak resolusi, berikut ini adalah semua di antara daftar resolusi yang valid.
- 160 x 120
- 168 x 120
- 168 x 128
- 176 x 128
- 176 x 136
- ... resolusi tambahan ...
- 312 x 232
- 320 x 240
Gunakan GetStreamCaps untuk mengekspos kemampuan format dan dimensi warna ini dengan menawarkan jenis media 320 x 240 JPEG (jika itu adalah ukuran default atau pilihan Anda) ditambah dengan kemampuan minimum 160 x 120, kemampuan maksimum 320 x 240, dan granularitas 1. Pasangan berikutnya yang Anda ekspos dengan menggunakan GetStreamCaps adalah jenis media 640 x 480 JPEG ditambah dengan minimal 640 x 480 dan maksimum 640 x 480 dan granularitas 0. Pasangan ketiga mencakup jenis media 320 x 240, RGB 24-bit dengan kemampuan minimum 160 x 120, kemampuan maksimum 320 x 240, dan granularitas 8. Dengan cara ini Anda dapat menerbitkan hampir setiap format dan kemampuan yang mungkin didukung kartu Anda. Aplikasi yang harus mengetahui format kompresi apa yang Anda berikan bisa mendapatkan semua pasangan dan membuat daftar semua subjenis unik dari jenis media.
Filter mendapatkan sumber jenis media dan persegi panjang target dari anggota rcSource dan rcTarget struktur VIDEOINFOHEADER. Filter tidak harus mendukung persegi sumber dan target.
Persegi panjang pemotongan yang dijelaskan di seluruh dokumentasi IAMStreamConfig sama dengan persegi panjang rcSource struktur VIDEOINFOHEADER untuk pin output.
Persegi panjang output yang dijelaskan di seluruh dokumentasi IAMStreamConfig sama dengan anggota biWidth dan biHeight dari struktur BITMAPINFOHEADER pin output (lihat Data DV dalam Format File AVI.).
Jika pin output filter tersambung ke jenis media dengan sumber tidak kosong dan persegi panjang target, filter Anda diperlukan untuk meregangkan subrektangle sumber format input ke subrektangle target format output. Subrektangle sumber disimpan di anggota InputSize struktur VIDEO_STREAM_CONFIG_CAPS.
Misalnya, pertimbangkan skenario kompresor video berikut: Gambar input dalam format RGB dan memiliki ukuran 160 x 120 piksel. Sudut kiri atas persegi panjang sumber berada pada koordinat (20.20), dan sudut kanan bawahnya berada di (30.30). Gambar output dalam format MPEG dengan ukuran 320 x 240. Sudut kiri atas persegi panjang target berada di (0,0) dan sudut kanan bawahnya berada di (100.100). Dalam hal ini, filter harus mengambil 10 x 10 bagian dari bitmap sumber 160 x 120 RGB, dan membuatnya mengisi area 100 x 100 teratas dari bitmap 320 x 240, membiarkan sisa bitmap 320 x 240 tidak tersentuh. Ilustrasi berikut menunjukkan skenario ini.
Filter mungkin tidak mendukung ini dan dapat gagal terhubung dengan jenis media di mana rcSource dan rcTarget tidak kosong.
Struktur VIDEOINFOHEADER memaparkan informasi tentang kemampuan laju data filter. Misalnya, Anda menyambungkan pin output Anda ke filter berikutnya dengan jenis media tertentu (baik secara langsung atau dengan menggunakan jenis media yang diteruskan oleh fungsi CMediaType::SetFormat ). Lihat anggota dwBitRate dari struktur format VIDEOINFOHEADER jenis media tersebut untuk melihat tingkat data yang harus Anda kompres videonya. Jika Anda mengalikan jumlah unit waktu per bingkai dalam anggota AvgTimePerFrame struktur VIDEOINFOHEADER dengan tingkat data di anggota dwBitRate dan membagi dengan 10.000.000 (jumlah unit per detik), Anda dapat mengetahui berapa banyak byte yang seharusnya. Anda dapat menghasilkan bingkai berukuran lebih kecil, tetapi tidak pernah yang lebih besar. Untuk menentukan kecepatan bingkai untuk kompresor video atau untuk filter pengambilan, gunakan AvgTimePerFrame dari jenis media pin output Anda.