问题描述
使用V4L2驱动调用摄像头,只能打开一次摄像头,第二次打开时程序崩溃。
原因
在获取相机数据流时我们一般会使用mmap()
来将linux内核空间映射到用户空间,在关闭相机时应当调用munmap()
解除此映射。
代码
内核映射到用户空间
int VideoDevice::init_mmap()
{
/***向内核申请帧缓存***/
struct v4l2_requestbuffers reqbuf; /* 向内核申请帧缓存 */
memset(&reqbuf, 0, sizeof(reqbuf));
reqbuf.count = this->uCount; /* 缓存数量---> 数据帧的个数 */
reqbuf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; /* 数据帧流类型 */
reqbuf.memory = V4L2_MEMORY_MMAP; /* 内存映射的方式采集数据 */
/* VIDIOC_REQBUFS表示分配内存,调用ioctl是配置生效*/
if(-1 == ioctl(this->fd, VIDIOC_REQBUFS, &reqbuf))
{
perror("ioctl VIDIOC_REQBUFS error");
return -1;
}
if((reqbuf.count < 2) || (reqbuf.count > 5))
{
return -1; /* 保证帧缓存的数量不易太大也不易太小*/
}
/* 在用户空间申请count个VideoBuffer个数据类型的空间,分别保存每个