V4L是 Video for Linux的缩写,它是Linux 内核中关于视频设备的子系统,它为linux 下的视频驱动提供了统一的接口,使得应用程序可以使用统一的API 函数操作不同的视频设备,极大地简化了视频系统的开发和维护。

由于早期的 V4L 有很多缺陷,Bill Dirks 等人对其进行了重新设计,并取名为Video for Linux 2(V4L2使用),最早出现于Linux2.5.x 版本。V4L2 相比于V4L 有更好的扩展性和灵活性,并且支持的硬件设备更多。
因此在应用程序V4L编程实际是指v4l2,我们这个系列的以V4L2为主,但由于历史的原因,V4L2一般兼容V4L.所以很多程序可以用V4L接口.

1.V4L支持设备

V4L2(video for linux) 可以支持多种设备,它可以有以下几种接口:
1. 视频采集接口(video capture interface):这种应用的设备可以是高频头或者摄像头.V4L2的最初设计就是应用于这种功能的.下面也是着重讲解这种应用.
2. 视频输出接口(video output interface):可以驱动计算机的外围视频图像设备--像可以输出电视信号格式的设备.
3. 直接传输视频接口(video overlay interface):它的主要工作是把从视频采集设备采集过来的信号直接输出到输出设备之上,而不用经过系统的CPU.
4. 视频间隔消隐信号接口(VBI interface):它可以使应用可以访问传输消隐期的视频信号.
5. 收音机接口(radio interface):可用来处理从AM或FM高频头设备接收来的音频流.

2.V4L处理基本流程

跟一般设备处理一样,大体上V4L处理有四个流程.
2.1 打开V4L设备结点
一般V4L设备结点名是 /dev/videoN.如第一个V4L设备是/dev/video0.
int fd = open("/dev/video0",O_RDWR |O_NONBLOCK);
2.2配置设备/查询设备属性
主要通过ioctl来操作,象V4L2 常见的的命令有
格式
int ioctl (int __fd, unsigned long int __request, .../*args*/) ;
__request是V4L2一些ioctl命令,常见如下.
  1. VIDIOC_REQBUFS:分配内存
  2. VIDIOC_QUERYBUF:把VIDIOC_REQBUFS中分配的数据缓存转换成物理地址
  3. VIDIOC_QUERYCAP:查询驱动功能
  4. VIDIOC_ENUM_FMT:获取当前驱动支持的视频格式
  5. VIDIOC_S_FMT:设置当前驱动的频捕获格式
  6. VIDIOC_G_FMT:读取当前驱动的频捕获格式
  7. VIDIOC_TRY_FMT:验证当前驱动的显示格式
  8. VIDIOC_CROPCAP:查询驱动的修剪能力
  9. VIDIOC_S_CROP:设置视频信号的边框
  10. VIDIOC_G_CROP:读取视频信号的边框
  11. VIDIOC_QBUF:把数据从缓存中读取出来
  12. VIDIOC_DQBUF:把数据放回缓存队列
  13. VIDIOC_STREAMON:开始视频显示函数
  14. VIDIOC_STREAMOFF:结束视频显示函数
  15. VIDIOC_QUERYSTD:检查当前视频设备支持的标准,例如PAL或NTSC。
完整的IOCTL命令参见http://v4l2spec.bytesex.org/spec/r7624.htm
2.3 处理V4L视频数据
在V4L设备中,有的设备从硬件取出,送到应用程序处理,比如摄像头硬件取得视频数据后,通过V4L接口把视频数据发送应用程序, 比如显示屏幕或保存成为文件.
有的设备是从应用发往硬件处理,如电视接口.
在V4L接口,设定了三种应用程序与驱动的交互方式,分别是
直接读取设备文件方式(read/write)、用户指针方式(userptr)以及mmap 映射方式。
1)mmap方式,驱动将内部数据空间映射到应用程序空间上,双方直接在这个空间进行数据交换,是效果最高的方法,这也是最常用的方式之一
2)

直接读取设备文件方式 直接调用 read()、write()函数进行数据的读入和输出,该方法一般配合select()使用。

