快速业务通道

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 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号