#include <linux/videodev2.h>
/*头文件*/
struct v4l2_capability cap;
ioctl(fd, VIDIOC_QUERYCAP, &cap);
/*查询 video设备的类型摄像头一般是VIDEO_CAPTURE*/
/* Values for 'capabilities' field */
#define V4L2_CAP_VIDEO_CAPTURE 0x00000001 /* Is a video capture device */
#define V4L2_CAP_VIDEO_OUTPUT 0x00000002 /* Is a video output device */
#define V4L2_CAP_VIDEO_OVERLAY 0x00000004 /* Can do video overlay */
#define V4L2_CAP_VBI_CAPTURE 0x00000010 /* Is a raw VBI capture device */
#define V4L2_CAP_VBI_OUTPUT 0x00000020 /* Is a raw VBI output device */
#define V4L2_CAP_SLICED_VBI_CAPTURE 0x00000040 /* Is a sliced VBI capture device */
#define V4L2_CAP_SLICED_VBI_OUTPUT 0x00000080 /* Is a sliced VBI output device */
#define V4L2_CAP_RDS_CAPTURE 0x00000100 /* RDS data capture */
struct v4l2_fmtdesc fmt;
fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
fmt.index = i;
ioctl(fd, VIDIOC_ENUM_FMT, &fmt);
/*查询video设备支持的格式类型比如 YUV420*/
struct v4l2_frmsizeenum frmsize;
frmsize.pixel_format = fmt.pixelformat;
frmsize.index = j;
ioctl(fd, VIDIOC_ENUM_FRAMESIZES, &frmsize);
/*图像的分辨率等输据*/
struct v4l2_format format;
format.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
format.fmt.pix.width = WIDTH;
format.fmt.pix.height = HEIGHT;
format.fmt.pix.pixelformat = FMT;
ioctl(fd, VIDIOC_S_FMT, &format);
ioctl(fd, VIDIOC_G_FMT, &format);
/*获取当前或者重新设定采集的图像格式*/
struct v4l2_requestbuffers reqbuf;
reqbuf.count = COUNT;
reqbuf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
reqbuf.memory = V4L2_MEMORY_MMAP;
ioctl(fd, VIDIOC_REQBUFS, &reqbuf);
/*通知video driver 申请内存摄像头一般是vediobuf api vb2_core_reqbufs*/
struct v4l2_buffer buff;
buff.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
buff.memory = V4L2_MEMORY_MMAP;
ioctl(fd, VIDIOC_QUERYBUF, &buff);
datas = mmap(NULL, buff.length, PROT_READ, MAP_SHARED, fd, buff.m.offset);
/*获取分配的内存的物理地址并mmap出一个user地址供应用程序使用*/
/*datas放到文件里既是采集到的图像文件*/
ioctl(fd, VIDIOC_QBUF, &buff);
ioctl(fd, VIDIOC_DQBUF, &buff);
/*从VIDIOC_REQBUFS申请到的buf 入队出队到图像采集队列里*/
/*Applications call the VIDIOC_QBUF ioctl to enqueue an empty (capturing)*/
/*or filled (output) buffer in the driver’s incoming queue*/
int on = V4L2_BUF_TYPE_VIDEO_CAPTURE;
ioctl(fd, VIDIOC_STREAMON, &on);
/*开始图像采集*/
第一章 V4L2简介 — Linux V4L2 drafthttps://work-blog.readthedocs.io/en/latest/v4l2%20intro.html