Linux系统编程应用 V4L2编程基础
Posted itcast0
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux系统编程应用 V4L2编程基础相关的知识,希望对你有一定的参考价值。
1. 什么是V4L2
V4L2(Video For Linux Two) 是内核提供给应用程序访问音、视频驱动的统一接口。
2. 编程步骤
打开设备-> 检查和设置设备属性-> 设置帧格式-> 设置一种输入输出方法(缓冲 区管理)-> 循环获取数据-> 关闭设备。
3. 设备的打开和关闭
相关代码如下:
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
__u8 driver[16]; /* i.e. "bttv" */
__u8 card[32]; /* i.e. "Hauppauge WinTV" */
__u8 bus_info[32]; /* "PCI:" + pci_name(pci_dev) */
__u32 version; /* should use KERNEL_VERSION() */
__u32 capabilities; /* Device capabilities */
__u32 reserved[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: %s device 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 // 是否支持图像获取
以上是关于Linux系统编程应用 V4L2编程基础的主要内容,如果未能解决你的问题,请参考以下文章