我正在以两种不同的方式从网络摄像头进行视频捕获(想想两个应用程序):使用 Direct Show 和 Media Foundation。
使用 Direct Show,我的 Logitech c920 网络摄像头有 3 个输出引脚:
- I420、RGB24 和 MJPG 像素格式的视频捕获(即
PIN_CATEGORY_CAPTURE
或PIN_CATEGORY_PREVIEW
),FPS 从 2 到 30,具体取决于媒体类型。 PIN_CATEGORY_STILL
I420 和 RGB24 中的静态图像捕获(即)仅 1 FPS。- 帧率从 5 到 30 的 h264视频捕获(即
PIN_CATEGORY_CAPTURE
或PIN_CATEGORY_PREVIEW
)。
所以,由于我只关心视频捕捉,我忽略了所有不是 PIN_CATEGORY_CAPTURE
or的引脚PIN_CATEGORY_PREVIEW
,这很好用。
使用 Media Foundation,同一个相机有 3 个流描述符 ( IMFPresentationDescriptor::GetStreamDescriptorCount
)。每个流描述符都提供IMFMediaTypeHandler
允许您迭代媒体类型。所以我有 3 个 IMFMediaTypeHandlers:
- I420、RGB24 和 MJPG 像素格式的视频捕捉(即
IMFMediaTypeHandler::GetMajorType == MFMediaType_Video
),FPS 从 2 到 30,取决于媒体类型。 IMFMediaTypeHandler::GetMajorType == MFMediaType_Video
i420 和 RGB24 中的视频捕获(即)仅需 1 FPS。- 帧率从 5 到 30 的 h264视频捕获(即
IMFMediaTypeHandler::GetMajorType == MFMediaType_Video
)。
您会注意到,Media Foundation 的流描述符似乎映射到 Direct Show 的输出引脚 1 和 1。除了 Media Foundation 没有将流描述符 #2 标记为静止图像捕获 ( MFMediaType_Image
),这与 Direct Show 所做的相反。
静态图像捕获需要与视频捕获不同的处理,因此我的 Direct Show 代码错误并且在尝试使用来自 pin #2 的媒体类型时根本不进行任何捕获。好吧,我首先只关心视频捕获,所以这很好。
但即使媒体基金会告诉流描述符#2 是视频捕获,我的媒体基金会代码,它与来自蒸汽描述符#1 和#3 的所有媒体类型完美配合,在来自流描述符#2 的媒体类型上崩溃,类似于如何Direct Show 仅在静态图像捕获时崩溃。
所以我的印象是 Media Foundation(或Logitech 提供的 Windows 7 网络摄像头驱动程序)有问题,并且没有将流描述符 #2 标记为静止图像捕获,或者我正在检查错误的标志以确定它是否是视频捕获或静止图像捕获。如果这是我的错误,那么区分视频(#1和#3)和静止图像(#2)捕获流描述符的正确方法是什么?