V4L2(video 4 linux 2)视频采集接口使用说明
作者 佚名技术
来源 Linux系统
浏览
发布时间 2012-03-24
USERPTR
__u32 reserved[2];
};
获取并记录缓存的物理空间
使用VIDIOC_REQBUFS,我们获取了req.count个缓存,下一步通过调用 VIDIOC_QUERYBUF命令来获取这些缓存的地址,然后使用mmap函数转换成应用程序中的绝对地址,把这段缓存放入缓存队列:
<!--[if !supportLineBreakNewLine]--> <!--[endif]--> typedef struct VideoBuffer { void *start; size_t length; } VideoBuffer; VideoBuffer* buffers = calloc( req.count, sizeof(*buffers) ); struct v4l2_buffer buf; for (numBufs = 0; numBufs < req.count; numBufs ) { memset( &buf, 0, sizeof(buf) ); buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; buf.memory = V4L2_MEMORY_MMAP; buf.index = numBufs; // 读取缓存 if (ioctl(fd, VIDIOC_QUERYBUF, &buf) == -1) { return -1; } buffers[numBufs].length = buf.length; // 转换成相对地址 buffers[numBufs].start = mmap(NULL, buf.length, PROT_READ | PROT_WRITE, MAP_SHARED, fd, buf.m.offset); if (buffers[numBufs].start == MAP_FAILED) { return -1; } // 放入缓存队列 if (ioctl(fd, VIDIOC_QBUF, &buf) == -1) { return -1; } } 四,关于视频采集方式 操作系统一般把系统使用的内存划分成用户空间和内核空间,分别由应用程序管理和操作系统管理.应用程序可以直接访问 内存的地址,而内核空间存放的是 供内核访问的代码和数据,用户不能直接访问.v4l2捕获的数据,最初是存放在内核空间的,这意味着用户不能直接访问该段内存,通过某些手段来转换地 址. 一共有三种视频采集方式:使用read、write方式;内存映射方式和用户指针模式. read、write方式:在用户空间和内核空间不断拷贝数据,占用了大量用户内存空间,效率不高. 内存映射方式:把设备里的内存映射到应用程序中的内存控件,直接处理设备内存,这是一种有效的方式.上面的mmap 函数就是使用这种方式. 用户指针模式:内存片段由应用程序自己分配.这点需要在v4l2_requestbuffers里将memory字 段设置成V4L2_MEMORY_USERPTR. 处理采集数据 V4L2有一个数据缓存,存放req.count数量的缓存数据.数据缓存采用FIFO的方式,当应用程序调用缓存 数据时,缓存队列将最先采集到的 视频数据缓存送出,并重新采集一张视频数据.这个过程需要用到两个ioctl命令,VIDIOC_DQBUF和VIDIOC_QBUF: struct v4l2_buffer buf; memset(&buf,0,sizeof(buf)); buf.type=V4L2_BUF_TYPE_VIDEO_CAPTURE; buf.memory=V4L2_MEMORY_MMAP; buf.index=0; //读取缓存 if (ioctl(cameraFd, VIDIOC_DQBUF, &buf) == -1) { return -1; } //…………视频处理算法 //重新放入缓存队列 if (ioctl(cameraFd, VIDIOC_QBUF, &buf) == -1) { return -1; } 关闭视频设备 使用close函数关闭一个视频设备 close(cameraFd) V4L2较V4L有较大的改动,并已成为2.6的标准接口,函盖video\dvb\FM...,多数驱动都在向V4l2迁移.更好地了解V4L2先从应 用入手,然后再深入到内核中结合物理设备/接口的规范实现相应的驱动.本文先就V4L2在视频捕捉或camera方面的应用框架. V4L2采用流水线的方式,操作更简单直观,基本遵循打开视频设备、设置格式、处理数据、关闭设备,更多的具体操作通过ioctl函数来实现. 1.打开视频设备
在V4L2中,视频设备被看做一个文件.使用open函数打开这个设备:int cameraFd; cameraFd = open( |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |
你可能对下面的文章感兴趣
关于V4L2(video 4 linux 2)视频采集接口使用说明的所有评论