在我的上一篇文章基于V4L2驱动程序的USB摄像头Android(JNI)的编写(一)中,我详细介绍了如何配置V4L2驱动程序的采集环境,那么在这篇文章中,我将详细分析V4L2采集视频的过程。
一、向驱动程序申请缓冲帧
缓冲帧,顾名思义就是在Linux驱动程序中用于临时存放数据的“容器”,在V4L2驱动程序中,也就是存放我们的视频流数据。而什么又是向驱动程序申请缓冲帧呢,因为在V4L2驱动程序中,其配备的缓冲帧的个数并不是固定的,每一次我们使用的时候都要根据我们的需求向V4L2驱动程序申请,这也体现了V4L2的强大以及设计的合理性,保证了不必要的资源浪费。下面介绍如何向V4L2驱动程序申请缓冲帧。
使用命令:VIDIOC_REQBUFS
struct v4l2_requestbuffers req;
//设定v4l2_requestbuffers的参数信息
CLEAR (req);
req.count = 4; //缓存数量
req.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; //数据流类型,这个参数不能改变
req.memory = V4L2_MEMORY_MMAP;//使用内存映射方式。
//申请缓冲数,使用VIDIOC_REQBUFS,注意上面的req.count虽然赋值为4,但是并不一定申请之后,得到的缓冲数也为4
if (-1 == xioctl (fd, VIDIOC_REQBUFS, &req)) {
if (EINVAL == errno) {
LOGE("%s does not support memory mapping", dev_name);
return ERROR_LOCAL;
} else {
return errnoexit ("VIDIOC_REQBUFS");
}
}
//如果申请得到的缓冲4小于2的话,则表示没有充分的内存(内核空间,具有实际的物理内存)