V4L2视频采集

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

2.6.2 相关函数
int ioctl(int fd, int request, struct v4l2_requestbuffers *req);
2013 年 6 月 2 日星期日 第 5 页——共 17 页 NO.1
项目笔记
视频采集
2.6.3 相关结构体
struct v4l2_requestbuffers { __u32 count; //缓冲区内缓冲帧的数目 enum v4l2_buf_type type; //缓冲帧数据格式 enum v4l2_memory memory; //区别是内存映射还是用户指针方式 __u32 reserved[2]; }; enum v4l2_memoy {V4L2_MEMORY_MMAP,V4L2_MEMORY_USERPTR};
2013 年 6 月 2 日星期日 第 4 页——共 17 页 NO.1
项目笔记 __u32 bytesperline; __u32 sizeimage; enum v4l2_colorspace colorspace; __u32 priv; };
视频采集
2.5.4 示例代码
struct v4l2_format fmt.type fmt.fmt.pix.width fmt.fmt.pix.height fmt.fmt.pix.pixelformat fmt.fmt.pix.field fmt; = V4L2_BUF_TYPE_VIDEO_CAPTURE; = WIDTH; = HEIGHT; = V4L2_PIX_FMT_YUYV; = V4L2_FIELD_INTERLACED;
2.4.4 示例代码
struct v4l2_capability cap; if (ioctl(videofd, VIDIOC_QUERYCAP, &cap) == -1) { if (errno == EINVAL) { fprintf ( stderr, "%s is no V4L2 device\n",video_device); exit(EXIT_FAILURE); } fprintf(stderr,"Failed VIDIOC_QUERYCAP on %s (%s)\n", video_device,strerror(errno));
打开设备->检查和设置设备属性->设置帧格式->设置一种输入输出方法(缓冲区管理)->循 环获取数据->关闭设备。如图 2.2.1
图 2.2.1 工作流程
2.3 打开视频设备
打开视频设备非常简单,在 V4L2中,视频设备被看做一个文件。使用 open 函数打开这个设备: 用非阻塞模式打开摄像头设备(项目中采用是此方法) int cameraFd; cameraFd = open("/dev/video0", O_RDWR | O_NONBLOCK); 2. 如果用阻塞模式打开摄像头设备,上述代码变为: cameraFd = open("/dev/video0", O_RDWR); 关于阻塞模式和非阻塞模式
2.7.2 相关函数
Int ioctl (videofd, VIDIOC_QUERYBUF, struct v4l2_buffer *buf);
2013 年 6 月 2 日星期日 第 6 页——共 17 页 NO.1
项目笔记
视频采集
2.7.3 相关结构体
相关结构体,参考 2.7 中的 struct v4l2_buffer。
fprintf(stderr,"%s is no video capture device\n", video_device); exit(EXIT_FAILURE); }
2.5 设置视频设备的视频数据格式
2.5.1 说明
设置视频设备的视频数据格式,例如设置视频图像数据的长、宽,图像格式(JPEG、YUYV 格式) ; 参数说明:参数类型为 V4L2的视频数据格式类型 struct v4l2_format ; 返回值说明: 执行成功时,函数返回值为 0;
if (-1 == ioctl (videofd, VIDIOC_S_FMT, &fmt)) { fprintf(stderr,"Failed: VIDIOC_S_FMT\n"); exit(EXIT_FAILURE); } //查看视频图片的大小 captureSize = fmt.fmt.pix.sizeimage; 注意: 如果该视频设备驱动不支持你所设定的图像格式,视频驱动会重新修改 struct v4l2_format 结构体变量的值为该视频设备所支持的图像格式,所以在程序设计中,设定完所有的视频格式后,要 获取实际的视频格式,要重新读取 struct v4l2_format 结构体变量
2.7 查询已经分配的 V4L2 的视频缓冲区的相关信息
2.7.1 说明
功能: 查询已经分配的 V4L2的视频缓冲区的相关信息,包括视频缓冲区的使用状态、在内核空 间的偏移地址、缓冲区长度等。在应用程序设计中通过调 VIDIOC_QUERYBUF 来获取内核空间的 视频缓冲区信息,然后调用函数 mmap 把内核空间地址映射到用户空间,这样应用程序才能够访问 位于内核空间的视频缓冲区。 参数说明:参数类型为 V4L2缓冲区数据结构类型 struct v4l2_buffer ; 返回值说明: 执行成功时,函数返回值为 0;struct v4l2_buffer 结构体变量中保存了指令的缓 冲区的相关信息; 一般情况下,应用程序中调用 VIDIOC_QUERYBUF 取得了内核缓冲区信息后,紧接着调用 mmap 函数把内核空间地址映射到用户空间,方便用户空间应用程序的访问。
使用移植好的内核 linux-2.6.35-farsigt.tar.gz #make menuconfig 配置支持 zc301 usb 摄像头 Device Drivers ---> <*> Multimedia support ---> <*> Video For Linux [*] Enable Video For Linux API 1 (DEPRECATED) [*] Video capture adapters ---> [*] V4L USB devices ---> <*> USB Video Class (UVC) [*] UVC input events device support <*> GSPCA based webcams ---> <*> ZC3XX USB Camera Driver [*] USB support ---> <*> Support for Host-side USB [*] USB announce new devices 如果摄像头有换,可以插该 usb 摄像头到电脑上,看设备 ID 再百度一下,看是需配内核那个选 项
2.7.4 示例代码
struct v4l2_buffer buf; CLEAR (buf); buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;ຫໍສະໝຸດ Baidubuf.memory = V4L2_MEMORY_MMAP; buf.index = n_buffers; // 要获取内核视频缓冲区的信息编号 /*查询已经分配的 V4L2 的视频缓冲区的相关信息,包括视频缓冲区的使用状态、在内核空间的偏移 地址、缓冲区长度等*/ ioctl (videofd, VIDIOC_QUERYBUF, &buf);
2.6 申请和管理缓冲区
2.6.1 说明
功能: 请求 V4L2驱动分配视频缓冲区(申请 V4L2视频驱动分配内存) ,V4L2是视频设备的驱动 层,位于内核空间,所以通过 VIDIOC_REQBUFS 控制命令字申请的内存位于内核空间,应用程序 不能直接访问,需要通过调用 mmap 内存映射函数把内核空间内存映射到用户空间后,应用程序通 过访问用户空间地址来访问内核空间。 参数说明:参数类型为 V4L2的申请缓冲区数据结构体类型 struct v4l2_requestbuffers ; 返回值说明: 执行成功时,函数返回值为 0 ;V4L2驱动层分配好了视频缓冲区。
2.6.4 示例代码
申请一个拥有四个缓冲帧的缓冲区 struct v4l2_requestbuffers req; req.count =4; //申请缓冲区的个数 req.type =V4L2_BUF_TYPE_VIDEO_CAPTURE; req.memory =V4L2_MEMORY_MMAP; ioctl(fd,VIDIOC_REQBUFS,&req); 注意:VIDIOC_REQBUFS 会修改 tV4L2_reqbuf 的 count 值,tV4L2_reqbuf 的 count 值返回实际申请 成功的视频缓冲区数目。
项目笔记
,
视频采集
视频采集 说明
1、 应 用 平 台 :华清 s5pc100 开发板 2、 摄像头型号 :ZC301 3、 Linux 内核版本:linux2.6.35-fasight 4、 交叉编辑器 :arm-linux-gcc 5、 JPEG 库版本 :jpegsrc.v8c
1.USB 视频驱动移植
2013 年 6 月 2 日星期日 第 2 页——共 17 页 NO.1
1.
项目笔记
视频采集
应用程序能够使用阻塞模式或非阻塞模式打开视频设备,如果使用非阻塞模式调用视频设备,即 使尚未捕获到信息,驱动依旧会把缓存( DQBUFF)里的东西返回给应用程序。
2.4 查询设备属性
2.4.1 说明
参数说明:参数类型为 V4L2 的能力描述类型 struct v4l2_capability ; 返回值说明: 执行成功时,函数返回值为 0;函数执行成功后,struct v4l2_capability 结构体变 量中的返回当前视频设备所支持的功能;例如支持视频捕获功能 V4L2_CAP_VIDEO_CAPTURE 、 V4L2_CAP_STREAMING 等 2.4.2 相关函数: int ioctl(int fd, int request, struct v4l2_capability *argp); 2.4.3 相关结构体: struct v4l2_capability { __u8 driver[16]; //驱动名字 __u8 card[32]; //设备名字 __u8 bus_info[32]; //设备在系统中的位置 __u32 version; //驱动版本号 __u32 capabilities; //设备支持的操作 __u32 reserved[4]; //保留字段 }; capabilities 常用值: V4L2_CAP_VIDEO_CAPTURE //是否支持图像获取
2013 年 6 月 2 日星期日 第 3 页——共 17 页 NO.1
项目笔记 exit(EXIT_FAILURE); }
视频采集
执行完 VIDIOC_QUERYCAP 命令后,cap 变量中包含了该视频设备的能力信息,程序中通过检查 cap 中的设备能力信息来判断设备是否支持某项功能。 if (!(cap.capabilities & V4L2_CAP_VIDEO_CAPTURE)) {
2.5.2 相关函数
int ioctl(int fd, int request, struct v4l2_format *fmt);
2.5.3 相关结构体
struct v4l2_format{ enum v4l2_buf_type type; //帧类型,应用程序设置 union{ struct v4l2_pix_format pix; //视频设备使用 struct v4l2_window win; struct v4l2_vbi_format vbi; struct v4l2_sliced_vbi_format sliced; __u8 raw_data[200]; }fmt }; struct v4l2_pix_format{ __u32 width; // 帧宽,单位像素 __u32 height; // 帧高,单位像素 __u32 pixelformat; // 帧格式 enum v4l2_field field;
2.视频采集 2.1 定义
V4L2(Video For Linux Two) 是内核提供给应用程序访问音、视频驱动的统一接口。V4L2 相关接 口定义在 include/linux/Videodev2.h 中
2013 年 6 月 2 日星期日
第 1 页——共 17 页
NO.1
项目笔记
视频采集
2.2 工作流程
相关文档
最新文档