#include <stdio.h>
#include <string.h>
#include <errno.h> #include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h> #include <linux/videodev2.h>
//#include <linux/videodev.h>
#include <libv4l1-videodev.h> /*
0 -- 不是v4l设备
1 -- v4l 设备
2 -- v4l2 设备
*/
int test_v4l_version(int fd)
{
int ret = ;
char dummy[]; if (- != ioctl(fd,VIDIOC_QUERYCAP,dummy)) {
ret = ;
} else if (- != ioctl(fd,VIDIOCGCAP,dummy)) { ret = ;
} return ret;
} int v4l_open(char *dev, v4l_device *vd)
{
if (!dev)
dev = ”/dev/video0”;
if ((vd ->fd = open(dev, O_RDWR)) < ) {
perror("v4l_open:");
return -;
}
if (v4l_get_capability(vd))
return -;
if (v4l_get_picture(vd))
retu rn -;
return ;
} int v4l_get_capability(v4l_device *vd)
{
if (ioctl(vd ->fd, VIDIOCGCAP, &(vd->capability)) < ) {
perror("v4l_get_capability:");
return -;
}
return ;
} int main(int argc,char * argv[])
{
char dev_name[] = "/dev/video0";
int cam_fd =-; if(argc>)
{
strncpy(dev_name,argv[],sizeof(dev_name)-);
} printf("open device %s\n",dev_name);
cam_fd = open(dev_name,O_RDWR|O_NONBLOCK); if(cam_fd == -)
{
printf("open failure \n");
return -;
} switch(test_v4l_version(cam_fd))
{
case :
printf("%s:fd %d isn't v4l deivce\n",dev_name,cam_fd);
return -;
break;
case :
printf("\n### video4linux device info [%s] ###\n",dev_name);
return -;
break;
case :
printf("\n### v4l2 device info [%s] ###\n",dev_name);
break;
} close(cam_fd); return ; }
 
 
 
 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。

     

 
  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,用这个方法可以判断设备的版本.参见如下代码.
 
 

Linux 验证当前 Video0 不否是v4l设备 linux v4l 编程(1) Video 4 Linux 简介的更多相关文章

  1. 嵌入式视频采集编程思路(Video 4 Linux)-转

    转自:http://zyg0227.blog.51cto.com/1043164/271954 1.  linux 内核有video for linux简称V4L.V4L是Linux影像系统与嵌入式影 ...

  2. Video for Linux Two API Specification Revision 2.6.32【转】

    转自:https://www.linuxtv.org/downloads/legacy/video4linux/API/V4L2_API/spec-single/v4l2.html Video for ...

  3. Video for Linux Two API Specification revision0.24【转】

    转自:http://blog.csdn.net/jmq_0000/article/details/7536805#t136 Video for Linux Two API Specification ...

  4. c++ 网络编程(五) LINUX下 socket编程 多种I/O函数 -以及readv和writev函数用法

    原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/9614056.html 一.多种I/O函数 前言:之前我们讲的数据传输一般Linux上用writ ...

  5. Linux(3)- 用户管理、文件与目录权限、常用命令、Linux软件包管理

    一.用户管理 现代操作系统一般属于多用户的操作系统,也就是说,同一台机器可以为多个用户建立账户,一般这些用户都是为普通用户,这些普通用户能同时登录这台计算机,计算机对这些用户分配一定的资源. 普通用户 ...

  6. [转]一个简单的Linux多线程例子 带你洞悉互斥量 信号量 条件变量编程

    一个简单的Linux多线程例子 带你洞悉互斥量 信号量 条件变量编程 希望此文能给初学多线程编程的朋友带来帮助,也希望牛人多多指出错误. 另外感谢以下链接的作者给予,给我的学习带来了很大帮助 http ...

  7. linux下如何优雅的挂载一个外界设备(比如优盘)

    最近从事linux,实验室一个破服务器,能连上网,但是输入这样的命令:        yum -y install gcc yum -y install gcc-c++ ,居然说是没有这样的镜像,也罢 ...

  8. 转:socket编程在windows和linux下的区别

    如无其它说明,本文所指Linux均表示2.6内核Linux,GCC编译器,Windows均表示Windows XP系统,Visual Studio 2005 sp1编译环境. 下面大概分几个方面进行罗 ...

  9. 学习笔记之Linux Shell脚本教程:30分钟玩转Shell脚本编程

    Linux Shell脚本教程:30分钟玩转Shell脚本编程 http://c.biancheng.net/cpp/shell/

随机推荐

  1. 详解Linux磁盘管理与文件系统

    磁盘基础 硬盘结构 物理结构 盘片:硬盘有多个盘片,每盘片 2 面. 磁头:每面一个磁头. 数据结构 扇区:磁盘上的每个磁道被等分为若干个弧段,这些弧段便是硬盘的扇区. 硬盘的第一个扇区,叫做引导扇区 ...

  2. Spring Boot 2发送邮件手把手图文教程

    原文:http://www.itmuch.com/spring-boot/send-email/ 本文基于:Spring Boot 2.1.3,理论支持Spring Boot 2.x所有版本. 最近有 ...

  3. PAT基础级-钻石段位样卷2-7-7 危险品装箱 (25 分)

    集装箱运输货物时,我们必须特别小心,不能把不相容的货物装在一只箱子里.比如氧化剂绝对不能跟易燃液体同箱,否则很容易造成爆炸. 本题给定一张不相容物品的清单,需要你检查每一张集装箱货品清单,判断它们是否 ...

  4. Luogu P1290 欧几里得的游戏/UVA10368 Euclid's Game

    Luogu P1290 欧几里得的游戏/UVA10368 Euclid's Game 对于博弈论的题目没接触过多少,而这道又是比较经典的SG博弈,所以就只能自己来推关系-- 假设我们有两个数$m,n$ ...

  5. 改进Bert----spanBERT

    SpanBert:对 Bert 预训练的一次深度探索 SpanBERT: Improving Pre-training by Representing and Predicting Spans 解读S ...

  6. RxJava 以及 Android 中的通用线程解决方案、并发与线程安全

    关于RxJava如今是熟到发紫了,所以对于它底层的动作机制的了解是迫在眉睫了,费话不多说,直接开始. 这里还是以之前获取个人github仓库列表为例,用retrofit+rxjava,也是实际项目中用 ...

  7. AJAX学习笔记——jQuery中的AJAX

    用jQuery实现Ajax jQuery.ajax([settings]) 1.type:类型, "POST"或"GET" ,默认为"GET" ...

  8. 10 loader - 配置处理less文件的loader

    第一步:装包 cnpm i less-loader -D 安装完提示警告 peerDependencies WARNING less-loader@* requires a peer of less@ ...

  9. python xlwt 设置单元格样式

    使用xlwt中的Alignment来设置单元格的对齐方式,其中horz代表水平对齐方式,vert代表垂直对齐方式. VERT_TOP = 0x00 上端对齐 VERT_CENTER = 0x01 居中 ...

  10. LeetCode 294. Flip Game II

    原题链接在这里:https://leetcode.com/problems/flip-game-ii/ 题目: You are playing the following Flip Game with ...