V4L2基本开发流程!
一.什么是V4L2框架?
V4L2英文全称是Video for Linux2,它是专门为视频设备设计的内核驱动。在做视频的开发中,一般我们操控V4L2的设备节点就可以直接对摄像头进行操作。通常V4L2在Linux的设备节点是**/dev/video0**。无论是MIPI摄像头还是UVC摄像头,它们底层默认操作的都是/dev/video0的节点。
二. V4L2的代码框架图:
从这张图可以看出来,在使用V4L2进行摄像头操作的时候,都需要访问内核驱动。而整个设备驱动都是由Linux Device File System进行管理,Linux File System管理的是V4L2CORE的功能。而V4L2_CORE里面包含了V4L2_DEV、V4L2_SUB_DEV、V4L2_DEVICE、VIDEOBUF2_CORE。其中,V4L2_DEIVCE主要是管理视频设备驱动、VIDEOBUF2_CORE主要是管理缓冲队列的数据、V4L2_SUB_DEV主要是管理视频设备的子系统。而应用层若想对整个V4L2驱动层进行控制的话,只需要对v4l2_dev进行fops(文件形式控制)操作即可,因为v4l2_dev是驱动层对用户层提供的接口。
三. V4L2代码开发流程:
3.1.打开设备节点:
打开/dev/video0视频设备节点
3.2.查询设备的能力
利用ioctl函数访问V4L2的底层命令VIDIOC_QUERYCAP主要是查询摄像头的性能属性。
3.3.获取摄像头支持的格式,并进行像素格式设置
通过ioctl VIDEOIOC_ENUM_FMT获取对应的支持格式,并且对摄像头进行相应格式的设置。包括:width、height、pixelformat等等。设置完成之后,再使用ioctl命令进行使能操作,使能对应的关键字:VIDIOC_S_FMT。
3.4.内存映射到用户空间并进行队列操作
利用ioctl控制VIDIOC_REQBUFS,进行视频缓冲区的申请。申请完成之后,把驱动的缓冲区映射到用户空间,映射的api使用的是mmap。若映射用户空间成功的话,则把视频数据入到缓冲区队列,入队对应的ioctl命令是VIDIOC_QBUF。
3.5.开启摄像头获取视频流
使用stream_on指令使能v4l2摄像头,让它正常启动采集流程。
3.6.从缓冲区中把视频数据取出
利用ioctl把缓冲区的视频数据取出,它对应的命令是VIDIOC_DQBUF。使用了VIDIOC_DQBUF之后,v4l2_buffer结构体就有对应的视频数据了。并把对应的数据写到mjpg图片。做完上述所有操作之后,再把摄像头的数据进行入队操作VIDIOC_QBUF。
3.7.关闭摄像头获取流
通过ioctl操控指令VIDIOC_STREAMOFF,关闭摄像头采集工作。
3.8.解除映射缓冲区
使用munmap api解决内核缓冲区到用户缓冲区的映射操作。
3.9.释放所有的资源
四.整个工程的运行流程:
相关文章
- 在 Go 里用 CGO?这 7 个问题你要关注!
- 9款优秀的去中心化通讯软件 Matrix 的客户端
- 求职数据分析,项目经验该怎么写
- 在OKR中,我看到了数据驱动业务的未来
- 火山引擎云原生大数据在金融行业的实践
- OpenHarmony富设备移植指南(二)—从postmarketOS获取移植资源
- 《数据成熟度指数》报告:64%的企业领袖认为大多数员工“不懂数据”
- OpenHarmony 小型系统兼容性测试指南
- 肯睿中国(Cloudera):2023年企业数字战略三大趋势预测
- 适用于 Linux 的十大命令行游戏
- GNOME 截图工具的新旧截图方式
- System76 即将推出的 COSMIC 桌面正在酝酿大变化
- 2GB 内存 8GB 存储即可流畅运行,Windows 11 极致精简版系统 Tiny11 发布
- 迎接 ecode:一个即将推出的具有全新图形用户界面框架的现代、轻量级代码编辑器
- loongarch架构介绍(三)—地址翻译
- Go 语言怎么解决编译器错误“err is shadowed during return”?
- 敏捷:可能被开发人员遗忘的部分
- Denodo预测2023年数据管理和分析的未来
- 利用数据推动可持续发展
- 在 Vue3 中实现 React 原生 Hooks(useState、useEffect),深入理解 React Hooks 的