V4L2的视频采集方式

V4L2的视频采集方式

操作系统一般把系统使用的内存划分成用户空间和内核空间,分别由应用程序管理和操作系统管理。应用程序可以直接访问内存的地址,而内核空间存放的是供内核访问的代码和数据,用户不能直接访问。v4l2捕获的数据,最初是存放在内核空间的,这意味着用户不能直接访问该段内存,必须通过某些手段来转换地址。

V4L2有三种视频采集方式:

1)使用read、write方式:直接使用 read  write 函数进行读写。这种方式最简单,但是这种方式会         在用户空间和内核空间不断拷贝数据 ,同时在用户空间和内核空间占用大量内存,效率不高。

2)内存映射方式(mmap):把设备里的内存映射到应用程序中的内存中,应用程序直接处理设备内存,这       是一种有效的方式。mmap函数就是使用这种方式。

   对于 memory mapped 模式,要在 device memory 下申请 buffer ,应用程序必须初始化 3 个参数,       驱动最后返回的 buffer 的个数可能等于 count ,也可能少于或者多于 count ,少于可能是因为内存       不足,多于则可能是驱动为更好地完成相应功能增加的 buffer 。如果 driver 不支持 memory mapped       调用这个 ioctl 就会返回 EINVAL 因为 memory map 模式下分配的是实实在在的物理内存,不是虚       拟内存,所以使用完以后一定要使用 munmap() 释放。


3)用户指针模式:内存由用户空间的应用程序分配,并把地址传递到内核中的驱动程序,然后由 v4l2 驱       动程序直接将数据填充到用户空间的内存中。这点需要在v4l2_requestbuffers里将memory字段设置成       V4L2_MEMORY_USERPTR。对于 User pointer I/O ,应用程序只需设置上面的 type memory 类型就       可以了。


第一种方式效率是最低的,后面两种方法都能提高执行的效率,使用mmap方法的时候,buffers相当于是在内核空间中分配的,这种情况下,这些buffer是不能被交换到虚拟内存中,虽然这种方法不怎么影响读写效率,但是它一直占用着内核空间中的内存,当系统的内存有限的时候,如果同时运行有大量的进程,则对系统的整体性能会有一定的影响。

所以,对于三种视频采集方式的选择,推荐的顺序是 userptr 、 mmap 、 read-write 。当使用 mmap  或 userptr 方式的时候,有一个环形缓冲队列的概念,这个队列中,有 n 个 buffer ,驱动程序采集到的视频帧数据,就是存储在每个 buffer 中。在每次用 VIDIOC_DQBUF 取出一个 buffer ,并且处理完数据后,一定要用 VIDIOC_QBUF 将这个 buffer 再次放回到环形缓冲队列中。环形缓冲队列,也使得这两种视频采集方式的效率高于直接 read/write 。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值