关于DirectShow中摄像头的帧率设置

news/2024/11/17 8:56:47/

最近无更新,再转一篇自己以前写的一个博客,关于Directshow中帧率的设定问题。


我发现在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。当然,一些高级点的摄像头都支持更高的帧率,但是需要安装驱动。


http://www.ppmy.cn/news/390930.html

相关文章

使用EasyCode自定义模板,自动生成代码

首先创建spring boot项目&#xff0c;导入相关依赖是必须的#### 导入依赖&#xff1a; pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001…

他们做了个艰难的决定

可口可乐做了个艰难的决定&#xff0c;如果监测到用户胃里有百事可乐&#xff0c;将自动释放农药和汞。 中石化做了个艰难的决定&#xff0c;如果监测到用户汽车油箱里有中石油&#xff0c;将自动释放电火花。 肯德基做了个艰难的决定&#xff0c;如果监测到用户吃过有麦当劳&a…

试玩Flutter:写了个无聊的App(附Flutter感受)

今日份的X Github&#xff1a;github.com/shuiRong/To… &#xff08;今日份的X&#xff09; 这是一个Flutter写的一个无聊的App 每天推荐一个不同的&#xff1a;图片、诗歌、名言、音乐、乐评、高等数学、两种配色、化学方程式、Github Repo、知乎问题。 &#xff08;P.S. 除图…

java小白兔

小了白了兔 白了白又白 两了只了耳了朵了竖了起了来 爱了吃了萝了卜了和了青了菜 蹦了蹦了跳了跳了真了可了爱

我就是小白兔

我的第一篇文章 当你们看到我的第二篇文章是这篇文章就已经删除了

递推计算小白兔拔萝卜问题的最有矩阵

#include<stdlib.h> #include<stdio.h> #include <time.h> const int M8;//萝卜地行数 const int N10;//萝卜地列数 int v[M][N],c[M][N];//萝卜数矩阵&#xff0c;最优萝卜数矩阵 int diguiluobo(int m,int n) {//分四种情况计算&#xff0c;期中三种情况需…

小白兔写话_聪明的小白兔看图写话

内容简介&#xff1a;有一只孤独又美丽的小白兔住在一个大山坡&#xff0c;小白兔每天往自己的身上撒好香的香水&#xff0c;有一只狡猾的狐狸就住.. 本文《聪明的小白兔看图写话》由小学生作文大全整理&#xff0c;仅供参考。如果觉得很不错&#xff0c;欢迎点评和分享&#x…

小白兔写话_小白兔看图写话

【小白兔】 马明轩 有一天&#xff0c;我和妈妈去公园玩&#xff0c;看到了一个小白兔。 它长长的耳朵非常灵敏&#xff0c;可以听到20甚至是30米之外的地方。大大的眼睛亮晶晶的&#xff0c;像两颗红宝石。小小的三瓣嘴有两颗洁白的大板牙&#xff0c;很锋利。尾巴短短的&…