当前位置: 首页 > article >正文

V4L2总结(1)- 编程使用总结

V4L2 编程使用总结说明 V4L2(Video For Linux Two) 是内核提供给应用程序访问音、视频驱动的统一接口。流程 内存映射方式打开设备文件。 int fdopen(”/dev/video0″,O_RDWR);取得设备的capability看看设备具有什么功能比如是否具有视频输入,或者音频输入输出等。VIDIOC_QUERYCAP,struct v4l2_capability设置视频的制式和帧格式制式包括PALNTSC帧的格式个包括宽度和高度等。 VIDIOC_S_STD,VIDIOC_S_FMT,struct v4l2_std_id,struct v4l2_format向驱动申请帧缓冲一般不超过5个。struct v4l2_requestbuffers将申请到的帧缓冲映射到用户空间这样就可以直接操作采集到的帧了而不必去复制。mmap将申请到的帧缓冲全部入队列以便存放采集到的数据.VIDIOC_QBUF,struct v4l2_buffer开始视频的采集。VIDIOC_STREAMON出队列以取得已采集数据的帧缓冲取得原始采集数据。VIDIOC_DQBUF将缓冲重新入队列尾,这样可以循环采集。VIDIOC_QBUF停止视频的采集。VIDIOC_STREAMOFF关闭视频设备。close(fd);关于视频采集方式操作系统一般把系统使用的内存划分成用户空间和内核空间分别由应用程序管理和操作系统管理。应用程序可以直接访问内存的地址而内核空间存放的是供内核访问的代码和数据用户不能直接访问。v4l2捕获的数据最初是存放在内核空间的这意味着用户不能直接访问该段内存必须通过某些手段来转换地址。一共有三种视频采集方式使用read、write方式内存映射方式和用户指针模式。read、write方式:在用户空间和内核空间不断拷贝数据占用了大量用户内存空间效率不高。内存映射方式把设备里的内存映射到应用程序中的内存控件直接处理设备内存这是一种有效的方式。本文就是。首先让驱动申请一个缓存空间使用命令然后获取缓存空间的地址之后再将这个缓存转换到用户按空间的地址和长度记录在用户空间直接读取即可用户指针模式内存片段由应用程序自己分配。这点需要在v4l2_requestbuffers里将memory字段设置成V4L2_MEMORY_USERPTR。处理采集数据V4L2有一个数据缓存存放req.count数量的缓存数据。数据缓存采用FIFO的方式当应用程序调用缓存数据时缓存队列将最先采集到的 视频数据缓存送出并重新采集一张视频数据。这个过程需要用到两个ioctl命令,VIDIOC_DQBUF和VIDIOC_QBUFstructv4l2_buffer buf; memset(buf,0,sizeof(buf)); buf.typeV4L2_BUF_TYPE_VIDEO_CAPTURE; buf.memoryV4L2_MEMORY_MMAP; buf.index0;读取缓存if(ioctl(cameraFd, VIDIOC_DQBUF, buf) -1) { return-1; }重新放入缓存队列if(ioctl(cameraFd, VIDIOC_QBUF, buf) -1) { return-1; }还需要使用munmap方法。//作者zzhere2007 //时间2013.08.27 /************************************************ **设备的打开和关闭 *************************************************/ #include fcntl.h int open(const char *device_name, int flags); #include unistd.h int close(int fd); //例 int fdopen(“/dev/video0”,O_RDWR);// 打开设备 close(fd);// 关闭设备 /****************** **查询设备属性 VIDIOC_QUERYCAP 查询设备属性命令 *******************/ struct v4l2_capability { __u8 driver[16]; // 驱动名字 __u8 card[32]; // 设备名字 __u8 bus_info[32]; // 设备在系统中的位置 __u32 version; // 驱动版本号 __u32 capabilities; // 设备支持的操作 //常用值: V4L2_CAP_VIDEO_CAPTURE // 是否支持图像获取 __u32 reserved[4]; // 保留字段 }; int ioctl(int fd, int request, struct v4l2_capability *argp); //例获取并显示设备信息 struct v4l2_capability cap; ioctl(fd,VIDIOC_QUERYCAP,cap); printf(“Driver Name:%s/nCard Name:%s/nBus info:%s/nDriver Version:%u.%u.%u/n”, cap.driver,cap.card,cap.bus_info,(cap.version16)0XFF, (cap.version8)0XFF,cap.versionOXFF); /*************************************************************************************** **查询或设置帧格式 ** VIDIOC_ENUM_FMT获取当前驱动支持的视频格式命令 ** VIDIOC_G_FMT 读取当前驱动的频捕获格式命令 ** VIDIOC_S_FMT 设置当前驱动的频捕获格式命令 ***************************************************************************************/ // 显示所有支持的格式 struct v4l2_fmtdesc { __u32 index; // 要查询的格式序号应用程序设置 enum v4l2_buf_type type; // 帧类型应用程序设置 __u32 flags; // 是否为压缩格式 __u8 description[32]; // 格式名称 __u32 pixelformat; // 格式 __u32 reserved[4]; // 保留 }; int ioctl(int fd, int request, struct v4l2_fmtdesc *argp); //例 struct v4l2_fmtdesc fmtdesc; fmtdesc.index0; fmtdesc.typeV4L2_BUF_TYPE_VIDEO_CAPTURE; printf(Support format:/n); while(ioctl(fd,VIDIOC_ENUM_FMT,fmtdesc)!-1) { printf(/t%d.%s/n,fmtdesc.index1,fmtdesc.description); fmtdesc.index; } /********************************************************************** ** 查看或设置当前帧格式 ** VIDIOC_G_FMT, VIDIOC_S_FMT ** 检查是否支持某种格式 ** VIDIOC_TRY_FMT ************************************************************************/ struct v4l2_format { enum v4l2_buf_type type; // 帧类型应用程序设置 //数据流类型必须永远是//V4L2_BUF_TYPE_VIDEO_CAPTURE 摄像头视频捕捉设备 union fmt { struct v4l2_pix_format pix;// 视频设备使用见下面定义 struct v4l2_window win; struct v4l2_vbi_format vbi; struct v4l2_sliced_vbi_format sliced; __u8 raw_data[200]; }; }; struct v4l2_pix_format { __u32 width; // 帧宽单位像素 __u32 height; // 帧高单位像素 __u32 pixelformat; // 帧格式 V4L2_PIX_FMT_MJPEG enum v4l2_field field; __u32 bytesperline; __u32 sizeimage; enum v4l2_colorspace colorspace; __u32 priv; }; int ioctl(int fd, int request, struct v4l2_format *argp); //例显示当前帧的相关信息 struct v4l2_format fmt; fmt.typeV4L2_BUF_TYPE_VIDEO_CAPTURE; ioctl(fd,VIDIOC_G_FMT,fmt); printf(“Current data format information:/n/twidth:%d/n/theight:%d/n”,fmt.fmt.width,fmt.fmt.height); //例检查是否支持某种帧格式 struct v4l2_format fmt; fmt.typeV4L2_BUF_TYPE_VIDEO_CAPTURE; fmt.fmt.pix.pixelformatV4L2_PIX_FMT_RGB32; if(ioctl(fd,VIDIOC_TRY_FMT,fmt)-1) if(errnoEINVAL) printf(“not support format RGB32!/n”); /**************************************************************************************** ** 为视频捕获分配内存VIDIOC_REQBUFS ****************************************************************************************/ struct v4l2_request buffers { __u32 count; //缓存数量也就是说在缓存队列里保持多少张照片 enum v4l2_buf_type type; //数据流类型必须永远是V4L2_BUF_TYPE_VIDEO_CAPTURE enum v4l2_memory memory; // V4L2_MEMORY_MMAP或 V4L2_MEMORY_USERPTR __u32 reserved[2]; }; //例为视频捕获分配内存 structv4l2_requestbuffers req; if(ioctl(fd, VIDIOC_REQBUFS, req) -1) { return-1; } //获取并记录缓存的物理空间 //使用VIDIOC_REQBUFS我们获取了req.count个缓存下一步通过调用VIDIOC_QUERYBUF命令来获取这些缓存的地址 //然后使用mmap函数转换成应用程序中的绝对地址最后把这段缓存放入缓存队列 /**************************************************************************************************************** ** 使用mmap函数转换成应用程序中的绝对地址视频数据 *** 获取分配的内存的地址命令VIDIOC_QUERYBUF *****************************************************************************************************************/ typedef struct VideoBuffer { void*start; size_t length; } VideoBuffer; VideoBuffer* buffers calloc( req.count, sizeof(*buffers) ); //1、定义用户的缓存空间 structv 4l2_buffer buf; //2、定义问询的数据格式 for(numBufs 0; numBufs req.count; numBufs) { memset( buf, 0, sizeof(buf) ); buf.type V4L2_BUF_TYPE_VIDEO_CAPTURE; buf.memory V4L2_MEMORY_MMAP; buf.index numBufs; //3、填充问询数据 //读取缓存 if(ioctl(fd, VIDIOC_QUERYBUF, buf) -1) //4、获取分配的内存的地址 { return-1; } buffers[numBufs].length buf.length; //5、将驱动的数据内存地址和长度转换到用户空间 buffers[numBufs].start mmap(NULL, buf.length,PROT_READ| PROT_WRITE,MAP_SHARED,fd, buf.m.offset);//转换成相对地址 /********************************************************************************** void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset); //addr 映射起始地址一般为NULL 让内核自动选择 //length 被映射内存块的长度 //prot 标志映射后能否被读写其值为PROT_EXEC,PROT_READ,PROT_WRITE, PROT_NONE //flags 确定此内存映射能否被其他进程共享MAP_SHARED,MAP_PRIVATE //fd,offset, 确定被映射的内存地址 ***********************************************************************************/ if(buffers[numBufs].start MAP_FAILED) { return-1; } //放入缓存队列 if(ioctl(fd, VIDIOC_QBUF, buf) -1) { return-1; } //6、读取一帧放入缓冲队列 } /**************************************************************************************************************************** ** 启动或停止数据流 ** 命令VIDIOC_STREAMON, VIDIOC_STREAMOFF *****************************************************************************************************************************/ int ioctl(int fd, int request, const int *argp); //例 enum v4l2_buf_type type; type V4L2_BUF_TYPE_VIDEO_CAPTURE; ioctl (fd, VIDIOC_STREAMON, type);

