首页 文章

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

提问于
浏览
2

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

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

  • I420,RGB24和MJPG像素格式的视频捕获(即 PIN_CATEGORY_CAPTUREPIN_CATEGORY_PREVIEW ),FPS为2到30,具体取决于介质类型 .

  • I420和RGB24中的静止图像捕获(即 PIN_CATEGORY_STILL ),仅1 FPS .

  • h264中的视频捕获(即 PIN_CATEGORY_CAPTUREPIN_CATEGORY_PREVIEW ),FPS为5到30 .

所以,由于我只关注视频捕捉,我忽略了所有不是 PIN_CATEGORY_CAPTUREPIN_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 回答

  • 0

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

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

    EDIT

    做一些更多的研究,有MF_CAPTURE_ENGINE_STREAM_CATEGORY_PHOTO_DEPENDENT

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

相关问题