媒体基金会错误地将静止图像捕获流描述符标记为视频捕获
Media Foundation is incorrectly marking still image capture stream descriptors as video capture
我正在用两种不同的方式(考虑两种应用程序)从网络摄像头进行视频捕获:使用Direct Show和Media Foundation。
使用直接显示,我的罗技c920摄像头有3个输出引脚:
- 视频捕获(即
PIN_CATEGORY_CAPTURE
或PIN_CATEGORY_PREVIEW
)在I420, RGB24和MJPG像素格式,与FPS从2到30,取决于媒体类型。 - I420和RGB24中的静止图像捕获(即
PIN_CATEGORY_STILL
) - 视频捕获(即
PIN_CATEGORY_CAPTURE
或PIN_CATEGORY_PREVIEW
)在h264, FPS从5到30。
所以,因为我只关心视频捕获,所以我忽略了所有不是PIN_CATEGORY_CAPTURE
或PIN_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
) - 视频捕获(即
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…
- 在C++中将字符串转换为双精度,而无需科学记数法
- 将大双精度转换为科学记数法以用作字符串?
- 如何将文件描述符 (int fd) 转换为文件指针 ( 文件* fp )
- 将文件描述符添加到EPOLL,将事件设置为零是有效的
- 如何将Hresult转换为错误描述
- 描述为什么不允许在C++中将基类指针转换为派生类指针
- BGL:邻接列表为描述符返回错误的边缘属性
- 将句柄转换为文件描述符
- 为通过在C++中打开创建的文件描述符设置vbuf
- 在科学记数法中将双精度转换为字符串的速度比在 c++ 中将 sprintf 转换得更快
- 为特定于进程的安全描述符创建访问令牌
- 从 SURF 描述符转换为关键点
- 如何使用opencv为手动定义的地标找到描述符
- 如何将十进制科学记数法float/double转换为普通字符串
- 媒体基金会错误地将静止图像捕获流描述符标记为视频捕获
- 将double/float类型转换为string类型,保留科学记数法和精度
- 如何将多个文件描述符合并为一个
- 我们可以在mysql数据库中为surf描述符指定什么类型
- 使用受保护的方法而不是为继承树中的每个派生类创建新的虚拟函数,这是一种好的做法吗.例如,在描述中
- 描述通过串行端口传入的数据;将位解析为 int 或 float 等类型