和菜鸟一起学linux之V4L2摄像头应用流程,linux 摄像头监控软件

和菜鸟一起学linux之V4L2摄像头应用流程V4L2 编程
定义
V4L2(Video ForLinux Two) 是内核提供给应用程序访问音、视频驱动的统一接口。 工作流程:
打开设备-> 检查和设置设

V4L2编程

意义

V4L2(Video ForLinux Two)是内核为应用程序访问音视频驱动程序提供的统一接口。

工作流程:

打开设备- 检查并设置设备属性- 设置帧格式- 设置输入/输出方式(缓冲区管理) – 循环检索数据- 关闭设备。

打开和关闭设备电源:

#includefcntl.h

int open(constchar *device_name, int flags);

#include unistd.h

int 关闭(intfd);

例子:

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

close(fd);//关闭设备

注:V4L2的相关定义包含在头文件linux/videodev2.h中。

查询设备属性:VIDIOC_QUERYCAP

相关功能:

int ioctl(intfd, int request, struct v4l2_capability *argp);

相关结构:

structv4l2_能力

{

__u8 driver[16]; //驱动程序名称

__u8 卡[32]; //设备名称

__u8bus_info[32]; //设备在系统中的位置

__u32 version //驱动版本号

__u32capability; //设备支持的操作

__u32reserved[4]; //保留字段

};

函数常用值:

V4L2_CAP_VIDEO_CAPTURE //是否支持图像采集

示例:显示设备信息

structv4l2_能力上限;

ioctl(fd,VIDIOC_QUERYCAP,上限);

printf(\”驱动名称:%s/n卡名称:%s/n总线信息:%s/n驱动版本:%u.%u.%u/n\”,cap.driver,cap.card,cap.bus_info ,(cap .version16)0XFF,( cap.version8)0XFF,cap.versionOXFF);

帧格式:

VIDIOC_ENUM_FMT //显示所有支持的格式

int ioctl(intfd, int request, struct v4l2_fmtdesc *argp);

structv4l2_fmtdesc

{

__u32 index; //要查询的序列号,应用设置

enumv4l2_buf_type type; //帧类型,应用程序设置;

__u32 flags; //是否压缩格式

__u8描述[32]; //格式名称

__u32pixelformat; //格式

__u32reserved[4]; //保留

};

示例:显示所有支持的格式

structv4l2_fmtdesc fmtdesc;

fmtdesc.index=0;

fmtdesc.type=V4L2_BUF_TYPE_VIDEO_CAPTURE;

printf(\’Supportformat:/n\’);

while(ioctl(fd,VIDIOC_ENUM_FMT,fmtdesc)!=-1)

{

printf(\’/t%d.%s/n\’,fmtdesc.index+1,fmtdesc.description);

fmtdesc.index++;

}

//显示或设置当前格式

VIDIOC_G_FMT、VIDIOC_S_FMT

//检查是否支持特定格式

VIDIOC_TRY_FMT

int ioctl(intfd, int request, struct v4l2_format *argp);

structv4l2_format

{

enumv4l2_buf_type type; //帧类型,应用程序设置;

联合FMT

{

structv4l2_pix_format pix; //视频设备使用状态

structv4l2_window 赢;

structv4l2_vbi_format vbi;

structv4l2_sliced_vbi_format 切片。

__u8raw_data[200];

};

};

structv4l2_pix_format

{

__u32 width; //帧宽度,单位像素

__u32 height; //帧高度,单位像素

__u32pixelformat; //帧格式

枚举v4l2_fieldfield;

每行__u32byte;

__u32 尺寸的图像;

enumv4l2_colorspace 色彩空间;

__u32 私人;

};

示例:显示当前帧的相关信息

structv4l2_format fmt;

fmt.type=V4L2_BUF_TYPE_VIDEO_CAPTURE;

ioctl(fd,VIDIOC_G_FMT,fmt);

printf(“当前数据格式信息:

/n/twidth:%d/n/theight:%d/n”,fmt.fmt.宽度,fmt.fmt.高度);

structv4l2_fmtdesc fmtdesc;

fmtdesc.index=0;

fmtdesc.type=V4L2_BUF_TYPE_VIDEO_CAPTURE;

while(ioctl(fd,VIDIOC_ENUM_FMT,fmtdesc)!=-1)

{

if(fmtdesc.pixelformat fmt.fmt.pixelformat)

{

printf(“/tformat:%s/n”,fmtdesc.description);

休息;

}

fmtdesc.index++;

}

示例:检查是否支持特定帧格式

structv4l2_format fmt;

fmt.type=V4L2_BUF_TYPE_VIDEO_CAPTURE;

fmt.fmt.pix.pixelformat=V4L2_PIX_FMT_RGB32;

if(ioctl(fd,VIDIOC_TRY_FMT,fmt)==-1)

if(错误号==EINVAL)

printf(“不支持RGB32格式!/n”);

图像缩放

VIDIOC_CROPCAP

int ioctl(int fd,int request, struct v4l2_cropcap *argp);

structv4l2_cropcap

{

enumv4l2_buf_type 类型; //应用程序设置;

struct v4l2_rectbounds; //最大边界

struct v4l2_rectdefrect;//默认值

structv4l2_fract 像素方面;

};

