弱龄寄事外,委怀在琴书。这篇文章主要讲述Linux系统编程应用 V4L2编程基础相关的知识,希望能为你提供帮助。
?1. 什么是V4L2?
V4L2(Video For Linux Two) 是内核提供给应用程序访问音、视频驱动的统一接口。
?2. 编程步骤?
打开设备->
检查和设置设备属性->
设置帧格式->
设置一种输入输出方法(缓冲 区管理)->
循环获取数据->
关闭设备。
?3. 设备的打开和关闭?
相关代码如下:
【Linux系统编程应用 V4L2编程基础】
文章图片
?4. 查询设备属性?
相关方法如下:
int ioctl(int fd, int request, struct v4l2_capability *argp);
VIDIOC_QUERYCAP -- Query device capabilities
相关结构体如下:
struct v4l2_capability
u8 driver[16]; // 驱动名字
u8 card[32]; // 设备名字
u8 bus_info[32]; // 设备在系统中的位置
u32 version; // 驱动版本号
u32 capabilities; // 设备支持的操作
u32 reserved[4]; // 保留字段
;
相关参考代码
#include < stdio.h>
#include < stdlib.h>
#include < string.h>
#include < sys/types.h>
#include < sys/stat.h>
#include < sys/ioctl.h>
#include < fcntl.h>
#include < unistd.h>
#include < linux/videodev2.h>
#if 0
struct v4l2_capability
__u8driver[16]; /* i.e. "bttv" */
__u8card[32]; /* i.e. "Hauppauge WinTV" */
__u8bus_info[32]; /* "PCI:" + pci_name(pci_dev) */
__u32version; /* should use KERNEL_VERSION() */
__u32capabilities; /* Device capabilities */
__u32reserved[4];
;
#endif
int main(void)
int fd = -1;
int ret = -1;
struct v4l2_capability cap;
//open the device
fd = open("/dev/video0", O_RDWR);
if (-1 == fd)
perror("open");
goto err0;
printf("fd = %d\\n", fd);
memset(& cap, 0, sizeof(cap));
//query device capabilities
ret = ioctl(fd, VIDIOC_QUERYCAP, & cap);
if (-1 == ret)
perror("ioctl");
goto err0;
printf("driver name: %sdevice name: %s device location: %s\\n", cap.driver, cap.card, cap.bus_info);
printf("version: %u.%u.%u\\n", (cap.version > > 16) & 0xff, (cap.version > > 8) & 0xff, cap.version & 0xff);
if (cap.capabilities & V4L2_CAP_VIDEO_CAPTURE)
printf("Is a video capture device\\n");
else
printf("Is not a video capture device\\n");
//close device
close(fd);
return 0;
err0:
return -1;
执行结果如下:
文章图片
capabilities 常用值:
V4L2_CAP_VIDEO_CAPTURE // 是否支持图像获取
推荐阅读
- ZooKeeper客户端源码——向服务端建立连接+会话建立+心跳保持长连接
- Linux(程序设计):02---make与Makefile的设计与应用
- Linux(程序设计):05---gcc的基本用法
- Linux(程序设计):06---动态函数库与静态函数库(ldconfigldd命令与/etc/ld.so.conf)
- 服务/软件管理(06---Linux查看主机路由(route命令))
- Circle Linux镜像在阿里云镜像站首发上线
- 服务/软件管理(07---Linux下查看MAC与ARP table(arp命令))
- 服务/软件管理(10---Linux的网卡(ethtool命令))
- Linux-find命令