Linux系统编程应用 V4L2编程基础

弱龄寄事外,委怀在琴书。这篇文章主要讲述Linux系统编程应用 V4L2编程基础相关的知识,希望能为你提供帮助。


?1. 什么是V4L2?
V4L2(Video For Linux Two) 是内核提供给应用程序访问音、视频驱动的统一接口。


?2. 编程步骤?
打开设备-> 检查和设置设备属性-> 设置帧格式-> 设置一种输入输出方法(缓冲 区管理)-> 循环获取数据-> 关闭设备。


?3. 设备的打开和关闭?
相关代码如下:
【Linux系统编程应用 V4L2编程基础】

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;

执行结果如下:
Linux系统编程应用 V4L2编程基础

文章图片

capabilities 常用值:
V4L2_CAP_VIDEO_CAPTURE // 是否支持图像获取



    推荐阅读