和菜鸟一起学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

(0)
CSDN's avatarCSDN
上一篇 2024年6月25日 上午3:08
下一篇 2024年6月25日 上午3:08

相关推荐

  • 如何正确使用缓存提升网站速度?

    旧:掌握缓存技巧,让你的网站速度飞起来! 在当前互联网发展迅速的时代,网站速度已经成为用户体验和SEO排名的重要因素之一。而缓存技术作为提升网站速度的关键方法之一,其正确的使用可以…

    网站运维 2024年7月19日
    0
  • sdn控制器用什么编程

    SDN控制器主要使用Java进行编程。 Java 因其跨平台功能和对丰富开发工具的支持而被广泛采用。SDN控制器的核心功能便是网络中不同设备的抽象和管理。 Java提供了高级抽象A…

    网站运维 2024年5月12日
    0
  • 数字化车辆管理系统解决方案

    车辆管理对于车多、人多、用车频率高的企业来说,实现统一的管理、调度、维护是重要的行政服务事项之一。由于车辆管理的多维度性和车辆使用的灵活性,传统的表格管理方式很

    2024年9月23日
    0
  • 喜欢编程男生礼物是什么

    编程爱好者一般喜欢的礼物包括1、技术书籍、2、高质量键盘、3、代码主题周边、4、高效能电脑配件、5、在线课程订阅、6、智能穿戴设备。对于热爱科技的男生来说,技术书籍是最受欢迎的礼物…

    网站运维 2024年5月12日
    0

发表回复

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