基于V4L2驱动程序的USB摄像头Android(JNI)的编写(一)

video4 linux2(V4L2)是Linux内核中关于视频设备的内核驱动,它为Linux中视频设备访问提供了通用接口,在Linux系统中,本文主要介绍如何使用V4L2驱动程序打开我们的USB摄像头。同时着重介绍如何编写相应JNI(NDK)使Android应用程序能够打开我们外接的USB摄像头,并获取视频流信息。

一、 确定USB摄像头的设备文件
V4L2驱动的Video设备节点路径通常/dev/video/中的videoX,V4L2驱动对用户空间提供字符设备,主设备号为81,对于视频设备,其次设备号为0-63。除此之外,次设备号为64-127的Radio设备,次设备号为192-223的是Teletext设备,次设备号为224-255的是VBI设备。V4L2驱动的Video设备在用户空间通过各种ioctl调用进行控制,并且可以使用mmap进行内存映射。
这里首先第一步是要确定免驱的USB摄像头的设备文件,否则便无法进入下一步工作,要确定USB摄像头的设备文件也比较简单。

  1. 将USB摄像头通过USB线连接进开发板,使用adb shell进入dev目录,这时可以查看一下当下的包含video的目录,具体查看命令如下:ls –l video*,这样就可以看到目前开发板上所包含有的video设备,如下图所示:
    dev目录下的video设备
    由上图我们可以看到video设备的主设备号都为81,同时次设备号介于0到63之间。但是这上面有这么多的video设备,我们并不清楚我们的USB摄像头的设备文件是哪一个。所以下一步就是要确定我们的设备文件。

  2. 将USB摄像头拔出,同样的按照上一步的方式,查看dev目录下的video设备文件。得到的结果如下图所示
    去掉USB摄像头的设备文件
    由上面我们可以看到,video4已经随着我们的USB摄像头拔出,已经消失不见了,说明我们USB摄像头的设备文件就是video4

二、 编写JNI文件
我们确定好USB的设备文件之后,就可以开始编写JNI程序啦,不过在编写之前,必须要弄清楚基于V4L2驱动的上层调用程序的一般流程。在后面会介绍许多V4L2驱动的API。

1. 结构流程

V4L2采集结构示意图
1) 打开设备文件。 int fd=open(”/dev/video4″,O_RDWR);
2) 取得设备的capability,看看设备具有什么功能,比如是否具有视频输入,或者音频输入输出等。VIDIOC_QUERYCAP,struct v4l2_capability
3) 选择视频输入,一个视频设备可以有多个视频输入。VIDIOC_S_INPUT,struct v4l2_input
4) 设置视频的制式和帧格式,制式包括PAL,NTSC,帧的格式个包括宽度和高度等。VIDIOC_S_STD,VIDIOC_S_FMT,struct v4l2_std_id,struct v4l2_format
5) 向驱动申请帧缓冲,一般不超过5个。struct v4l2_requestbuffers
6) 将申请到的帧缓冲映射到用户空间,这样就可以直接操作采集到的帧了,而不必去复制。Mmap
7) 将申请到的帧缓冲全部入队列,以便存放采集到的数据.VIDIOC_QBUF,struct v4l2_buffer
8) 开始视频的采集。VIDIOC_STREAMON
9) 出队列以取得已采集数据的帧缓冲,取得原始采集数据。VIDIOC_DQBUF
10) 将缓冲重新入队列尾,这样可以循环采集。VIDIOC_QBUF
11) 停止视频的采集。VIDIOC_STREAMOFF
12) 关闭视频设备。close(fd);
下面将具体介绍如何具体编写JNI的方式

2. 编写流程

1、打开设备文件
首先第一步当然是要打开设备文件,通过上一步,我们已经知道了设备文件的名称了,所以这一步我们就可以知道应该打开哪一个设备文件了。打开设备文件一共有两种方式。

阻塞式
使用阻塞式的方式打开设备文件,如果后面没有捕获到视频信息,驱动程序便会停止不动,直至有视频信息到来。方式如下:

int fd = open(”/dev/video4″, O_RDWR | O_NONBLOCK, 0);

非阻塞式
使用非阻塞式打开设备文件,即使尚未捕获到信息,驱动依旧会把缓存里面的东西返回给应用程序。方式如下:

int fd = open(”/dev/video4″, O_RDWR, 0);
//或者下面这样
int fd = open(”/dev/video4″, O_RDWR);

在这里我们目前使用的是非阻塞式。

2、设定采集方式和属性

  • 5
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 15
    评论
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值