日期:2014-05-16  浏览次数:21205 次

V4L2 摄像头采集帧数低问题
最近在做和摄像头有关的小程序,需要在ARM(linux系统)板子上跑。
手上有两个USB摄像头,一个是罗技的C210,另外一个是淘宝上买的监控摄像机。
用V4L2写了程序来测试这两个摄像头,两者都支持YUYV格式输出,前者(罗技C210)测试完全没问题,取出来的帧数15FPS;而后者(监控摄像机)取出来的视频只有2-3FPS(320*240分辨率),我详细的看了一下V4L2,有个可以设置帧数的控制命令,我将帧数设置成30、15、10,执行VIDIOC_S_PARM控制命令的时候就会被改成5,应该是V4L2在配置是会使用和用户设置最接近的可用值,而这里只支持5帧数。

    setfps->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
    setfps->parm.capture.timeperframe.numerator = 1;
    setfps->parm.capture.timeperframe.denominator = 30;
    if(-1 == xioctl(fd_video, VIDIOC_S_PARM, setfps))
errno_exit("VIDIOC_S_PARM");
    printf("numerator: %d, denominator: %d\n",
   setfps->parm.capture.timeperframe.numerator,
   setfps->parm.capture.timeperframe.denominator);
    //会输出 numerator: 1, denominator: 5

我怀疑这可能不是我程序的问题,而是摄像头对V4L2支持的不好(不知道是否有这个说法)?我做了如下尝试,把帧数低的那个摄像头接在电脑分别在windows、Linux环境下测试,windows环境下当然没有问题;在Linux下,我下了一个Cheese Webcam Booth来测试摄像头,和windows环境下一样,效果非常好,我没有Cheese那软件的源代码,不清楚它调用的是否是V4L2或是其他。

请教一下, 我接下来应该怎么做?

------解决方案--------------------
linux 下除了v4l2还有其他的接口吗?
我觉得你还是找到cheese webcam booth的源码,看看它是怎么做的

------解决方案--------------------
或者在kernel的v4l2接口中加入trace信息,看cheese webcam booth怎么调用的