Directshow采集视频细节

Directshow 采集遇到的几个问题

  1. CPU占用高

    windows下使用的网络摄像头产品各种各样,支持的分辨率,视频格式也各有不同,在我们的项目中使用的一款摄像头,遇到一个奇怪了的问题,只是开启了摄像头的采集(采集为回调模式,回调函数中啥都没做),进程占用的CPU就会达到7%左右。经查阅资料发现了问题,在采集视频时,我指定的视频格式为RGB24而实际上该摄像头并不支持RGB24数据。DirectShow会自动加入一个Color Space Filter将采集出来的数据转换为RGB24。正是这个转换的Filter占用了CPU。如果将格式设置为摄像头支持的格式(比如 YUY2),CPU占用就会下降。

  2. 网络摄像头参数设置问题

这里的参数设置指的是分辨率和帧率,有时候使用一款网络摄像头,比如设置了采集分辨率为1080P,帧率为30。结果实际采集出来的效果是图像一卡一卡,很不流畅,帧率只有几帧。其实这种情况并不是程序的问题,而是摄像头参数支持的问题,如下图为罗技C920网络摄像头的参数信息:

这里写图片描述

可以看到画红线的,在YUY2格式下,1080P的最大帧率为5帧。当把视频格式设置为YUY2或RGB24(YUY2转化而来)时,实际采集的帧率就只有5帧。

所以这里有个问题要考虑,当设置采集参数时是应该以帧率优选还是以分辨率优选,在我们的项目中是以帧率优先的:在匹配采集参数时,选择满足帧率的最大分辨率,在编码前会对分辨率进行缩放达到指定分辨率。如果以分辨率优先,摄像头要是对选择的分辨率的帧率只有几帧,那么图像定会一卡一卡很影响体验。

封装Driectshow视频采集

基于DriectShow封装了一个视频采集类,该类支持如下功能:
1. 采集模式为回调模式,默认视频格式为RGB24。
2. 支持设置采集的视频数据的分辨率及帧率,支持以预定义的策略设置采集的分辨率。
3. 支持视频预览。
4. 支持检索系统中可用的摄像头。
5. 支持打开指定的摄像头。

Driectshow采集封装代码

资料

采集格式为RGB24时,DirectShow添加的转换
https://stackoverflow.com/questions/1827635/how-to-capture-live-camera-frames-in-rgb-with-directshow

Using the Sample Grabber
https://msdn.microsoft.com/en-us/library/windows/desktop/dd407288(v=vs.85).aspx

Sample Grabber的回调模式
https://msdn.microsoft.com/en-us/library/windows/desktop/dd376992(v=vs.85).aspx

Preview与采集同时开启
https://msdn.microsoft.com/en-us/library/windows/desktop/dd387893(v=vs.85).aspx

猜你喜欢

转载自blog.csdn.net/mo4776/article/details/79630241