首页 > 其他分享 >USB摄像头——v4l2打开设备、获取设备支持的格式

USB摄像头——v4l2打开设备、获取设备支持的格式

时间:2023-08-08 17:25:13浏览次数:63  
标签:USB v4fmt printf 格式 v4l2 摄像头 设备

一、v4l2介绍     v4l2意思为Video for Linux2,是linux中视频设备的内核驱动。它有以下几个接口:   视频采集接口:这种设备可以是高频头或摄像头; 视频输出接口:可以驱动计算机的外围视频图像设备 直接传输视频接口:主要工作是把从视频采集设备采集过来的信号直接输出到输出设备之上,而不用经过系统的CPU; 视频间隔消隐信号接口:使应用可以访问传输消隐期的视频信号; 收音机接口:可用来处理从AM或FM高频头设备接收来的音频流。     从它名字“Video for Linux2”可以知道,它只能运行在Linux操作系统之上,其是针对uvc免驱动usb设备的编程框架,主要用于usb摄像头等。   二、实验步骤 1.打开设备 打开设备代码如下(示例):   int fd = open("/dev/video0",O_RDWR);     if(fd < 0)     {         perror("打开设备失败!");         return -1;     }       一般来说,当第一个摄像头插入后,其在dev目录下显示的是video0,接着是video1,video2…以此类推。通过ls命令查看一下其设备号:       可以看到,在我的dev目录下有两个video设备,如果你跟我一样,只插入了一个摄像头,但是却显示有两个设备,其实也是非常正常的。     输入命令:   v4l2-ctl --all --device=/dev/video0 v4l2-ctl --all --device=/dev/video1       可以查看两个摄像头的信息:     显示的两个设备,一个是图像/视频采集,一个是metadata采集,也就是对应的video capture和metadata capture,所以这两个设备中只有设备video0可以进行图像/视频采集。   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]);     }       这里面用到了结构体 v4l2_fmtdesc,其描述了当前摄像头所支持的格式,其结构如下:    struct v4l2_fmtdesc  {      __u32 index;               // 要查询的格式序号,应用程序设置      enum v4l2_buf_type type;   // 帧类型,应用程序设置      __u32 flags;               // 是否为压缩格式      __u8 description[32];      // 格式名称      __u32 pixelformat;         //所支持的格式      __u32 reserved[4];         // 保留  };       一个摄像头不一定只有一个格式,所以通过i变量i++,在while循环中将所有格式遍历一遍,当ret<0的时候,也就是遍历完成之时,通过break退出循环。     对文件进行编译:   arm-linux-gnueabi-gcc -o camera camera.c        通过tftp将文件传输到开发板上运行(摄像头插板子上),运行查看结果:     可以看到,摄像头设备支持的格式已经显示出来。   3.将设备关闭     打开完设备后最忌忘记关闭设备,需要铭记于心:   关闭设备代码如下(示例):   close(fd);   总结 将代码整合起来,包括需要用到的头文件等,希望能给个点赞和收藏,关于v412的内容后续还会进行更新   完整代码如下(示例):   #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <stdlib.h> #include <unistd.h> #include <sys/ioctl.h> #include <linux/videodev2.h>   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 < 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]);     }       //关闭设备     close(fd);       return 0; }  

标签:USB,v4fmt,printf,格式,v4l2,摄像头,设备
From: https://www.cnblogs.com/kn-zheng/p/17614906.html

相关文章

  • 嵌入式教程_DSP教程:2-27 基于USB接口的存储设备实验
    2-27基于USB接口的存储设备实验实验目的本节视频的目的是学习USBOTG的运用和工作原理,并实现USB从方式,将实验板模拟成一个USB存储设备,实现主机和实验板之间的数据传输。实验原理硬件原理图实验过程中使用的是USBOG接口T本节视频的目的是学习USBOTG的运用和工作原理,并实现USB从方......
  • 使用LLM在移动设备上实现对话交互
    推荐:使用NSDT场景编辑器助你快速搭建可编辑的3D应用场景移动设备上的智能助手具有非常先进的基于语言的交互,用于执行简单的日常任务,例如设置计时器或打开手电筒。尽管取得了进展,但这些助手在支持移动用户界面(UI)中的对话交互方面仍然面临限制,其中执行了许多用户任务。例如,他们无......
  • Omron 欧姆龙CP1系列PLC通讯口(USB、RS232、RS485/422)的正确使用
    USB、RS232、RS485、RS422是CP1系列的主要通信接口,在现场调试、设备连接中应用广泛。(1)USB口通讯的正确使用   ①通讯电缆:请使用可靠屏蔽、且带磁环的通讯电缆,防止电磁或噪音干扰。    ②连接:避免在通信时插拔USB电缆,且插拔时避免手直接触碰USB口上的金属......
  • 视频融合平台视频汇聚平台LiteCVR用户反馈接入设备显示离线处理教程
    LiteCVR视频融合平台是一款基于云边端一体化架构的应用程序,旨在提供强大的数据接入、处理和分发功能。该平台支持多种协议接入,包括市场主流标准协议和厂家私有协议及SDK,例如国标GB28181、RTMP、RTSP/Onvif、海康Ehome、海康SDK、宇视SDK等。我们收到了用户的反馈,他们在长时间使用Li......
  • ETHERCAT转ETHERCAT网关西门子为什么不支持ethercat两个ETHERCAT设备互联
     1.1产品功能捷米JM-ECT-ECT是自主研发的一款ETHERCAT从站功能的通讯网关。该产品主要功能是将2个ETHERCAT网络连接起来。本网关连接到ETHERCAT总线中做为从站使用。1.2技术参数1.2.1捷米JM-ECT-ECT技术参数●网关做为ETHERCAT网络的从站,可以连接倍福、欧姆龙、基恩士......
  • centos系统给usb网卡设置静态ip
    centos系统usb网卡设置静态ip有一台普通电脑作为服务器,装centos系统,没有图形界面。因为主板自带的网卡坏了(重新装过的系统发现/etc/sysconfig/network-scripts目录下没有ifcfg-eth0或者ifcfg-ens33这种类似的网络文件),所以用了绿联的usb转网卡插在主机的usb用,插上去后发现是可以自动......
  • 视频融合平台LiteCVR视频汇聚平台设备录像时间异常问题反馈解决案例
    LiteCVR视频融合平台是一个基于云边端协同架构的视频管理平台,支持海量视频的轻量化接入和汇聚管理。该平台提供了监控直播、云端录像、云存储、录像检索与回看、智能告警、平台级联、语音对讲、智能分析等丰富的视频能力,适用于工地、工厂、园区、楼宇、校园、仓储等各种场景。最近,......
  • 荣耀90pro无法在Android Studio中使用USB真机调试问题
    今日用荣耀手机进行真机调试,由于之前没有用过华为荣耀手机,所以在连接过程中出现了一些问题。首先,我还是像以前那样用数据线将手机和电脑连接,在手机开发者模式中开启USB调试,结果发现NoDevices。 之后发现,在打开USB调试时,提示如下信息,这跟我之前用其他手机提示的不一样,我记得是......
  • Siemens 西门子PROFINET:设备名、IP地址、MAC地址解析分别有什么用?
    对于PROFINET网络来说,涉及了几个地址参数,设备名、IP地址、MAC地址。不仅如此,每个PROFINET的设备的MAC地址还有多个。如会存在接口模块的MAC地址和端口MAC地址。若一个接口下有多个端口就会有多个端口MAC地址。那么我们需要弄明白的一件事是,这些地址都有什么作用,有......
  • Mitsubishi 三菱FX5U CC-Link通信(1主站2智能设备站)
    FX5UCC-Link通信CC-LinkCC-Link(Control&CommunicationLink)是一种省配线、信息化的现场总线网络,它不但具备高实时性、分散控制、智能设备通信、RAS等功能,而且依靠与诸多现场设备制造厂商的紧密联系,提供开放式的环境。网络中的主站由PLC担当,从站可以是远程I/O模块、特殊功能......