//设置缩放比例

VIDIOC_G_CROP、VIDIOC_S_CROP

int ioctl(intfd, int request, struct v4l2_crop *argp);

int ioctl(intfd, int request, const struct v4l2_crop *argp);

结构v4l2_crop

{

enumv4l2_buf_type 类型; //应用程序设置;

结构体v4l2_rectc;

}

为了应用和管理缓冲区,应用程序和设备具有三种数据交换方法:直接读/写、内存映射和用户指针。这里只讨论内存映射。

//向设备请求缓冲区

VIDIOC_REQBUFS

int ioctl(intfd, int request, struct v4l2_requestbuffers *argp);

structv4l2_requestbuffers

{

__u32 count; //缓冲区中的缓冲区帧数

enumv4l2_buf_type type; //缓冲区帧数据格式;

enum v4l2_memorymemory; //区别在于内存映射或用户指针模式。

__u32 保留[2];

};

枚举v4l2_memoy{V4L2_MEMORY_MMAP,V4L2_MEMORY_USERPTR};

//计数、类型和内存必须由应用程序设置

示例:应用具有4 个缓冲帧的缓冲区

structv4l2_requestbuffers 请求;

请求数=4;

req.type=V4L2_BUF_TYPE_VIDEO_CAPTURE;

req.memory=V4L2_MEMORY_MMAP;

ioctl(fd,VIDIOC_REQBUFS,请求);

获取缓冲帧的地址和长度。

VIDIOC_QUERYBUF

int ioctl(intfd, int request, struct v4l2_buffer *argp);

结构体v4l2_buffer

{

__u32 index //缓冲区序列号;

enumv4l2_buf_type 类型; //缓冲区类型;

__u32 byteused; //缓冲区使用的字节数

__u32 flag; //区分MMAP 和USERPTR。

枚举v4l2_fieldfield;

struct timevaltimestamp; //获取检索第一个字节时的系统时间。

structv4l2_timecode 时间码;

__u32 sequence;//队列中的序号

enum v4l2_memorymemory;//IO模式,由应用程序设置

联合米

{

__u32 offset; //缓冲区帧地址,仅对MMAP有效

无符号长用户指针;

};

__u32 length;//缓冲帧长度

__u32 输入;

__u32 保留。

};

MMAP 定义了用于映射每个缓冲帧的结构。

结构缓冲区

{

无效*开始;

无符号整数;

}*缓冲;

我们专门整理了上百道【运维技术栈面试题】,成为您运维面试路上的好助手。这样,你就可以毫无惊慌地参加面试并获得高薪offer。

这些面试题涵盖了从Shell、MySQL到K8s等云原生技术栈,适合运维行业新人以及运维行业新人的面试需求。升职或换工作以增加薪水。

本次访谈集内容为

174 运维工程师面试题128 k8s 面试题108 shell 脚本面试题200 Linux 面试题51 Docker 面试题35 Jenkis 面试题78 MongoDB 面试题17 ansible 面试题60 dubbo 面试题53 Kafka 面试题18 mysql 面试题40 nginx面试题题77 redis面试题Zookeeper题28

总共1000多道面试题,内容全面且有价值。

174道运维工程师面试题

1.什么是运维?

2、运维人员在工作场所经常需要与操作人员进行交互。运营人员做什么工作?

3. 您目前有300台服务器,您如何管理它们?

4. 简要说明RAID0和Raid1raid5这两种工作模式的工作原理和特点。

5、LVS、Nginx、HAproxy有什么区别?

6. Squid、Varinsh、Nginx 有什么区别,你在工作中如何选择?

7.Tomcat和Resin有什么区别?

8.什么是中间件?

9、Tomcat中的8005、8009、8080这三个端口是什么意思?

10.什么是CDN?

11.什么是网站灰度发布?

12、请简单说明一下DNS域名解析的过程。

13.什么是RabbitMQ?

14.Keepalived如何工作?

15.描述LVS工作流程的三种模式。

16、mysql的innodb如何识别锁定问题以及mysql如何减少主从复制延迟?

运维人员经常需要与运维人员进行交互。运营人员做什么的?

3. 您目前有300台服务器,您如何管理它们?

4. 简要说明RAID0和Raid1raid5这两种工作模式的工作原理和特点。

5、LVS、Nginx、HAproxy有什么区别?

6. Squid、Varinsh、Nginx 有什么区别,你在工作中如何选择?

7.Tomcat和Resin有什么区别?

8.什么是中间件?

9、Tomcat中的8005、8009、8080这三个端口是什么意思?

10.什么是CDN?

11.什么是网站灰度发布?

12、请简单说明一下DNS域名解析的过程。

13.什么是RabbitMQ?

14.Keepalived如何工作?

15.描述LVS工作流程的三种模式。

16、mysql的innodb如何识别锁定问题以及mysql如何减少主从复制延迟?

17.如何重置mysql root密码?

#和新人一起学Linux 以上V4L2摄像头应用流程相关内容摘自网络,供大家参考。相关信息请参见官方公告。

原创文章,作者:CSDN,如若转载,请注明出处:https://www.sudun.com/ask/92139.html

Like (0)
CSDN的头像CSDN
Previous 2024年6月25日
Next 2024年6月25日

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注