3)用户指针方式 首先由应用程序申请一段缓冲区,然后将缓冲区传给驱动,驱动将其作为缓冲区,从而实现了内存共享。这一方法用的较少.
2.4 关闭设备
调用close();如果是内存映射方式,在关闭前还需要调用munmap解除映射.

3.V4L两个版本区别
1.头文件不一样 V4L使用#include <linux/videodevice.h>
V4L2使用 #include <linux/videodevice2.h>
2.IOCTL命令编号 ,V4L使用 VIDIOCXXXX的形式,而V4L2使用VIDIOC_XXXX 或 VIDIOC_G_XXXX形式.
如V4L中取设备属性命令是VIDIOCGCAP,而V4L2对应的是VIDIOC_QUERYCAP.
3.两者数据结构不一样,V4L以Video_为前缀,而V4L以v4l2_为前缀.如设备属性
V4l1--> struct video_capability video_cap
V4l2-->struct v4l2_capability
4.检测V4L设备版本
在V4L2中,规定必须实现 VIDIOC_QUERYCAP命令,而V4L1,规定必须实现VIDIOCGCAP,用这个方法可以判断设备的版本.参见如下代码.
 
[html] view plain copy
  1. /*
  2. * Author: Andrew Huang <bluedrum@163.com>
  3. * detectd v4l2 device version
  4. *
  5. */
  6. #include <stdio.h>
  7. #include <string.h>
  8. #include <errno.h>
  9. #include <sys/types.h>
  10. #include <sys/stat.h>
  11. #include <sys/ioctl.h>
  12. #include <fcntl.h>
  13. #include <linux/videodev2.h>
  14. #include <linux/videodev.h>
  15. /*
  16. 0    -- 不是v4l设备
  17. 1 -- v4l 设备
  18. 2 -- v4l2 设备
  19. */
  20. int test_v4l_version(int fd)
  21. {
  22. int ret = 0;
  23. char dummy[256];
  24. if (-1 != ioctl(fd,VIDIOC_QUERYCAP,dummy)) {
  25. ret = 2;
  26. }
  27. else if (-1 != ioctl(fd,VIDIOCGCAP,dummy)) {
  28. ret = 1;
  29. }
  30. return ret;
  31. }
  32. int main(int argc,char * argv[])
  33. {
  34. char dev_name[64] = "/dev/video2";
  35. int cam_fd =-1;
  36. if(argc>1)
  37. {
  38. strncpy(dev_name,argv[1],sizeof(dev_name)-1);
  39. }
  40. printf("open device %s\n",dev_name);
  41. cam_fd = open(dev_name,O_RDWR|O_NONBLOCK);
  42. if(cam_fd == -1)
  43. {
  44. printf("open failure \n");
  45. return -1;
  46. }
  47. switch(test_v4l_version(cam_fd))
  48. {
  49. case 0:
  50. printf("%s:fd %d isn't v4l deivce\n",dev_name,cam_fd);
  51. return -1;
  52. break;
  53. case 1:
  54. printf("\n### video4linux device info [%s] ###\n",dev_name);
  55. return -2;
  56. break;
  57. case 2:
  58. printf("\n### v4l2 device info [%s] ###\n",dev_name);
  59. break;
  60. }
  61. close(cam_fd);
  62. return 0;
  63. }

作者:Andrew Huang bluedrum@163.com

转自:http://blog.chinaunix.net/uid-20587912-id-405264.html
PS:
错误:expected expression before ‘struct’
解决:#include<sys/ioctl.h>

