1. 什么是V4L2

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


2. 编程步骤

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


3. 设备的打开和关闭

相关代码如下:

【Linux系统编程应用】 V4L2编程基础(一)_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
{
	__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;
}


执行结果如下:

【Linux系统编程应用】 V4L2编程基础(一)_Linux V4L2_02

capabilities 常用值:

V4L2_CAP_VIDEO_CAPTURE // 是否支持图像获取