V4L2学习笔记

1.什么是V4L2

Video for(4) Linux 2 的简称,V4L的升级版。V4L2linux操作系统下用于采集图片、视频和音频数据的API接口,配合适当的视频采集设备和相应的驱动程序,可以实现图片、视频、音频等的采集。在远程会议、可视电话、视频监控系统和嵌入式多媒体终端中都有广泛的应用。在Linux中,视频设备是设备文件,可以像访问普通文件一样对其进行读写,摄像头在/dev/videoX(X代表摄像头的序号)

 

V4L2为linux下视频设备程序提供了一套接口规范。包括一套数据结构和底层V4L2驱动接口。只能在linux下使用。它使程序有发现设备和操作设备的能力。它主要是用一系列的回调函数来实现这些功能。像设置摄像头的频率、帧频、视频压缩格式和图像参数等等。当然也可以用于其他多媒体的开发,如音频等。

  在Linux下,所有外设都被看成一种特殊的文件,成为“设备文件,可以象访问普通文件一样对其进行读写。一般来说,采用V4L2驱动的摄像头设备文是/dev/v4l/video0。为了通用,可以建立一个到/dev/video0的链接。V4L2支持两种方式来采集图像:内存映射方式(mmap)直接读取方式(read)。

V4L2在include/linux/videodev2.h文件中定义了一些重要的数据结构,在采集图像的过程中,就是通过对这些数据的操作来获得最终的图像数据。Linux系统V4L2的能力可在Linux内核编译阶段配置,默认情况下都有此开发接口。V4L2从Linux 2.5.x版本的内核中开始出现。

  V4L2规范中不仅定义了通用API元素(Common API Elements),图像的格式(Image Formats),输入/输出方法(Input/Output),还定义了Linux内核驱动处理视频信息的一系列接口(Interfaces),这些接口主要有:

  视频采集接口——Video Capture Interface;

  视频输出接口—— Video Output Interface;

  视频覆盖/预览接口——Video Overlay Interface;

  视频输出覆盖接口——Video Output Overlay Interface;

扫描二维码关注公众号,回复: 12433643 查看本文章

  编解码接口——Codec Interface。

 

V4L2的相关定义包含在头文件<linux/videodev2.h>

 

2. 使用V4L2的操作流程

工作流程:打开设备-> 检查和设置设备属性-> 设置帧格式-> 设置一种输入输出方法(缓冲区管理)-> 循环获取数据-> 关闭设备。

 

打开设备

#include <fcntl.h>

int open(const char *device_name, int flags); // flags = O_RDWR,O_RDONLY

 

#include <unistd.h>

int close(int fd);

 

例:

int fd=open(“/dev/video0”,O_RDWR); // 打开设备

close(fd); // 关闭设备

打开设备一般都是使用 open() 打开 /dev 下的 video 设备文件 ,比如说 /dev/video1, 打开之前首先要对相应的设备文件进行检查 ,比如说使用 stat() 获得文件属性,并判断是否为字符设备文件

驱动通过主设备号 81 和 0 ~ 255 之间的次设备号来注册 device note ,系统 管理 员通过设备的主次设备号在 /dev 目录下创建相应的字符设备文件。应用 程序不能通过设备的主次设备号来打开设备,而必须通过适当的 device name ,即 /dev 目录下的设备文件来打开设备。

v4l2 支持一个设备文件可以被多次打开,却只允许其中一个应用程序与设备进行数据 交换 ,其他应用程序只能用来设定一些设备参数,对设备进行一些控制。

 

1. 用非阻塞模式打开摄像头设备

  int cameraFd;

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

  2. 如果用阻塞模式打开摄像头设备,上述代码变为:

  cameraFd = open("/dev/video0", O_RDWR);

  关于阻塞模式和非阻塞模式

  应用程序能够使用阻塞模式或非阻塞模式打开视频设备,如果使用非阻塞模式调用视频设备,即使尚未捕获到信息,驱动依旧会把缓存(DQBUFF)里的东西返回给应用程序。

 

 

猜你喜欢

转载自blog.csdn.net/Challovactor/article/details/104799483