Media Foundation错误地将静态图像捕获流描述符标记为视频捕获

时间:2015-09-18 17:44:42

标签: c++ directshow video-capture ms-media-foundation logitech

我正在通过两种不同的方式从网络摄像头进行视频捕获(想想两个应用程序):使用Direct Show和Media Foundation。

使用Direct Show,我的Logitech c920网络摄像头有3个输出引脚:

  1. 视频捕获(即PIN_CATEGORY_CAPTUREPIN_CATEGORY_PREVIEW)在I420,RGB24和MJPG像素格式中,带有 FPS从2到30,具体取决于媒体类型。
  2. I420和RGB24中的静止图像捕获(即PIN_CATEGORY_STILL) 只需1 FPS。
  3. 视频捕获(即PIN_CATEGORY_CAPTUREPIN_CATEGORY_PREVIEW)在h264中,FPS为5到30。
  4. 所以,既然我只关注视频捕捉,我会忽略所有不是PIN_CATEGORY_CAPTUREPIN_CATEGORY_PREVIEW的引脚,效果很好。

    使用Media Foundation,同一台摄像机有3个流描述符(IMFPresentationDescriptor::GetStreamDescriptorCount)。每个流描述符都提供IMFMediaTypeHandler,允许您迭代媒体类型。所以我有3个IMFMediaTypeHandlers:

    1. I420,RGB24和MJPG像素格式的视频捕捉(即IMFMediaTypeHandler::GetMajorType == MFMediaType_Video) FPS从2到30,具体取决于媒体类型。
    2. i420和RGB24中的视频捕获(即IMFMediaTypeHandler::GetMajorType == MFMediaType_Video) 只需1 FPS。
    3. h264中的视频捕获(即IMFMediaTypeHandler::GetMajorType == MFMediaType_Video),FPS为5到30。
    4. 您可以注意到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)捕获流描述符的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

是的,Mediafoundation没有PIN_CATEGORY_STILL样式属性。

也许您可以假设只有1 fps的媒体类型仍然是捕获。

修改

进行更多研究,有MF_CAPTURE_ENGINE_STREAM_CATEGORY_PHOTO_DEPENDENT

这适用于MFCaptureEngine,它适用于Windows 8 ...