关于DirectShow中摄像头的帧率设置
2012-05-17 15:17
274 查看
转自: http://blog.csdn.net/liujun2458/article/details/7506435
我发现在DirectShow中,不管是把帧率的值设置为多少,IAMStreamConfig::SetFormat()这个函数都不会失败。检查返回值,也是返回了S_OK,这就说明设置成功。但是实际上,摄像头采集的帧率不可能是任意一个值。查了一些资料,并写了些代码测试,发现一些问题。
我是用的罗技C310摄像头做的测试,本机上并没有装任何罗技摄像头驱动,就当一个普通的设备使用。当我用枚举设备的方式(DirectShow中枚举摄像头的采集分辨率这篇文中讲过)来查看有多少支持的帧率时,得到的分辨率有10帧、20帧、25帧和30帧。DirectShow中是以100纳秒为单位,也就是得到的实际值是1000000、500000、4000000和3333333。方式如下:
但是,为什么任意设定的值也能成功呢?如果任意设置分辨率的话,就会失败,说明帧率的确成功了。后来查查MSDN,发现有这么一段话。帧率是介于一个最小值与最大值之间的一个值。当设置的帧率超过最大值,系统会选择m最大值作为帧率,同样,当设置的帧率小于最小值,系统就会选择最小值作为帧率。当设置的帧率介于这之间,但是摄像头又不支持的话,系统会选取一个最接近的帧率。
也就是说,帧率的设置一般都会成功的。但是根据我的经验,最好是设置为5、10、15、20、25和30。当然,一些高级点的摄像头都支持更高的帧率,但是需要安装驱动。
我发现在DirectShow中,不管是把帧率的值设置为多少,IAMStreamConfig::SetFormat()这个函数都不会失败。检查返回值,也是返回了S_OK,这就说明设置成功。但是实际上,摄像头采集的帧率不可能是任意一个值。查了一些资料,并写了些代码测试,发现一些问题。
我是用的罗技C310摄像头做的测试,本机上并没有装任何罗技摄像头驱动,就当一个普通的设备使用。当我用枚举设备的方式(DirectShow中枚举摄像头的采集分辨率这篇文中讲过)来查看有多少支持的帧率时,得到的分辨率有10帧、20帧、25帧和30帧。DirectShow中是以100纳秒为单位,也就是得到的实际值是1000000、500000、4000000和3333333。方式如下:
#include"SmartPtr.h" // 这个头文件参考Windows SDK里面DirectShow部分的代码,里面有这个头文件 #include<dshow.h> #include<fstream> HRESULT GetCaptureRatio(IBaseFilter* pCapFilter, ICaptureGraphBuilder2* pBuild) { HRESULT hr; SmartPtr<IAMStreamConfig> pam; hr = pBuild->FindInterface(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video, pCapFilter, IID_IAMStreamConfig, reinterpret_cast<void**>(&pam)); // 得到媒体控制接口 int nCount = 0; int nSize = 0; hr = pam->GetNumberOfCapabilities(&nCount, &nSize); ofstream outfile("captureframe.txt"); // 准备写入文件 // 判断是否为视频信息 if (sizeof(VIDEO_STREAM_CONFIG_CAPS) == nSize) { for (int i=0; i<nCount; i++) { VIDEO_STREAM_CONFIG_CAPS scc; AM_MEDIA_TYPE* pmmt; hr = pam->GetStreamCaps(i, &pmmt, reinterpret_cast<BYTE*>(&SCC)); if (pmmt->formattype == FORMAT_VideoInfo) { VIDEOINFOHEADER* pvih = reinterpret_cast<VIDEOINFOHEADER*>(pmmt->pbFormat); int nFrame = pvih->AvgTimePerFrame; // 得到采集的帧率 outfile << nFrame << endl; // 写入文件 } } } outfile.close(); // 关闭文件 reture(hr); }
但是,为什么任意设定的值也能成功呢?如果任意设置分辨率的话,就会失败,说明帧率的确成功了。后来查查MSDN,发现有这么一段话。帧率是介于一个最小值与最大值之间的一个值。当设置的帧率超过最大值,系统会选择m最大值作为帧率,同样,当设置的帧率小于最小值,系统就会选择最小值作为帧率。当设置的帧率介于这之间,但是摄像头又不支持的话,系统会选取一个最接近的帧率。
也就是说,帧率的设置一般都会成功的。但是根据我的经验,最好是设置为5、10、15、20、25和30。当然,一些高级点的摄像头都支持更高的帧率,但是需要安装驱动。
相关文章推荐
- 关于DirectShow中摄像头的帧率设置
- 关于RK3066&RK3188 BOX 4.4.2 SDK,外接USB摄像头,像素设置为500万,拍照时右下角出现小块长方形色块。
- 关于OV7670摄像头的分辨率设置
- directshow 摄像头参数 设置
- 摄像头帧率设置问题的解决
- 【研发ing】关于OV3640 300W 摄像头在wince6.0 DSHOW(directshow)上的应用程序和驱动程序配合调试
- 关于Android摄像头操作设置的工具类
- 关于wince6.0 摄像头驱动分辨率设置,尤其是scaler功能使用的认识
- 【计算机视觉】关于用opencv 设置摄像头读分辨率问题的若干说明
- Linux下OpenCV设置摄像头帧率FPS
- 摄像头ov2685中关于sensor id 设置的相关的寄存器地址
- 摄像头ov2685中关于sensor id 设置的相关的寄存器地址
- iOS 中正确切换摄像头&正确实现设置帧率的方式
- 摄像头ov2685中关于sensor id 设置的相关的寄存器地址
- 有关于用java来调用打印机进行打印时的设置问题
- 关于响应式的栅格应该怎样设置响应节点
- 关于windowsForm设置快捷键的方法
- 关于PHP伪静态Rewrite设置
- jni 调用V4L2使用ioctl设置v4l2摄像头参数
- 关于Intel(R) IPP函数库在BCB中的使用设置说明