繁体   English   中英

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

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

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

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

  1. I420,RGB24和MJPG像素格式的视频捕获(即PIN_CATEGORY_CAPTUREPIN_CATEGORY_PREVIEW ),FPS为2到30,具体取决于媒体类型。
  2. 在I420和RGB24中以1 FPS拍摄静态图像(即PIN_CATEGORY_STILL )。
  3. 在h264中以5到30的FPS进行视频捕获(即PIN_CATEGORY_CAPTUREPIN_CATEGORY_PREVIEW )。

因此,由于我只关注视频捕获,因此我忽略了所有非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。

您可能会注意到,Media Foundation的流描述符似乎映射到Direct Show的输出针1到1。除了Direct Foundation所做的对比之外,Media Foundation没有将流描述符#2标记为静止图像捕获( MFMediaType_Image )。

静止图像捕获需要与视频捕获不同的处理方式,因此,在尝试使用引脚2中的媒体类型时,我的Direct Show代码错误并且根本不进行任何捕获。 好吧,我一开始只关心视频捕获,所以很好。

但是,即使通过Media Foundation告诉流描述符#2是视频捕获,我的Media Foundation代码也可以与流描述符#2的媒体类型崩溃,该代码与流描述符#2和#3的所有媒体类型均能完美工作。 Direct Show仅在静止图像捕获时崩溃。

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

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

也许您可以假设仅捕获1 fps的媒体类型。

编辑

再做一些研究,有MF_CAPTURE_ENGINE_STREAM_CATEGORY_PHOTO_DEPENDENT

这适用于MFCaptureEngine,适用于Windows 8。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM