我正在通过两种不同的方式从网络摄像头进行视频捕获(想想两个应用程序):使用Direct Show和Media Foundation .
使用Direct Show,我的Logitech c920网络摄像头有3个输出引脚:
-
I420,RGB24和MJPG像素格式的视频捕获(即
PIN_CATEGORY_CAPTURE
或PIN_CATEGORY_PREVIEW
),FPS为2到30,具体取决于介质类型 . -
I420和RGB24中的静止图像捕获(即
PIN_CATEGORY_STILL
),仅1 FPS . -
h264中的视频捕获(即
PIN_CATEGORY_CAPTURE
或PIN_CATEGORY_PREVIEW
),FPS为5到30 .
所以,由于我只关注视频捕捉,我忽略了所有不是 PIN_CATEGORY_CAPTURE
或 PIN_CATEGORY_PREVIEW
的引脚,效果很好 .
使用Media Foundation,相同的相机有3个流描述符( IMFPresentationDescriptor::GetStreamDescriptorCount
) . 每个流描述符都提供 IMFMediaTypeHandler
,允许您迭代媒体类型 . 所以我有3个IMFMediaTypeHandlers:
-
I420,RGB24和MJPG像素格式的视频捕捉(即
IMFMediaTypeHandler::GetMajorType == MFMediaType_Video
),FPS从2到30,具体取决于媒体类型 . -
i420和RGB24中的视频捕获(即
IMFMediaTypeHandler::GetMajorType == MFMediaType_Video
)仅为1 FPS . -
h264中的视频捕获(即
IMFMediaTypeHandler::GetMajorType == MFMediaType_Video
),FPS为5到30 .
您可以注意到Media Foundation 's stream descriptors seem to map to 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)捕获流描述符的正确方法是什么?
1 回答
是的,Mediafoundation没有PIN_CATEGORY_STILL样式属性 .
也许您可以假设只有1 fps的媒体类型仍然可以捕获 .
EDIT
做一些更多的研究,有MF_CAPTURE_ENGINE_STREAM_CATEGORY_PHOTO_DEPENDENT
这适用于MFCaptureEngine,它适用于Windows 8 ...