相关文章:

V4L2总结(1)- 编程使用总结

V4L2 编程使用总结说明: V4L2(Video For Linux Two) 是内核提供给应用程序访问音、视频驱动的统一接口。 流程: 内存映射方式打开设备文件。 int fdopen(”/dev/video0″,O_RDWR);取得设备的capability,看看设备具有什么功能&#xff0c…...

.NET Core后端调用Qwen3-ASR-0.6B API实现会议语音转写系统

.NET Core后端调用Qwen3-ASR-0.6B API实现会议语音转写系统 1. 引言 想象一下,每次开完会,你是不是都得花上半小时甚至更久,去整理那些零零散散的会议记录?特别是那种多人参与的讨论会,谁说了什么,观点是…...

OpenClaw飞书机器人进阶:Qwen3-VL:30B多模态技能开发指南

OpenClaw飞书机器人进阶:Qwen3-VL:30B多模态技能开发指南 1. 为什么需要多模态飞书机器人? 去年冬天,我负责团队的知识库整理工作时,每天要处理上百张会议白板照片和截图。手动转录这些内容不仅耗时,还经常遗漏关键信…...

纯文本微调骗了我们多久?信息论视角揭开图大模型的对齐伪像与破局之道

在当前将大语言模型引入图学习领域的浪潮中,图符号化大语言模型 是目前的主流范式。它们的标准做法是将复杂的图结构和节点文本属性编码成一个图标记序列,将其作为前缀输入基座大模型,最后利用基于文本的节点分类等指令进行自回归微调。然而&…...

终极SQL实战训练:如何通过谋杀谜案游戏高效掌握数据库查询技能

终极SQL实战训练:如何通过谋杀谜案游戏高效掌握数据库查询技能 【免费下载链接】sql-mysteries Inspired by veltmans command-line mystery, use SQL to research clues and find out whodunit! 项目地址: https://gitcode.com/gh_mirrors/sq/sql-mysteries …...

从零开始掌握Camera Shakify:为Blender动画注入真实感的终极指南

从零开始掌握Camera Shakify:为Blender动画注入真实感的终极指南 【免费下载链接】camera_shakify 项目地址: https://gitcode.com/gh_mirrors/ca/camera_shakify 在数字动画创作中,过于完美的稳定镜头往往会显得不自然。Camera Shakify作为一款…...

Go在Window平台下编译出来的exe如何添加一个图标--推荐使用

2026年编译打包方式补充:1.打包成windows下带有图标的文件办法:打包命令: 1.关键参数:-H windowsgui 隐藏 cmd 窗口(GUI 程序),-w -s 减小 exe 体积。 如果你是发布程序,不想让别人看…...

家庭老照片修复神器:GPEN镜像批量处理教程,一次搞定整本相册

家庭老照片修复神器:GPEN镜像批量处理教程,一次搞定整本相册 1. 老照片修复的痛点与解决方案 每个家庭都珍藏着一些泛黄的老照片,它们承载着珍贵的回忆。但随着时间的推移,这些照片往往会出现模糊、划痕、褪色等问题。传统的手工…...

从零开始:如何为你的降压型DC-DC变换器选择合适的反馈控制模式?

降压型DC-DC变换器反馈控制模式深度解析与选型指南 在电源设计领域,选择合适的反馈控制模式往往决定着整个系统的性能上限。想象一下这样的场景:当你精心设计的电源模块在实验室测试时表现完美,却在量产阶段频繁出现输出电压振荡;…...

(11-1)感知-运动耦合与行为理解:视觉与步态的耦合机制

本章内容围绕“感知—运动”耦合与行为理解展开,系统讲解了人形机器人如何将视觉、触觉等多模态感知信息转化为稳定、灵活的运动与操作行为。首先介绍了视觉与步态的耦合机制,重点分析了落脚点选择、动态障碍物规避以及步态参数的自适应调整方法。随后讲…...

文章目录汇总

文章目录1. 编程语言1.1 C 语言1.2 Capl 编程1.3 Python 编程2. 工具使用手册2.1 编辑器2.1.1 Vscode02.1.2 PyCharm2.1.3 Notepad2.2 版本管控2.2.1 Git2.2.2 Svn2.2.3 Source tree2.3 软件开发2.3.1 ISOLAR2.3.2 EB2.3.3 PLS UDE2.3.4 Beyond Compare2.4 软件调试2.4.1 CANoe…...

Bypass Paywalls Clean完全配置与优化指南

Bypass Paywalls Clean完全配置与优化指南 【免费下载链接】bypass-paywalls-chrome-clean 项目地址: https://gitcode.com/GitHub_Trending/by/bypass-paywalls-chrome-clean 问题定位 诊断安装故障 当开源工具无法正常安装时,首先需要系统排查潜在问题。…...

Qwen3-ASR-1.7B部署案例:高校实验室语音数据标注平台本地化改造

Qwen3-ASR-1.7B部署案例:高校实验室语音数据标注平台本地化改造 1. 项目背景与需求 高校语音研究实验室经常面临一个实际问题:大量语音数据需要标注处理,但使用云端语音识别服务存在隐私泄露风险,且网络依赖导致处理效率低下。传…...

Kiro使用最佳教程

Kiro使用最佳教程:从入门到精通,高效AI编程全攻略Kiro是亚马逊云科技推出的新一代AI驱动型集成开发环境(IDE),同时配套CLI命令行工具,主打规范驱动开发(Spec-Driven Development)&am…...

如何快速掌握IOD库:C++14元编程的终极工具指南

如何快速掌握IOD库:C14元编程的终极工具指南 【免费下载链接】iod Meta programming utilities for C14. Merged in matt-42/lithium 项目地址: https://gitcode.com/gh_mirrors/io/iod IOD库是一个专为C14设计的元编程实用工具集,它提供了丰富的…...

毕设计算机科学与技术:新手入门实战指南与避坑清单

最近在帮学弟学妹们看毕业设计,发现很多同学在起步阶段就卡住了。选题天马行空、技术栈眼花缭乱、代码写成一团乱麻……这些都是新手必经的“痛苦面具”。今天,我就结合自己的经验和踩过的坑,梳理一份从零到一的毕设实战指南,希望…...

Python自动化测试AI生成踩坑全记录:12个真实生产事故+对应防御性代码模板,第9个99%人中招

第一章:Python自动化测试AI生成代码的底层原理与风险本质Python自动化测试中AI生成代码的核心机制,依赖于大语言模型对海量开源测试脚本、框架文档(如pytest、unittest、Selenium API)及缺陷修复模式的学习。模型通过概率化token预…...

APatch故障诊疗指南:从现象到本质的问题解决框架

APatch故障诊疗指南:从现象到本质的问题解决框架 【免费下载链接】APatch Patching, hooking, and rooting the Android using only a stripped kernel image. 项目地址: https://gitcode.com/gh_mirrors/ap/APatch APatch作为一款结合Magisk便捷安装与Kerne…...

