Media Foundation salah menandai deskriptor aliran pengambilan gambar diam sebagai pengambilan video

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:

  1. Pengambilan video (yaitu PIN_CATEGORY_CAPTURE atau PIN_CATEGORY_PREVIEW) dalam format piksel I420, RGB24, dan MJPG, dengan FPS dari 2 hingga 30, bergantung pada jenis media.
  2. Pengambilan gambar diam (yaitu PIN_CATEGORY_STILL) dalam I420 dan RGB24 hanya dengan 1 FPS.
  3. Pengambilan video (yaitu PIN_CATEGORY_CAPTURE atau PIN_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:

  1. Pengambilan video (yaitu IMFMediaTypeHandler::GetMajorType == MFMediaType_Video) dalam format piksel I420, RGB24, dan MJPG, dengan FPS dari 2 hingga 30, bergantung pada jenis media.
  2. Pengambilan video (yaitu IMFMediaTypeHandler::GetMajorType == MFMediaType_Video) di i420 dan RGB24 hanya dengan 1 FPS.
  3. 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)?


person Cookie Cat    schedule 18.09.2015    source sumber


Jawaban (1)


Ya, Mediafoundation tidak memiliki atribut gaya PIN_CATEGORY_STILL.

Mungkin Anda bisa berasumsi bahwa jenis media dengan hanya 1 fps masih bersifat capture.

EDIT

melakukan penelitian lagi, ada MF_CAPTURE_ENGINE_STREAM_CATEGORY_PHOTO_DEPENDENT

Ini berlaku untuk MFCaptureEngine dan untuk Windows 8...

person mofo77    schedule 25.11.2015
comment
Yap, itulah solusi yang saya gunakan saat ini. Memeriksa 1 fps dan untuk berjaga-jaga MFMediaType_Image, dengan asumsi bahwa apa pun yang cocok adalah pengambilan gambar diam. - person Cookie Cat; 26.11.2015