V4L是linux内核中关于视频设备的子系统,为linux下的视频驱动提供了统一的接口,使应用程序可以使用统一的API操作不同的视频设备,简化视频系统的开发与维护

V4L2相比与V4L有更好的扩展性和灵活性

(一)V4L2支持设备:

V4L2可以支持多种设备,可以有以下几种接口:

1)视频采集接口

2)视频输出接口

3)直接传输视频接口:将视频采集设备上采集的信号直接输出到视频输出设备上,不用经过系统CPU

4)视频间隔消隐信号接口(VBI Interface):使引用可以访问传输消隐期的视频信号

5)收音机接口:

(二)V4L2设备处理流程

打开V4L2设备节点

int fd = open("/dev/video0",O_RDWR |O_NONBLOCK);

配置设备/查询设备属性

int ioctl (int fd, unsigned long int request, .../*args*/) ;

常见的request命令:

VIDIOC_REQBUFS:在内核空间中分配帧缓冲区

struct v4l2_requestbuffers req;
req.count=;
req.type=V4L2_BUF_TYPE_VIDEO_CAPTURE;
req.memory=V4L2_MEMORY_MMAP;
ioctl(fd,VIDIOC_REQBUFS,&req);

VIDIOC_QUERYBUF:将REQBUFS中分配的缓存转换成物理地址,并将物理地址映射到用户空间

for (n_buffers = ; n_buffers < req.count; ++n_buffers)
{
struct v4l2_buffer buf;
memset(&buf,,sizeof(buf));
buf.type =V4L2_BUF_TYPE_VIDEO_CAPTURE;
buf.memory =V4L2_MEMORY_MMAP;
buf.index =n_buffers;
if (- == ioctl(fd, VIDIOC_QUERYBUF, &buf))
{
printf("error in VIDIOC_QUERYBUF\n");
return -;
}
buffers[n_buffers].length= buf.length;
buffers[n_buffers].start=mmap (NULL,buf.length,PROT_READ | PROT_WRITE ,MAP_SHARED,fd, buf.m.offset);
if (MAP_FAILED== buffers[n_buffers].start)
return -;
}

VIDIOC_QUERYCAP:查询驱动功能

struct v4l2_capability cap;
if( ioctl(fd,VIDIOC_QUERYCAP,&cap) == -)
printf("error\n");
printf("capability:\n");
printf("driver:%s\n",cap.driver);
printf("card:%s\n",cap.card);
printf("bus info:%s\n",cap.bus_info);
printf("version:%d\n",cap.version);
printf("capabilities:%x\n",cap.capabilities);

VIDIOC_ENUM_FMT:获取当前驱动支持的视频格式

struct v4l2_fmtdesc fmtdesc;
fmtdesc.index = ;
fmtdesc.type=V4L2_BUF_TYPE_VIDEO_CAPTURE;
printf("fmtdesc:\n");
while(ioctl(fd, VIDIOC_ENUM_FMT, &fmtdesc) != -)
{
printf("\t%d.%s\n",fmtdesc.index+,fmtdesc.description);
fmtdesc.index++;
}

VIDIOC_G/S_FMT:读取/设置当前驱动的视频捕捉格式

struct v4l2_format format;
memset(&format, , sizeof(struct v4l2_format));
format.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
if( ioctl(fd, VIDIOC_G_FMT, &format) == -)
{
printf("VIDIOC_G_FMT error\n");
return -;
}
struct v4l2_pix_format pix_format;
pix_format = format.fmt.pix;
printf("pix_format\n");
printf("width:%d\n",pix_format.width);
printf("height:%d\n",pix_format.height);
printf("bytesperline:%d\n",pix_format.bytesperline);
printf("sizeimage:%d\n",pix_format.sizeimage);

VIDIOC_TRY_FMT:验证当前驱动的显示格式

VIDIOC_CROPCAP:查询驱动的修剪能力

VIDIOC_G/S_CROP:读取/设置视频信号的边框

struct v4l2_cropcap cropcap;
struct v4l2_crop crop;
cropcap.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
if( == ioctl(fd, VIDIOC_CROPCAP, &cropcap))
{
crop.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
crop.c = cropcap.defrect;
if(- == ioctl(fd, VIDIOC_S_CROP, &crop))
{
printf("VIDIOC_S_CROP error\n");
return -;
}
}

VIDIOC_QBUF:把缓存区放入缓存队列

VIDIOC_DQBUF:把缓存去从缓存队列中取出

unsigned int i;
enum v4l2_buf_type type;
for (i = ; i< ; ++i)
{
struct v4l2_buffer buf;
buf.type =V4L2_BUF_TYPE_VIDEO_CAPTURE;
buf.memory =V4L2_MEMORY_MMAP;
buf.index = i;
ioctl (fd,VIDIOC_QBUF, &buf);
}
type =V4L2_BUF_TYPE_VIDEO_CAPTURE;
ioctl (fd,VIDIOC_STREAMON, &type);
struct v4l2_buffer buf;
buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
buf.memory =V4L2_MEMORY_MMAP;
if( ioctl (fd,VIDIOC_DQBUF, &buf)==-)
{
printf("error in VIDIOC_DQBUF\n");
return -;
}

VIDIOC_STREAMON:开始视频显示函数

VIDIOC_STREAMOFF:结束视频显示函数

VIDIOC_QUERYSTD:检查当前视频设备支持的标准,亚洲一般使用PAL制式摄像头,欧洲一般使用NTSC摄像头

