关于V4L2中操作比较重要的几个命令以及一般操作流程总结

简介: 最近在做关于摄像头测试程序相关的一些开发,主要是想要实现在摄像头采集视频的过程中,通过按键来实现拍照,然后将拍照得到的数据保存到一个文件中,通过了解V4L2的一些相关操作,原来,拍照后的数据是保存在一个buf里,而这股数据流便是熟悉的YUYV,要看到相应的图片,还需要特定的转换才能将YUYV的数据转换成bmp图片。

最近在做关于摄像头测试程序相关的一些开发,主要是想要实现在摄像头采集视频的过程中,通过按键来实现拍照,然后将拍照得到的数据保存到一个文件中,通过了解V4L2的一些相关操作,原来,拍照后的数据是保存在一个buf里,而这股数据流便是熟悉的YUYV,要看到相应的图片,还需要特定的转换才能将YUYV的数据转换成bmp图片。

那么,在摄像头中,是怎么获取到图片的呢?

通过V4L2的官方手册,我们得知是该控制命令VIDIOC_DQBUF

那么这个命令的作用是什么呢?

功能: 从视频缓冲区的输出队列中取得一个已经保存有一帧视频数据的视频缓冲区;
参数说明:参数类型为V4L2缓冲区数据结构类型 struct v4l2_buffer ;
返回值说明: 执行成功时,函数返回值为 0;函数执行成功后,相应的内核视频缓冲区中保存有当前拍摄到的视频数据,应用程序可以通过访问用户空间来读取该视频数据。

举个简单的例子:

struct v4l2_buffer cfilledbuffer1;
cfilledbuffer1.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
cfilledbuffer1.memory = V4L2_MEMORY_OVERLAY;
if (ioctl(iCamFd, VIDIOC_DQBUF, &cfilledbuffer1) < 0)
{
	printf("%s VIDIOC_DQBUF Failed!!! \n",__FUNCTION__);
	err = -1;
	goto exit;
}	

上面的这段代码中,cfilledbuffer1就是相应的视频缓冲区,这里面就保存了当前拍摄到的视频数据。

那么,应用程序是怎么访问用户空间的呢?

原来,在应用程序设计中通过调VIDIOC_QUERYBUF来获取内核空间的视频缓冲区信息,然后调用函数mmap把内核空间地址映射到用户空间,这样应用程序才能够访问位于内核空间的视频缓冲区。

那么这个参数的具体作用是什么呢?

参数说明:参数类型为V4L2缓冲区数据结构类型 struct v4l2_buffer ;
返回值说明: 执行成功时,函数返回值为 0;struct v4l2_buffer结构体变量中保存了指令的缓冲区的相关信息;
一般情况下,应用程序中调用VIDIOC_QUERYBUF取得了内核缓冲区信息后,紧接着调用mmap函数把内核空间地址映射到用户空间,方便用户空间应用程序的访问。

举个例子:

m_v4l2Buffer[0] =(unsigned char *) mmap(0, size, PROT_READ|PROT_WRITE, MAP_SHARED, iPmemFd, 0);//映射
if (m_v4l2Buffer[0] == MAP_FAILED) {
     printf(" m_v4l2Buffer[0] mmap failed\n");
    err = -1;
     goto exit2;
}

struct v4l2_buffer buffer;
buffer.type = creqbuf.type;
buffer.memory = creqbuf.memory;
buffer.index = i;// 要获取内核视频缓冲区的信息编号
if (ioctl(iCamFd, VIDIOC_QUERYBUF, &buffer) < 0) {
  printf("%s VIDIOC_QUERYBUF Failed\n",__FUNCTION__);
  goto fail_loop;
}
以上就是我本次做这个项目需要了解的东西,同时,通过参考一些写过V4L2的大神们写过的一些文章,我摘取了其中的部分优秀的文段作为总结,并了解V4L2驱动摄像头的基本流程:

