V4L2摄像头开发
一、V4L2简介V4L2Video for Linux 2是 Linux 内核提供的一套视频设备驱动框架接口规范用于统一管理视频采集设备如摄像头、TV采集卡等。✔ 支持的设备类型摄像头USB / MIPI / CSI图像采集卡视频输入接口收音机设备部分扩展支持✔ 架构层次三、V4L2核心头文件在交叉编译环境中~/.../sysroot/usr/include/linux/核心文件linux/videodev2.h linux/v4l2-subdev.h linux/v4l2-controls.h linux/v4l2-mediabus.h✔ 常用包含方式#include linux/videodev2.h #include sys/ioctl.h #include fcntl.h #include sys/mman.h四、VIDIOC命令查询方法1️⃣ 搜索所有 V4L2 ioctl 命令grep VIDIOC_ /usr/include/linux/videodev2.h2️⃣ 查询关键命令grep -n VIDIOC_QUERYCAP\|VIDIOC_REQBUFS\|VIDIOC_STREAMON /usr/include/linux/videodev2.h3️⃣ 查看宏定义grep -E ^#define VIDIOC_ /usr/include/linux/videodev2.h | head -50五、V4L2开发流程核心1️⃣ 打开设备int vfd open(/dev/video0, O_RDWR);✔ 作用打开摄像头设备文件2️⃣ 查询设备能力struct v4l2_capability cap; ioctl(vfd, VIDIOC_QUERYCAP, cap);✔ 作用获取设备支持能力判断是否支持采集if (cap.capabilities V4L2_CAP_VIDEO_CAPTURE) { // 支持视频采集 }3️⃣ 枚举支持格式struct v4l2_fmtdesc fmt; fmt.type V4L2_BUF_TYPE_VIDEO_CAPTURE; ioctl(vfd, VIDIOC_ENUM_FMT, fmt);✔ 作用查询摄像头支持的图像格式YUYV / MJPEG 等4️⃣ 设置图像格式struct v4l2_format fmt; memset(fmt, 0, sizeof(fmt)); fmt.type V4L2_BUF_TYPE_VIDEO_CAPTURE; fmt.fmt.pix.width WIDTH; fmt.fmt.pix.height HEIGHT; fmt.fmt.pix.pixelformat V4L2_PIX_FMT_MJPEG; ioctl(vfd, VIDIOC_S_FMT, fmt);✔ 作用设置分辨率 像素格式5️⃣ 申请缓冲区REQBUFSstruct v4l2_requestbuffers req; req.count 4; req.type V4L2_BUF_TYPE_VIDEO_CAPTURE; req.memory V4L2_MEMORY_MMAP; ioctl(vfd, VIDIOC_REQBUFS, req);✔ 作用向驱动申请缓存区6️⃣ 内存映射mmapstruct v4l2_buffer buf; void* start mmap( NULL, buf.length, PROT_READ | PROT_WRITE, MAP_SHARED, vfd, buf.m.offset );✔ 作用将内核缓冲区映射到用户空间提高采集速度最快方式7️⃣ 放入采集队列ioctl(vfd, VIDIOC_QBUF, buf);✔ 作用告诉驱动“这个 buffer 可以用来接收图像”8️⃣ 开启视频流int type V4L2_BUF_TYPE_VIDEO_CAPTURE; ioctl(vfd, VIDIOC_STREAMON, type);✔ 作用开始摄像头采集9️⃣ 关闭视频流ioctl(vfd, VIDIOC_STREAMOFF, type);六、Qt C集成方式✔ 方式1Qt中直接写Cclass Camera : public QObject { Q_OBJECT };✔ 优点可直接嵌入 UI实时显示图像✔ 方式2独立程序 Qt调用编译后放入开发板scp digital rootboard:/usr/bin/Qt中调用if (fork() 0) { execlp(digital, digital, data[1], NULL); }✔ 作用Qt作为控制端C程序作为采集执行端七、关键性能点✔ mmap 是最快方式原因避免数据拷贝直接映射内核缓冲区✔ V4L2整体数据流摄像头 ↓ 驱动 buffer ↓ mmap 用户空间 buffer ↓ Qt 显示 / AI处理二、开发环境与设备节点1️⃣ 查找设备节点在开发板系统中ls /dev/video*典型设备/dev/video0