我正在通过两种不同的方式从网络摄像头进行视频捕获(想想两个应用程序):使用Direct Show和Media Foundation。
使用Direct Show,我的Logitech c920网络摄像头有3个输出引脚:
PIN_CATEGORY_CAPTURE
或
PIN_CATEGORY_PREVIEW
)在I420,RGB24和MJPG像素格式中,带有
FPS从2到30,具体取决于媒体类型。PIN_CATEGORY_STILL
)
只需1 FPS。PIN_CATEGORY_CAPTURE
或
PIN_CATEGORY_PREVIEW
)在h264中,FPS为5到30。所以,既然我只关注视频捕捉,我会忽略所有不是PIN_CATEGORY_CAPTURE
或PIN_CATEGORY_PREVIEW
的引脚,效果很好。
使用Media Foundation,同一台摄像机有3个流描述符(IMFPresentationDescriptor::GetStreamDescriptorCount
)。每个流描述符都提供IMFMediaTypeHandler
,允许您迭代媒体类型。所以我有3个IMFMediaTypeHandlers:
IMFMediaTypeHandler::GetMajorType == MFMediaType_Video
)
FPS从2到30,具体取决于媒体类型。IMFMediaTypeHandler::GetMajorType == MFMediaType_Video
)
只需1 FPS。IMFMediaTypeHandler::GetMajorType == MFMediaType_Video
),FPS为5到30。您可以注意到Media Foundation的流描述符似乎映射到Direct Show的输出引脚1上1.除了Media Foundation没有将流描述符#2标记为静态图像捕获(MFMediaType_Image
),相比之下到Direct Show正在做什么。
静态图像捕获需要与视频捕获不同的处理,因此我的直接显示代码错误,并且在尝试使用来自引脚#2的媒体类型时根本不进行任何捕获。好吧,我一开始只关心视频捕捉,所以没关系。
但即使通过媒体基金会告诉流描述符#2是视频捕获,我的Media Foundation代码与来自蒸汽描述符#1和#3的所有媒体类型完美协作,从流描述符#2中的媒体类型崩溃,类似于Direct Show仅在静止图像捕捉时崩溃的方式。
所以我得到的印象是Media Foundation(或the Windows 7 webcam driver provided by Logitech)是错误的,并且没有标记流描述符#2作为静止图像捕获它应该,或者我正在检查错误的标志以确定它是否是视频捕捉或静止图像捕捉。如果这是我的错误,那么区分视频(#1和#3)和静止图像(#2)捕获流描述符的正确方法是什么?
答案 0 :(得分:0)
是的,Mediafoundation没有PIN_CATEGORY_STILL样式属性。
也许您可以假设只有1 fps的媒体类型仍然是捕获。
修改强>
进行更多研究,有MF_CAPTURE_ENGINE_STREAM_CATEGORY_PHOTO_DEPENDENT
这适用于MFCaptureEngine,它适用于Windows 8 ...