一般操作流程(视频设备):
1. 打开设备文件。 int fd=open("/dev/video0",O_RDWR);
 2. 取得设备的capability,看看设备具有什么功能,比如是否具有视频输入,或者音频输入输出等。VIDIOC_QUERYCAP,struct v4l2_capability
 3. 选择视频输入,一个视频设备可以有多个视频输入。VIDIOC_S_INPUT,struct v4l2_input
 4. 设置视频的制式和帧格式,制式包括PAL,NTSC,帧的格式个包括宽度和高度等。
 VIDIOC_S_STD,VIDIOC_S_FMT,struct v4l2_std_id,struct v4l2_format
 5. 向驱动申请帧缓冲,一般不超过5个。struct v4l2_requestbuffers
 6. 将申请到的帧缓冲映射到用户空间,这样就可以直接操作采集到的帧了,而不必去复制。mmap
 7. 将申请到的帧缓冲全部入队列,以便存放采集到的数据.VIDIOC_QBUF,struct v4l2_buffer
 8. 开始视频的采集。VIDIOC_STREAMON
 9. 出队列以取得已采集数据的帧缓冲,取得原始采集数据。VIDIOC_DQBUF
 10. 将缓冲重新入队列尾,这样可以循环采集。VIDIOC_QBUF
 11. 停止视频的采集。VIDIOC_STREAMOFF
 12. 关闭视频设备。close(fd);

目录
相关文章
|
SQL 关系型数据库 MySQL
因为一条SQL慢查询的思考
本文探讨了MySQL中的慢查询问题,包括定义(执行时间过长的SQL语句)、如何查看慢查询(通过`long_query_time`配置)以及其对系统性能的影响。慢查询可能由缺乏索引、大数据量、网络延迟等因素引起。解决和避免慢查询的方法包括优化配置、添加索引、调整查询语句、批量处理数据、分库分表等。文章还强调了索引在提升查询性能中的作用,解释了B+树索引的工作原理,并列举了可能导致索引失效的场景。
787 0
|
编译器 vr&ar C语言
高效c/c++日志工具zlog使用介绍
高效c/c++日志工具zlog使用介绍
830 2
|
8月前
|
人工智能 PyTorch TensorFlow
MindIE+MindFormers推理方案指导
本文介绍了昇腾大模型推理解决方案MindIE+MindFormers.
MindIE+MindFormers推理方案指导
|
数据可视化 搜索推荐 数据挖掘
Plotly:交互式数据
【7月更文挑战第13天】Plotly是Python的交互式可视化库,用于创建多种图表,如散点图、箱线图等。通过安装`pip install plotly`开始使用。基本的交互式图表演示了如何用学生成绩创建散点图,而自定义图表展示了如何增强视觉效果。Plotly还支持高级交互功能,如数据筛选、动态更新,以及实时数据追踪。未来,Plotly将扩展图表类型、增强交互性和性能,更好地集成云服务,并提供更多的教育资源和定制选项,以适应数据科学的快速发展。
|
8月前
|
API
技术文档撰写之道:构建清晰准确的知识传递桥梁
在科技飞速发展的今天,技术文档至关重要。撰写优质文档需明确目的与受众,构建合理结构,使用简洁语言,善用图表示例,并注重更新维护。这不仅助力团队协作和产品推广,也为技术传承奠定基础。
250 1
|
Java Apache
httpclient能不能改成长连接的连接池
【8月更文挑战第25天】httpclient能不能改成长连接的连接池
382 2
|
Java 应用服务中间件 nginx
FastDFS整合Nginx安装与使用
FastDFS整合Nginx安装与使用
186 0
|
供应链 Python
供需匹配(Demand-Supply Matching)的详细解释与Python代码示例
供需匹配(Demand-Supply Matching)的详细解释与Python代码示例
|
JSON 中间件 API
Gin框架笔记(一) Gin框架的安装与Hello World
Gin框架笔记(一) Gin框架的安装与Hello World
377 0
|
NoSQL 关系型数据库 MySQL
阿里云服务器部署项目流程
本文主要讲解阿里云服务器的部署,如何选择配置等