媒体基金会错误地将静止图像捕获流描述符标记为视频捕获

Media Foundation is incorrectly marking still image capture stream descriptors as video capture

本文关键字:描述 记为 视频 基金会 静止图像 媒体 错误      更新时间:2023-10-16

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

使用直接显示,我的罗技c920摄像头有3个输出引脚:

  1. 视频捕获(即PIN_CATEGORY_CAPTUREPIN_CATEGORY_PREVIEW)在I420, RGB24和MJPG像素格式,与FPS从2到30,取决于媒体类型。
  2. I420和RGB24中的静止图像捕获(即PIN_CATEGORY_STILL)
  3. 视频捕获(即PIN_CATEGORY_CAPTUREPIN_CATEGORY_PREVIEW)在h264, FPS从5到30。

所以,因为我只关心视频捕获,所以我忽略了所有不是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)
  3. 视频捕获(即IMFMediaTypeHandler::GetMajorType == MFMediaType_Video)在h264中,FPS从5到30。

你可以注意到Media Foundation的流描述符似乎映射到Direct Show的1对1输出引脚。除了Media Foundation没有将流描述符#2标记为静止图像捕获(MFMediaType_Image),这与Direct Show所做的相反。

静态图像捕获需要与视频捕获不同的处理,所以我的直接显示代码错误,并且在尝试使用引脚#2的媒体类型时根本不做任何捕获。嗯,我首先只关心视频捕捉,所以这很好。

但是,即使通过Media Foundation告诉流描述符#2是视频捕获,我的Media Foundation代码,它可以完美地与来自蒸汽描述符#1和#3的所有媒体类型一起工作,但在来自流描述符#2的媒体类型上崩溃,类似于Direct Show仅在静态图像捕获时崩溃。

所以我得到的印象是,要么是Media Foundation(或罗技提供的Windows 7网络摄像头驱动程序)有bug,没有在应该的时候将流描述符#2标记为静止图像捕获,或者我正在检查错误的标志,以确定它是视频捕获还是静止图像捕获。如果这是我的错误,那么区分视频(#1和#3)和静止图像(#2)捕获流描述符的正确方法是什么?

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

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

编辑

做更多的研究,有MF_CAPTURE_ENGINE_STREAM_CATEGORY_PHOTO_DEPENDENT

这适用于MFCaptureEngine和它的Windows 8…