一、流程
V4L2摄像头采集程序步骤
- 打开摄像头设备
- 查询摄像头硬件信息
- 显示摄像头支持的采集格式
- 设置采集格式
- 申请内核空间
- 映射
- 开始采集
二、模块
2.1 打开摄像头
int OpenCameraDevice(char* filename,int mode)
{
int Camera_fd = open(filename, mode);
if (Camera_fd < 0)
{
perror("Failed to open camera device");
printf("\n");
return -1;//表示函数失败
}else{
return Camera_fd;
}
return 0;
}
2.2 查询硬件设备的能力
2.2.1 struct v4l2_capability结构体
struct v4l2_capability {
__u8 driver[16]; //驱动名 通常为:uvcvideo
__u8 card[32]; //设备名 生产厂商写
__u8 bus_info[32]; //在Bus系统中存放位置 ,通常为:usb-hiusb-ehci-2.4
__u32 version; //driver 版本
__u32 capabilities;
//设备支持的操作模式,能力集 通常为:V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING
__u32 device_caps;
__u32 reserved[3];// 保留字段
};
capabilities 代表设备支持的操作模式,常见的值有 V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING 表示是一个视频捕捉设备并且具有数据流控制模式;
能力集中包含:
V4L2_CAP_VIDEO_CAPTURE 0x00000001 The device supports the Video Capture interface.
V4L2_CAP_VIDEO_OUTPUT 0x00000002 The device supports the Video Output interface.
V4L2_CAP_VIDEO_OVERLAY 0x00000004 The device supports the Video Overlay interface.
int QueryCameraHardwareInfo(int fd)
{
struct v4l2_capability cap;
memset(&cap, 0, sizeof(cap));
int ret = 0;
ret = ioctl(fd, VIDIOC_QUERYCAP, &cap);
if (ret < 0)
{
printf("VIDIOC_QUERYCAP failed(%d)\n", ret);
return -1;
}
else
{
printf("Capability Informations:\n");
/*cout<<"driver:"<<cap.driver<<endl;
cout<<"card:"<<cap.card<<endl;
cout<<"bus_info:"<<cap.bus_info<<endl;
cout<<"version:"<<cap.version<<endl;
cout<<"capabilities:"<<cap.capabilities<<endl;
cout<<"device_caps:"<<cap.device_caps<<endl;
cout<<"reserved:"<<cap.reserved<<endl;*/
}
printf("--------------------\n"); //可作为分割线。
return ret;
}
2.3 打印摄像头支持的格式
2.3.1 struct v4l2_fmtdesc结构体
struct v4l2_fmtdesc
{
u32 index; // 要查询的格式序号,应用程序设置
enum v4l2_buf_type type; // 缓冲类型 应用程序设置 帧类型,应用程序设置
u32 flags; // 是否为压缩格式
u8 description[32]; // 格式名称
u32 pixelformat; // 格式
u32 reserved[4]; // 保留
};
参数enum v4l2_buf_type type:
enum v4l2_buf_type {
V4L2_BUF_TYPE_VIDEO_CAPTURE = 1,
V4L2_BUF_TYPE_VIDEO_OUTPUT = 2,
V4L2_BUF_TYPE_VIDEO_OVERLAY = 3,
V4L2_BUF_TYPE_VBI_CAPTURE = 4,
V4L2_BUF_TYPE_VBI_OUTPUT = 5,
V4L2_BUF_TYPE_SLICED_VBI_CAPTURE = 6,
V4L2_BUF_TYPE_SLICED_VBI_OUTPUT = 7,
V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY = 8,
V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE = 9,
V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE = 10,
V4L2_BUF_TYPE_SDR_CAPTURE = 11,
V4L2_BUF_TYPE_SDR_OUTPUT = 12,
V4L2_BUF_TYPE_META_CAPTURE = 13,
/* Deprecated, do not use */
V4L2_BUF_TYPE_PRIVATE = 0x80,
};
参数u32 flags:
参数description:
参数pixelformat:
2.4 设置采集的格式