V4L 简介及其与V4L2区别相关推荐

  1. Database:Database数据库的简介、类型及其区别(关系数据库VS非关系型数据库)、案例应用之详细攻略

    Database:Database数据库的简介.类型及其区别(关系数据库VS非关系型数据库).案例应用之详细攻略 目录 Database数据库的简介 1.掌握数据库的方法-学会sql语言进而学会增.删 ...

  2. Redis简介 与Memcache的区别

    redis 是一个基于内存的高性能key-value数据库. Reids的特点 Redis本质上是一个Key-Value类型的内存数据库,很像memcached,整个数据库统统加载在内存当中进行操作, ...

  3. 【Linux】Linux简介以及 与UNIX区别

    一直以来对Linux.Unix.linux内核.linux发行版的概念比较模糊,最近查找资料并经过自己的整理,主要总结了Linux和UNIX的区别和联系.内核和操作系统的关系.Linux操作系统和结构 ...

  4. Maven和Ant简介以及两者的区别

    原文地址:http://blog.csdn.net/yangkai_hudong/article/details/12554983 一.Maven简介 Maven是基于项目对象模型(POM),可以通过 ...

  5. linux v4l2 示例程序,Linux关于Camera使用V4L2

    简介 Video for Linux two(Video4Linux2)简称V4L2,是V4L的改进版.V4L2是linux操作系统下用于采集图片.视频和音频数据的API接口. 工作流程 打开设备-& ...

  6. Linux应用开发【第七章】摄像头V4L2编程应用开发

    文章目录 7 摄像头V4L2编程应用开发 7.1 V4L2简介 7.2 V4L2视频采集原理 7.3 V4L2程序实现流程 7.4 V4L2程序实例 7.4.1 打开设备 7.4.2 查询设备属性 7 ...

  7. linux_驱动_V4l2层_camera_应用层调用流程_MIPI协议包格式简介

    一. 摄像头基础介绍 1.摄像头结构和工作原理. 拍摄景物通过镜头,将生成的光学图像投射到传感器上,然后光学图像被转换成电信号,电信号再经过模数转换变为数字信号,数字信号经过DSP加工处理,再被送到电 ...

  8. Linux的视频编程(V4L2编程)【转】

    本文转载自:http://blog.csdn.net/tommy_wxie/article/details/11472073 一.什么是video4linux Video4linux2(简称V4L2) ...

  9. linux之V4L2摄像头应用流程

    对于v4l2,上次是在调试收音机驱动的时候用过,其他也就只是用i2c配置一些寄存器就可以了.那时只是粗粗的了解了,把收音机当作v4l2的设备后会在/dev目录下生成一个radio的节点.然后就可以操作 ...

最新文章

  1. python脚本获取内网,公网ip
  2. MySQL 联合查询实质_1.多表查询 = 转化为一张联合大表 2.可视化工具 3.pymysql模块...
  3. Windows 下用VS2012(Visual Studio 2012)编译librtmp
  4. java字数统计,求大神教我,java语言里的字数统计功能的代码?
  5. boost::spirit模块实现一个类似于 XML 的小型解析器,Karma 用于打印生成的 AST
  6. uva 10037——Bridge
  7. Tensorflow学习—— 预创建的 Estimator
  8. 2021-2025年中国云计算数据中心IT资产处置(ITAD)行业市场供需与战略研究报告
  9. JDK 15 正式发布,划时代的 ZGC 同时宣布转正!
  10. IDEA解决Tomcat乱码问题
  11. 互联网日报 | 美团外卖日订单量突破4000万个;《王者荣耀》动画番剧启动;360金融更名为360数科...
  12. Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletCont
  13. 计算机模拟病例考试试题,计算机模拟病例考试的效标—关联效度研究
  14. 360监测显示:cookie没有httponly标志解决方法
  15. Jerry Wang的英语学习笔记
  16. 原生JS实现各种运动之匀速运动
  17. (转)大数据量分页存储过程效率测试附代码
  18. 【机器学习课程】第一章机器学习概述 2.机器学习
  19. 如何在交通事故中保障自己的安全
  20. SQL语言的基础操作(二)

热门文章

  1. 多进程,多线程 的使用
  2. Bloodhound:成功人士的会议/活动管理工具
  3. 【bzoj2000】[Hnoi2010]stone 取石头游戏
  4. 国辰防爆巡检机器人精彩亮相炼油与石化论坛,乘势而上,蓄力勃发
  5. 1.关于mustache
  6. 手写Mustache
  7. 浅析NLP中的Attention技术
  8. 网警支队RFID机房资产管理系统解决方案-新导智能
  9. 【Python用QQ邮箱发邮件】
  10. SAP adobe form step by step 视频学习教程