ฉันกำลังจับภาพวิดีโอจากเว็บแคมด้วยสองวิธีแยกกัน (ลองนึกถึงสองแอปพลิเคชัน): โดยใช้ Direct Show และ Media Foundation
เมื่อใช้ Direct Show เว็บแคม Logitech c920 ของฉันมีเอาต์พุต 3 พิน:
- การจับภาพวิดีโอ (เช่น
PIN_CATEGORY_CAPTURE
หรือPIN_CATEGORY_PREVIEW
) ในรูปแบบพิกเซล I420, RGB24 และ MJPG โดยมี FPS ตั้งแต่ 2 ถึง 30 ขึ้นอยู่กับประเภทของสื่อ - การจับภาพนิ่ง (เช่น
PIN_CATEGORY_STILL
) ใน I420 และ RGB24 ด้วยเพียง 1 FPS - การจับภาพวิดีโอ (เช่น
PIN_CATEGORY_CAPTURE
หรือPIN_CATEGORY_PREVIEW
) ใน h264 ด้วย FPS ตั้งแต่ 5 ถึง 30
ดังนั้น เนื่องจากฉันกังวลเฉพาะกับการจับภาพวิดีโอ ฉันจึงมองข้ามพินทั้งหมดที่ไม่ใช่ PIN_CATEGORY_CAPTURE
หรือ PIN_CATEGORY_PREVIEW
ซึ่งใช้งานได้ดี
เมื่อใช้ Media Foundation กล้องตัวเดียวกันจะมีตัวอธิบายสตรีม 3 ตัว (IMFPresentationDescriptor::GetStreamDescriptorCount
) ตัวอธิบายสตรีมแต่ละตัวจะมี IMFMediaTypeHandler
ที่ช่วยให้คุณสามารถวนซ้ำประเภทสื่อได้ ฉันมี IMFMediaTypeHandlers 3 ตัว:
- การจับภาพวิดีโอ (เช่น
IMFMediaTypeHandler::GetMajorType == MFMediaType_Video
) ในรูปแบบพิกเซล I420, RGB24 และ MJPG พร้อม FPS ตั้งแต่ 2 ถึง 30 ขึ้นอยู่กับประเภทของสื่อ - การจับภาพวิดีโอ (เช่น
IMFMediaTypeHandler::GetMajorType == MFMediaType_Video
) ใน i420 และ RGB24 ด้วยเพียง 1 FPS - การจับภาพวิดีโอ (เช่น
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)