v4l2简介
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简介的更多相关文章
- V4L2驱动程序框架架构【转】
本文转载自:http://blog.csdn.net/tommy_wxie/article/details/11728809 1 V4L2简介 video4linux2(V4L2)是Linux内核中关 ...
- V4L2驱动程序架构
1 V4L2简介 video4linux2(V4L2)是Linux内核中关于视频设备的内核驱动,它为Linux中视频设备访问提供了通用接口,在Linux系统中,V4L2驱动的Video设备节点路径通常 ...
- 转: V4L2驱动程序架构
源地址:http://blog.chinaunix.net/uid-26101960-id-3297657.html 1 V4L2简介 video4linux2(V4L2)是Linux内核中关于视频设 ...
- android camera(三):camera V4L2 FIMC
1. V4L2 1)简介 在Linux中,摄像头方面的标准化程度比较高,这个标准就是V4L2驱动程序,这也是业界比较公认的方式. V4L全称是Video for Linux,是Linux内核中标准的关 ...
- 【转】android camera(三):camera V4L2 FIMC
关键词:android camera CMM 模组 camera参数 CAMIF V4L2 平台信息:内核:linux系统:android 平台:S5PV310(samsung exynos ...
- v4l2功能列表大全【转】
一,功能参考 目录 V4L2 close() - 关闭一个V4L2设备 V4L2 ioctl() - 创建的V4L2设备 ioctl VIDIOC_CROPCAP - 视频裁剪和缩放功能信息 ioct ...
- v4l2驱动编写篇【转】
转自:http://blog.csdn.net/michaelcao1980/article/details/53008418 大部分所需的信息都在这里.作为一个驱动作者,当挖掘头文件的时候,你可能也 ...
- V4L2视频采集原理
一.简介 Video for Linuxtwo(Video4Linux2)简称V4L2,是V4L的改进版.V4L2是linux操作系统下用于采集图片.视频和音频数据的API接口,配合适当的视频采集设备 ...
- Android-ION内存管理简介
ION内存管理简介 https://www.jianshu.com/p/4f681f6ddc3b http://kernel.meizu.com/memory%20management%20-%20i ...
随机推荐
- 潜语义分析(Latent Semantic Analysis)
LSI(Latent semantic indexing, 潜语义索引)和LSA(Latent semantic analysis,潜语义分析)这两个名字其实是一回事.我们这里称为LSA. LSA源自 ...
- Codeforces Round #226 (Div. 2)A. Bear and Raspberry
/* 贪心的找到相邻两项差的最大值,再减去c,结果若是负数答案为0. */ 1 #include <stdio.h> #define maxn 105 int num[maxn]; int ...
- HDU5418.Victor and World(状压DP)
#include <iostream> #include <cstring> #include <cstdio> #include <cmath> #i ...
- Qt 第一步,环境搭建与测试
晚上离散数学课下课后就开始安装Qt. 最先安装的是5.2版本的,这个最新的版本集成了所有必须的工具,不需要配置,直接就可以运行的. 但是,看书和社区教程以及参考资料时候,发现大多是4.8版本的.于是, ...
- linux中配置Java环境
一. 下载JDK 下载linux版本的jdk32(64) 二. 需要配置的环境变量 1. PATH环境变量.作用是指定命令搜索路径,在shell下面执行命令时,它会到PATH变量所指定的路径中查找看是 ...
- <a href> 带有cookie
<a href = <s:url action="exam/examAction_startExam.action" > <s:param name=&qu ...
- C# WPF 解压缩7zip文件 带进度条 sevenzipsharp
vs2013附件 :http://download.csdn.net/detail/u012663700/7427461 C# WPF 解压缩7zip文件 带进度条 sevenzipsharp W ...
- paip. mysql如何临时 暂时 禁用 关闭 触发器
paip. mysql如何临时 暂时 禁用 关闭 触发器 作者Attilax , EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://blog.csdn ...
- Android开发之Bitmap二次采样
Bitmap二次采样,听着好像是一个高大上的事,其实也就那么回事,今天我们就来看看Bitmap的二次采样问题. 1.为什么要二次采样 OK,那么首先我要 解决的一个问题就是为什么我们要二次采样? 不知 ...
- Android环境变量笔记
Logcat打印日志 使用方法Log.i(tag, msg);参数tag: 标签.用于识别Logcat的分类(一般可以使用类名作为标签)数msg: 打印的内容 在eclipse中打开logcat标签W ...