Saya melakukan pengambilan video dari webcam dengan dua cara terpisah (pikirkan dua aplikasi): menggunakan Direct Show dan Media Foundation.
Menggunakan Direct Show, webcam Logitech c920 saya memiliki 3 pin output:
- Pengambilan video (yaitu
PIN_CATEGORY_CAPTURE
atauPIN_CATEGORY_PREVIEW
) dalam format piksel I420, RGB24, dan MJPG, dengan FPS dari 2 hingga 30, bergantung pada jenis media. - Pengambilan gambar diam (yaitu
PIN_CATEGORY_STILL
) dalam I420 dan RGB24 hanya dengan 1 FPS. - Pengambilan video (yaitu
PIN_CATEGORY_CAPTURE
atauPIN_CATEGORY_PREVIEW
) dalam h264 dengan FPS dari 5 hingga 30.
Jadi, karena saya hanya peduli dengan pengambilan video, saya mengabaikan semua pin yang bukan PIN_CATEGORY_CAPTURE
atau PIN_CATEGORY_PREVIEW
, yang berfungsi dengan baik.
Menggunakan Media Foundation, kamera yang sama memiliki 3 deskriptor aliran (IMFPresentationDescriptor::GetStreamDescriptorCount
). Setiap deskriptor aliran menyediakan IMFMediaTypeHandler
yang memungkinkan Anda melakukan iterasi pada jenis media. Jadi saya punya 3 IMFMediaTypeHandlers:
- Pengambilan video (yaitu
IMFMediaTypeHandler::GetMajorType == MFMediaType_Video
) dalam format piksel I420, RGB24, dan MJPG, dengan FPS dari 2 hingga 30, bergantung pada jenis media. - Pengambilan video (yaitu
IMFMediaTypeHandler::GetMajorType == MFMediaType_Video
) di i420 dan RGB24 hanya dengan 1 FPS. - Pengambilan video (yaitu
IMFMediaTypeHandler::GetMajorType == MFMediaType_Video
) dalam h264 dengan FPS dari 5 hingga 30.
Anda dapat melihat bahwa deskriptor aliran Media Foundation tampaknya dipetakan ke pin keluaran Direct Show 1 pada 1. Kecuali bahwa Media Foundation tidak menandai deskriptor aliran #2 sebagai pengambilan gambar diam (MFMediaType_Image
), berbeda dengan apa yang dilakukan Direct Show.
Pengambilan gambar diam memerlukan penanganan yang berbeda dengan pengambilan video, jadi kode Direct Show saya error dan tidak melakukan pengambilan sama sekali saat mencoba menggunakan jenis media dari pin #2. Ya, awalnya saya hanya peduli pada pengambilan video, jadi tidak apa-apa.
Tetapi bahkan melalui Media Foundation memberi tahu bahwa deskriptor aliran #2 adalah pengambilan video, kode Media Foundation saya, yang berfungsi sempurna dengan semua jenis media dari deskriptor uap #1 dan #3, mogok pada jenis media dari deskriptor aliran #2, serupa dengan caranya Direct Show mogok hanya pada pengambilan gambar diam.
Jadi saya mendapat kesan bahwa itu adalah Media Foundation (atau driver webcam Windows 7 disediakan oleh Logitech) bermasalah dan tidak menandai deskriptor aliran #2 sebagai pengambilan gambar diam sebagaimana mestinya, atau saya memeriksa tanda yang salah untuk menentukan apakah itu pengambilan video atau pengambilan gambar diam. Jika ini kesalahan saya, lalu apa cara yang tepat untuk membedakan antara deskriptor aliran pengambilan video (#1 dan #3) dan gambar diam (#2)?