从靶场到实战:深度剖析Subrion CMS 4.2.1文件上传漏洞(CVE-2018-19422)的利用与防御

1. Subrion CMS文件上传漏洞初探 Subrion CMS是一款基于PHP的开源内容管理系统,广泛应用于企业网站建设。2018年曝光的CVE-2018-19422漏洞影响Subrion CMS 4.2.1版本,攻击者可以利用该漏洞绕过文件上传限制,在服务器上执行任意代码。这个漏洞…...

如何快速下载B站视频?BilibiliDown跨平台下载工具完整指南

如何快速下载B站视频?BilibiliDown跨平台下载工具完整指南 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader 😳 项目地址: https://gitcode.com/gh_mirro…...

Design Compiler:各种版本的简介(DC Expert、DC Ultra、Design Compiler Graphical与Design Compiler NXT)

相关阅读 Design Compilerhttps://blog.csdn.net/weixin_45791458/category_12738116.html?spm1001.2014.3001.5482 Synopsys的Design Compiler系列是业界领先的RTL综合解决方案,包括四个主要产品:DC Expert、DC Ultra、Design Compiler Graphical和De…...

搭建一个stun server

文章目录开始搭建1、下载吧STUNTURN (Traversal Using Relays around NAT)部署TURN1、安装turnservermediasouplibevent2、 生成密钥文件2、修改配置文件 tunserver.conf3、确认内网和外网ip地址4、需要开放的端口5、启动命令6、 验证是否搭建成功我装的…...

G-Helper智能优化指南:华硕笔记本性能释放与卡顿解决全方案

G-Helper智能优化指南:华硕笔记本性能释放与卡顿解决全方案 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops. Control tool for ROG Zephyrus G14, G15, G16, M16, Flow X13, Flow X16, TUF, Strix, Scar and other models 项…...

手把手教你用Edge浏览器组件下载亚马逊视频(附避坑指南)

深度解析:如何安全高效获取亚马逊视频素材的技术方案 在内容创作领域,优质视频素材的重要性不言而喻。亚马逊平台作为全球最大的电商平台之一,其商品介绍视频、红人测评等内容往往具有极高的参考价值。然而,许多创作者在尝试获取这…...

D4RL完整指南:离线强化学习开源基准平台的终极使用教程

D4RL完整指南:离线强化学习开源基准平台的终极使用教程 【免费下载链接】D4RL 项目地址: https://gitcode.com/gh_mirrors/d4r/D4RL D4RL(Deep Data-Driven Reinforcement Learning Datasets)是一个为离线强化学习研究量身打造的开源…...

告别live-player:uniapp+webView+flv实现跨平台直播流播放的另类方案

突破平台限制:UniAppWebViewFLV直播流播放实战指南 当UniApp官方提供的live-player组件在某些平台无法使用时,开发者常常陷入困境。本文将介绍一种基于WebView和FLV技术的替代方案,帮助开发者在微信小程序等受限环境中实现流畅的直播流播放功…...

LiuJuan20260223Zimage保姆级教程:从拉取镜像到生成图片,手把手教学

LiuJuan20260223Zimage保姆级教程:从拉取镜像到生成图片,手把手教学 1. 准备工作与环境搭建 1.1 系统要求与前置条件 在开始之前,请确保你的系统满足以下基本要求: 操作系统:Linux/Windows/macOS(推荐使…...

OOCSS组件文档自动生成终极指南:如何用Handlebars模板快速构建完整文档系统

OOCSS组件文档自动生成终极指南:如何用Handlebars模板快速构建完整文档系统 【免费下载链接】oocss Object Oriented CSS Framework 项目地址: https://gitcode.com/gh_mirrors/oo/oocss OOCSS(面向对象的CSS)框架提供了一套强大的组件…...

Flux Sea Studio 极简主义效果:生成具有禅意与留白的海景摄影作品

Flux Sea Studio 极简主义效果:生成具有禅意与留白的海景摄影作品 最近在玩一个挺有意思的AI图像生成工具,叫Flux Sea Studio。它专门用来生成各种风格的海景图。我尝试用它来创作一些极简主义的作品,结果让我有点意外。不是那种细节爆炸的复…...

【水下航行器控制】鱼类启发水下航行器的同步游泳和编队控制Matlab实现

✅作者简介:热爱科研的Matlab仿真开发者,擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室🍊个人信条:格物致知,完整Matlab代码获取及仿真…...