想用V4L2 API接口去采集控制CMOS摄像头数据,不知道是不是和USB摄像头一样操作?
准备设置双缓冲区循环采集
求指点!
附相关程序代码:
//摄像头相关的数据结构
struct cmos_camera_device
{
int fd;
struct v4l2_capability capability;
struct v4l2_format fmt;
struct v4l2_buffer tV4L2buf;
};
//应用程序缓冲区
typedef struct VideoBuffer
{
void *start;
size_t length;
}VideoBuffer;
/**********************初始化摄像头***************************/
int cmos_camera_device_init(struct cmos_camera_device *ucDevice,struct VideoBuffer v_buf[])
{
if((ucDevice->fd = open("/dev/video0",O_RDWR)) == -1) //打开设备
return -1;
if(ioctl(ucDevice->fd,VIDIOC_QUERYCAP,&ucDevice->capability) == -1) //获取设备信息
return -2;
ucDevice->fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
if(ioctl(ucDevice->fd,VIDIOC_G_FMT,&(ucDevice->fmt)) == -1)//获取格式
return -3;
if(ucDevice->fmt.fmt.pix.pixelformat!=V4L2_PIX_FMT_YUYV) //如果不是此摄像头支持格式则退出
return -4;
if(ioctl(ucDevice->fd,VIDIOC_S_FMT,&ucDevice->fmt) == -1) //设置格式
return -5;
struct v4l2_requestbuffers req;
req.count = 2;
req.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
req.memory = V4L2_MEMORY_MMAP;
if(ioctl(ucDevice->fd,VIDIOC_REQBUFS,&req) == -1 ||((req.count)<2)) //申请缓冲区个数:2
return -6;
ucDevice->tV4L2buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
ucDevice->tV4L2buf.memory = V4L2_MEMORY_MMAP;
ucDevice->tV4L2buf.index = 0; //要获取内核视频缓冲区的信息编号
if(ioctl(ucDevice->fd,VIDIOC_QUERYBUF,&ucDevice->tV4L2buf) == -1)
return -7;
ucDevice->tV4L2buf.index = 1;//要获取内核视频缓冲区的信息编号
if(ioctl(ucDevice->fd,VIDIOC_QUERYBUF,&ucDevice->tV4L2buf) == -1)//缓冲区入队
return -8;
v_buf[0].start=NULL;
v_buf[1].start=NULL;
//申请2个缓冲区