Media Foundation ทำเครื่องหมายตัวอธิบายสตรีมการจับภาพนิ่งเป็นการจับภาพวิดีโออย่างไม่ถูกต้อง

ฉันกำลังจับภาพวิดีโอจากเว็บแคมด้วยสองวิธีแยกกัน (ลองนึกถึงสองแอปพลิเคชัน): โดยใช้ Direct Show และ Media Foundation

เมื่อใช้ Direct Show เว็บแคม Logitech c920 ของฉันมีเอาต์พุต 3 พิน:

  1. การจับภาพวิดีโอ (เช่น PIN_CATEGORY_CAPTURE หรือ PIN_CATEGORY_PREVIEW) ในรูปแบบพิกเซล I420, RGB24 และ MJPG โดยมี FPS ตั้งแต่ 2 ถึง 30 ขึ้นอยู่กับประเภทของสื่อ
  2. การจับภาพนิ่ง (เช่น PIN_CATEGORY_STILL) ใน I420 และ RGB24 ด้วยเพียง 1 FPS
  3. การจับภาพวิดีโอ (เช่น PIN_CATEGORY_CAPTURE หรือ PIN_CATEGORY_PREVIEW) ใน h264 ด้วย FPS ตั้งแต่ 5 ถึง 30

ดังนั้น เนื่องจากฉันกังวลเฉพาะกับการจับภาพวิดีโอ ฉันจึงมองข้ามพินทั้งหมดที่ไม่ใช่ PIN_CATEGORY_CAPTURE หรือ PIN_CATEGORY_PREVIEW ซึ่งใช้งานได้ดี

เมื่อใช้ Media Foundation กล้องตัวเดียวกันจะมีตัวอธิบายสตรีม 3 ตัว (IMFPresentationDescriptor::GetStreamDescriptorCount) ตัวอธิบายสตรีมแต่ละตัวจะมี IMFMediaTypeHandler ที่ช่วยให้คุณสามารถวนซ้ำประเภทสื่อได้ ฉันมี IMFMediaTypeHandlers 3 ตัว:

  1. การจับภาพวิดีโอ (เช่น IMFMediaTypeHandler::GetMajorType == MFMediaType_Video) ในรูปแบบพิกเซล I420, RGB24 และ MJPG พร้อม FPS ตั้งแต่ 2 ถึง 30 ขึ้นอยู่กับประเภทของสื่อ
  2. การจับภาพวิดีโอ (เช่น IMFMediaTypeHandler::GetMajorType == MFMediaType_Video) ใน i420 และ RGB24 ด้วยเพียง 1 FPS
  3. การจับภาพวิดีโอ (เช่น IMFMediaTypeHandler::GetMajorType == MFMediaType_Video) ใน h264 ด้วย FPS ตั้งแต่ 5 ถึง 30

คุณจะสังเกตได้ว่าตัวอธิบายสตรีมของ Media Foundation ดูเหมือนจะแมปกับเอาต์พุตพินของ Direct Show 1 ต่อ 1 ยกเว้นว่า Media Foundation ไม่ได้ทำเครื่องหมายตัวอธิบายสตรีม #2 ว่าเป็นการจับภาพนิ่ง (MFMediaType_Image) ซึ่งตรงกันข้ามกับสิ่งที่ Direct Show กำลังทำอยู่

การจับภาพนิ่งต้องมีการจัดการที่แตกต่างจากการจับภาพวิดีโอ ดังนั้นรหัส Direct Show ของฉันจึงเกิดข้อผิดพลาดและไม่สามารถจับภาพใดๆ ได้เลยเมื่อพยายามใช้ประเภทสื่อจากพิน #2 ฉันสนใจแต่เรื่องการจับภาพวิดีโอตั้งแต่แรกเท่านั้น ซึ่งก็เป็นเรื่องปกติ

แต่แม้กระทั่งผ่าน Media Foundation บอกว่าตัวอธิบายสตรีม #2 คือการจับภาพวิดีโอ รหัส Media Foundation ของฉัน ซึ่งทำงานได้อย่างสมบูรณ์แบบกับสื่อทุกประเภทจากตัวอธิบาย Steam #1 และ #3 ก็เกิดปัญหากับประเภทสื่อจากตัวอธิบายสตรีม #2 ในลักษณะเดียวกันกับวิธีการ Direct Show ขัดข้องกับการจับภาพนิ่งเท่านั้น

ดังนั้นฉันจึงรู้สึกว่าเป็น Media Foundation (หรือ ไดรเวอร์เว็บแคม Windows 7 จัดทำโดย Logitech) มีข้อบกพร่องและไม่ได้ทำเครื่องหมายตัวอธิบายสตรีม #2 ว่าเป็นการจับภาพนิ่งเมื่อควร หรือฉันกำลังตรวจสอบแฟล็กที่ไม่ถูกต้องเพื่อดูว่าเป็นการจับภาพวิดีโอหรือการจับภาพนิ่ง หากเป็นความผิดพลาดของฉัน อะไรคือวิธีที่ถูกต้องในการแยกความแตกต่างระหว่างตัวอธิบายสตรีมวิดีโอ (#1 และ #3) และภาพนิ่ง (#2)


person Cookie Cat    schedule 18.09.2015    source แหล่งที่มา


คำตอบ (1)


ใช่ Mediafoundation ไม่มีแอตทริบิวต์สไตล์ PIN_CATEGORY_STILL

บางทีคุณอาจสันนิษฐานได้ว่าสื่อประเภทที่มีเพียง 1 fps ยังคงจับภาพได้

แก้ไข

ทำการวิจัยเพิ่มเติม มี MF_CAPTURE_ENGINE_STREAM_CATEGORY_PHOTO_DEPENDENT

สิ่งนี้ใช้ได้กับ MFCaptureEngine และสำหรับ Windows 8...

person mofo77    schedule 25.11.2015
comment
ใช่ นั่นคือวิธีแก้ปัญหาที่ฉันใช้อยู่ในปัจจุบัน กำลังตรวจสอบ 1 fps และในกรณีของ MFMediaType_Image โดยสมมติว่าสิ่งใดก็ตามที่ตรงกับที่เป็นภาพนิ่ง - person Cookie Cat; 26.11.2015