v4l2_std_id std;
int ret;
do
{
ret = ioctl(fd,VIDIOC_QUERYSTD,&std);
}while(-==ret && errno==EAGAIN);
switch(std)
{
case V4L2_STD_NTSC:
//
case V4L2_STD_PAL:
//
}

处理v4l2视频数据

v4l2设定了三种应用程序与驱动的交互方式:

1)直接读取设备文件方式read/write

2)mmap映射方式

3)用户指针方式

mmap方式:驱动将内部数据空间映射到应用程序空间上,双方直接在这个空间上进行数据交换

用户指针方式:首先由应用程序申请一段缓冲区,然后将缓冲区传给驱动,驱动将其作为缓冲区,从而实现内存共享

直接read/write:一般配合select使用,直接读取设备文件的方式进行I/O

关闭设备

调用close关闭文件描述符,如果进行了内存映射,关闭之前还需要munmap解除映射

v4l2简介的更多相关文章

  1. V4L2驱动程序框架架构【转】

    本文转载自:http://blog.csdn.net/tommy_wxie/article/details/11728809 1 V4L2简介 video4linux2(V4L2)是Linux内核中关 ...

  2. V4L2驱动程序架构

    1 V4L2简介 video4linux2(V4L2)是Linux内核中关于视频设备的内核驱动,它为Linux中视频设备访问提供了通用接口,在Linux系统中,V4L2驱动的Video设备节点路径通常 ...

  3. 转: V4L2驱动程序架构

    源地址:http://blog.chinaunix.net/uid-26101960-id-3297657.html 1 V4L2简介 video4linux2(V4L2)是Linux内核中关于视频设 ...

  4. android camera(三):camera V4L2 FIMC

    1. V4L2 1)简介 在Linux中,摄像头方面的标准化程度比较高,这个标准就是V4L2驱动程序,这也是业界比较公认的方式. V4L全称是Video for Linux,是Linux内核中标准的关 ...

  5. 【转】android camera(三):camera V4L2 FIMC

    关键词:android  camera CMM 模组 camera参数  CAMIF   V4L2  平台信息:内核:linux系统:android 平台:S5PV310(samsung exynos ...

  6. v4l2功能列表大全【转】

    一,功能参考 目录 V4L2 close() - 关闭一个V4L2设备 V4L2 ioctl() - 创建的V4L2设备 ioctl VIDIOC_CROPCAP - 视频裁剪和缩放功能信息 ioct ...

  7. v4l2驱动编写篇【转】

    转自:http://blog.csdn.net/michaelcao1980/article/details/53008418 大部分所需的信息都在这里.作为一个驱动作者,当挖掘头文件的时候,你可能也 ...

  8. V4L2视频采集原理

    一.简介 Video for Linuxtwo(Video4Linux2)简称V4L2,是V4L的改进版.V4L2是linux操作系统下用于采集图片.视频和音频数据的API接口,配合适当的视频采集设备 ...

  9. Android-ION内存管理简介

    ION内存管理简介 https://www.jianshu.com/p/4f681f6ddc3b http://kernel.meizu.com/memory%20management%20-%20i ...

随机推荐

  1. (Step by Step)How to setup IP Phone Server(VoIP Server) for free.

    You must have heard about IP Phone and SIP (Software IP Phone).Nowadays standard PSTN phone are bein ...

  2. CentOS搭建VSFTP

    1.先看看有没有安装 rpm -qa | grep vsftpd 如果没有提示,说明没有安装.接下来,我们安装一个ftp. 2.yum安装vsftpd: yum -y install vsftpd 安 ...

  3. Camtasia Studio8使用教程

    tip:善于使用ctrl+f搜索目录查看内容 目录 软件的下载与安装 软件的汉化与界面介绍 录制前准备与试机录制 录像机的设置 屏幕画 导入与编辑视频(包括图片,音乐,媒体) 时间线轨道时间轴 标记的 ...

  4. flot中文说明文档 简版

    Flot参考文档: 一.对绘图函数plot的调用:var plot=$.plot(placeholder,data,options) ----------- placeholder --------- ...

  5. 第三周作业、实时操作系统µC/OS介绍及其它内容

    作业要求 见<实时控制软件设计>第三周作业 1 阅读笔记--µC/OS 1.1 基本介绍 µC/OS是由Micrium公司研发的实时操作系统,以µC/OS-II或µC/OS-III为内核, ...

  6. Kinect for Windows SDK开发入门(15):进阶指引 下

    Kinect for Windows SDK开发入门(十五):进阶指引 下 上一篇文章介绍了Kinect for Windows SDK进阶开发需要了解的一些内容,包括影像处理Coding4Fun K ...

  7. Java基础知识强化之IO流笔记44:IO流练习之 复制图片的 4 种方式案例

    1. 复制图片的 4 种方式案例: 分析: 复制数据,如果我们知道用记事本打开并能够读懂,就用字符流,否则用字节流. 通过该原理,我们知道我们应该采用字节流. 而字节流有4种方式,所以做这个题目我们有 ...

  8. eplice下载地址

    http://www.eclipse.org/downloads/download.php?file=/technology/epp/downloads/release/kepler/R/eclips ...

  9. 将table内容输出为csv文件

    1.创建 directory create or replace directory tt as'c:\'; SELECT * FROM DBA_OBJECTS DO WHERE DO.OBJECT_ ...

  10. sql快速生成大量数据

    先插入一条数据 insert into table(a,b,c,d) values(1,2,3,4) 然后重复执行以下sql语句 没执行一次 数据就会倍增 insert into table(a,b, ...