USB摄像头——v4l2打开设备、获取设备支持的格式【以t113-s3为例】

USB摄像头——v4l2打开设备、获取设备支持的格式
文章目录总结
一、v4l2介绍
v4l2意思为Video for,是linux中视频设备的内核驱动 。它有以下几个接口:
从它名字“Video for ”可以知道,它只能运行在Linux操作系统之上,其是针对uvc免驱动usb设备的编程框架,主要用于usb摄像头等 。
二、实验步骤 1.打开设备
打开设备代码如下(示例):
int fd = open("/dev/video0",O_RDWR);if(fd < 0){perror("打开设备失败!");return -1;}
一般来说,当第一个摄像头插入后,其在dev目录下显示的是,接着是,…以此类推 。通过ls命令查看一下其设备号:
可以看到,在我的dev目录下有两个video设备,如果你跟我一样,只插入了一个摄像头,但是却显示有两个设备,其实也是非常正常的 。
输入命令:

USB摄像头——v4l2打开设备、获取设备支持的格式【以t113-s3为例】

文章插图
v4l2-ctl --all --device=/dev/video0v4l2-ctl --all --device=/dev/video1
可以查看两个摄像头的信息:
显示的两个设备,一个是图像/视频采集,一个是采集,也就是对应的video 和,所以这两个设备中只有设备可以进行图像/视频采集 。
2.获取摄像头支持的格式
获取摄像头支持的格式代码如下(示例):
struct v4l2_fmtdesc v4fmt;v4fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;int i = 0;while(1){v4fmt.index = i++;int ret = ioctl(fd,VIDIOC_ENUM_FMT,&v4fmt);if(ret < 0){perror("获取失败");break;}printf("index=%d\n",v4fmt.index);printf("flags=%d\n",v4fmt.flags);printf("description=%s\n",v4fmt.description);unsigned char *p =(unsigned char *) &v4fmt.pixelformat;printf("pixelformat=%c%c%c%c\n",p[0],p[1],p[2],p[3]);printf("reserved=%d\n",v4fmt.reserved[0]);}
这里面用到了结构体,其描述了当前摄像头所支持的格式,其结构如下:
struct v4l2_fmtdesc{__u32 index;// 要查询的格式序号,应用程序设置enum v4l2_buf_type type;// 帧类型,应用程序设置__u32 flags;// 是否为压缩格式__u8 description[32];// 格式名称__u32 pixelformat;//所支持的格式__u32 reserved[4];// 保留};
一个摄像头不一定只有一个格式,所以通过i变量i++,在while循环中将所有格式遍历一遍,当ret 对文件进行编译:
USB摄像头——v4l2打开设备、获取设备支持的格式【以t113-s3为例】

文章插图
arm-linux-gnueabi-gcc -o camera camera.c
通过tftp将文件传输到开发板上运行(摄像头插板子上),运行查看结果:
可以看到,摄像头设备支持的格式已经显示出来 。
3.将设备关闭
【USB摄像头——v4l2打开设备、获取设备支持的格式【以t113-s3为例】】打开完设备后最忌忘记关闭设备,需要铭记于心:
关闭设备代码如下(示例):
close(fd);
总结
将代码整合起来,包括需要用到的头文件等,希望能给个点赞和收藏,关于v412的内容后续还会进行更新
完整代码如下(示例):
#include #include #include #include #include #include #include #include int main(){//打开设备int fd = open("/dev/video1",O_RDWR);if(fd < 0){perror("打开设备失败!");return -1;}//获取摄像头支持的格式 struct v4l2_fmtdesc v4fmt;v4fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;int i = 0;while(1){v4fmt.index = i++;int ret = ioctl(fd,VIDIOC_ENUM_FMT,&v4fmt);if(ret