基于V4L2移动视频监控系统的研究与设计

2012-06-26 09:52黄俊伟
电视技术 2012年17期
关键词:视频流驱动程序调用

黄俊伟,巴 义

(重庆邮电大学通信与信息工程学院,重庆 400065)

随着信息化产业的高速发展,人们对自己的生活居住环境也提出了更高的需求。在智能家居大力推广下,视频监控作为其中的一个重要模块也已经备受关注。移动视频监控是指用户通过3G手机上网方式随时随地观看远程监控端的视频。目前市面上主要存在着两种视频监控系统类型,一种是以数字录像设备为核心的传统视频监控系统,另一种是以嵌入式技术为核心的视频监控系统。本文所设计的视频监控系统正是基于后者,该系统与传统的相比较,不需要复杂布线,实时性强、性能稳定、成本低廉,并且整体架构简洁,客户端由手机代替传统的PC监控,方便用户使用[1]。因此这种以嵌入式技术为核心,将嵌入式技术、流媒体技术、网络技术结合为一体的监控系统具有很强的研究意义。而监控前端一体化也正是未来发展的方向。

V4L2(Video for Linux 2)是Linux中关于视频设备的内核驱动,并已成为Linux 2.6的标准接口。目前V4L2可以支持多种设备,并提供了视频采集接口、视频输出接口、直接传输视频接口等。基于V4L2的视频采集采用流水线方式,操作极为简单方便,应用程序通过调用V4L2提供API完成对摄像头的基本操作[2]。很多操作都是通过调用iotcl函数来实现设备的打开、关闭,以及设置图像格式等。

1 系统总体架构及实现方案

本文设计理念是基于家庭智能化而提出的设想。通过在家中门窗等重要位置安装摄像头,用户只要在有手机信号覆盖的范围下,通过手机上网的方式就可以对家庭的情况进行实时监控[3]。本系统借鉴传统的C/S设计模式,提出了一种更轻巧更简便的系统。本系统包括采集端和监控端两部分,采集端是一个ARM11开发板,开发板上集成了视频采集模块、压缩编码模块、数据传输模块、云台控制模块。此设计避免了建立大型服务器对数据进行处理,而是利用嵌入式技术与流媒体技术有效结合,将前端对视频数据的处理都集中在ARM开发板上。系统实物架构如图1所示。

图1 系统架构实物图

本系统硬件平台以C6310作为核心处理器。在此芯片中集成了ARM1176核、ZSP800核等,同时在此还集成了LCD控制器、Camera控制器,ImageDMA模块。摄像头选择OV2655,支持RGB/YUV两种输出格式;客户端选用Android操作系统的智能手机。客户端通过3G上网的方式与视频采集端建立连接,用于获取实时视频流,并且在手机客户端处发出简单的控制指令,对前端的云台进行操作,从而达到控制摄像头角度转动的效果。图2为移动视频监控系统软件架构,整个系统工作流程如下:

1)前端摄像头采集视频流,以YUV442格式放置到申请的buffer中。

2)应用程序调用ZSP模块读取YUV buffer里的视频流按照H.264标准压缩进行硬件编码,将已经编码后的数据存放在缓冲区中。

3)从缓冲区中提取H.264视频流进行RTP封包,采用RTP/RTCP协议,最终通过socket通信将数据报发送出去。

4)在客户端Android手机上设计视频数据接收软件,对传来的视频流解码后播放。

图2 移动视频监控系统软件框图

2 软件设计

本文工作重心在于系统的软件设计,主要包括开发环境搭建和移动视频监控采集端软件设计两大方面。在采集端分为系统软件和应用软件,系统软件主要包括Bootloader、嵌入式Linux操作系统移植,驱动程序移植;应用软件包括视频采集,H.264编码压缩、RTP/RTCP协议传输应用程序设计编写。

2.1 嵌入式ARM-Linux开发平台搭建

嵌入式开发采用交叉编译方式,需要1台宿主机和1个开发板,开发过程在宿主机上完成,将编译后的可执行文件通过串口下载到开发板上。本系统主要涉及到Bootloader、Linux内核移植、根文件系统的构建及相关的应用程序设计。开发环境搭建流程如下:

1)下载Linux内核源码、交叉编译器。内核版本为Linux-2.6.36.tar.bz,交叉编译器选择版本为 arm920teabi-4.1.2.tar.gz。

2)打开ubuntu虚拟机,将下载的压缩包放置到指定目录下,打开终端解压缩。

3)根据使用的硬件平台修改Makefile文件。Makefile记录了编译所要遵守的规则,它决定哪些文件要编译、哪些文件先编译等,也决定了文件之间的依赖关系。

4)参照硬件手册修改并移植驱动程序,本系统中主要完成了摄像头驱动的移植,并将驱动编译成模块形式加载到内核中。

5)打开config文件夹,修改C6310_deconfig配置文件,将需要的驱动模块加载进去,不需要的屏蔽掉。

6)进入到内核目录下,执行make编译。

2.2 V4L2视频采集流程

Linux设备驱动,外围的硬件都被当作一个设备文件来看,通过调用驱动程序提供的接口,用打开文件的方式对硬件设备进行操作。设备文件存放在/dev目录下,视频设备文件存放完整路径为:/dev/video0,主设备号为81[3]。本系统中视频采集端主要用到了Camera控制器、ImageDMA、ZSP三大模块。Camera控制器驱动按照应用程序的要求通过I2C总线向摄像头发送各种控制命令;ImageDMA模块主要完成的功能是将缓冲区的数据取出来,并可以对图像的尺寸进行改变;ZSP模块主要完成对数据的编解码功能。视频采集基本步骤如下:接收到指令后调用Camera驱动程序打开视频设备,设置图像数据大小、格式以及每秒获取的帧数;申请内存缓冲区,视频数据入列、出列,输入输出队列都采用环形队列;采集完成毕后关闭视频设备。

本系统视频采集基于V4L2架构,用到V4L2驱动下重要结构体和提供的接口函数,应用程序发送控制命令使用ioctl操作,因此系统对每一种控制命令都要定义相应的ioctl控制命令和参数[4]。本设计流程用到的ioctl函数控制命令如下:

1)CAMERA_OPEN_SENSOR:该操作用于打开摄像头传感器并初始化。

2)VIDIOC_REQBUFS:用户向照相机驱动程序注册buffer。

3)VIDIOC_QBUF:编码器通知buffer编码完毕。

4)CAMERA_GET_VIDEO_MEMSIZE:获取视频数据使用内存的大小。

5)CAMERA_SET_VIDEO_MODE:设置图像输出帧参数。

6)CAMERA_GET_VIDEO_MODE:获得图像输出帧参数。

7)CAMERA_RELEASE:释放当前使用的摄像头。

本系统视频采集设计是以硬件为基础。前端的摄像头使用的是OV2655,该摄像头本身输出格式支持RGB565和YUV422两种格式,本文将摄像头原始输出格式设置为YUV422格式,因为该种格式便于以H.264标准压缩。图3为采集流程图。

图3 视频采集流程

视频采集流程描述为:

1)打开视频设备:接收到指令后,调用sensor驱动中的int powerup(void)接口函数,此函数表示摄像头传感器上电。并且这里使用非阻塞模式打开,使用非阻塞模式调用视频设备,即使没有捕获到信息,驱动程序依旧会把缓冲区里的视频流返回给应用程序。对应代码为:

2)当摄像头作为设备文件打开后,读取设备信息,选择视频输入,调用ioctl函数设置视频格式。本系统选用的摄像头输出格式为YUV422,图像大小设置为176×144。调用的主要函数为:

3)用户空间申请分配内存,通过VIDIOC_REQBUFS控制命令向驱动程序注册buffer,在这里并没有采用read,write等传统方式对数据操作,而是调用mmap内存映射函数把内核空间内存映射到用户空间。程序就可以直接对缓冲区中数据进行操作,极大地减少了数据交互时间,提高了效率。

4)启动视频采集命令,应用程序调用ioctl(cam_fd,VIDIOC_STREAMON,&type),摄像头开始采集,并把采集的原始数据存放到申请的YUV buffer中。

5)应用程序调用ioctl(cam_fd,VIDIOC_STREAMOFF,&type)函数,视频设备驱动程序即不再采集视频数据,并调用CAMERA_RELEASE释放当前使用的摄像头。

2.3 基于RTP/RTCP协议视频传输

本移动视频监控系统对实时性要求非常高,因此该系统必须具有低时延和低丢包率特性。TCP/IP是一种提供面向连接和可靠传输服务的协议,但重传和拥塞机制导致在本系统中实时性很难满足,影响了传输质量[5]。如果使用UDP,虽然其不保证提供可靠传输,甚至还有丢包的情况,但实时性可以保证,虽然丢了一些数据包,对用户整体感觉影响不大。

随着流媒体技术日益成熟,RTP/RTCP是目前解决流媒体实时传输的最好办法。RTP/RTCP协议是由实时传输协议RTP和实时传输控制协议RTCP两部分组成。RTP负责实时性数据传输,工作在UDP/IP之上。RTCP主要负责监测数据传输并管理控制信息,监视延迟并周期性地发送数据包和通知发送端。因此本系统采用RTP和RTCP配合使用,这样在保证视频流实时传输的同时也保证了QoS,达到传输效率的最优化。图4表示流媒体协议栈各个协议之间的关系。

图4 RTP/RTCP流媒体协议栈

本系统采用的是H.264压缩标准,实现H.264流媒体视频流传输的关键在于如何将媒体封装成RTP包。本文采用开源JRTPLIB库,JRTPLIB对RFC3550的实现进行了封装,将此开源库移植到采集端的开发板中。该库提供大量的API接口,应用程序通过调用接口函数,完成压缩数据的封包,并传输出去[6]。传输流程如下:

1)由客户端发出申请,服务器接收请求后给客户端一个响应,同时建立起连接。

2)按照RTP协议要求进行封装,将H.264码流封装成RTP包,RTP包封装在UDP包内并通过socket通信发送出去。

3)采集端周期性地发送RTCP包,并接收来自客户端含有客户统计信息的RTCP包。

客户端收到采集端的数据包后,分别经过IP/UDP/RTP层解析后,经手机解码后即可正常播放。系统的QoS基于RTCP协议实现,根据客户端的反馈信息动态调整视频发送速率。接收端生成反馈信息,封装成RTCP RR包发送到发送端。发送端根据反馈信息,来控制H.264码流封装RTP的速率,从而能够在带宽有限的网络条件下更好地传输。图5为视频流传输流程图。

图5 视频流传输过程

3 实验及结果分析

本文提出了一个基于V4L2的移动视频监控系统解决方案,系统采用Linux 2.6内核作为操作系统,采用C6310作为主控制器。系统以嵌入式技术为核心,将视频采集、传输、控制功能都集成在前端的开发板上,用户只须在手机上安装特定软件即可进行实时监控。将图像帧率设置为15帧/秒(f/s),用局域网模拟公网,图像清晰度能达到基本要求。图6为客户端显示的监控图像。本系统的最大优势在于避免建立大型服务器来对视频数据处理,极大地降低了硬件成本,非常适用于家居安防。在此系统上可以进行二次开发,利用传感器技术对家中的温度、湿度等各项指标实时查看,达到家庭智能化的效果。

图6 客户端监控画面

[1]卢秋波.视频监控技术简介与发展趋势[J].安防科技,2007(5):21-23.

[2]李珊珊,王绪国.基于V4L2的远程视频采集系统设计与实现[D].武汉:武汉理工大学,2011.

[3]姜璐.基于ARM的嵌入式移动视频监控的设计[D].上海:华东师范大学,2008.

[4]Sasoritattoo.基于Linux的V4L2视频架构驱动编写[EB/OL].[2011-12-20].http://www.linuxidc.com/Linux/2011-03/33022.htm.

[5]STEVENS R W.TCP/IP协议详解卷一:协议[M].北京:北京大学出版社,1999.

[6]张溢华,万晓榆,樊自甫.3G视频监控系统传输部分的设计[J].电视技术,2009,33(2):61-62.

猜你喜欢
视频流驱动程序调用
边缘实时视频流分析系统配置动态调整算法研究
基于视频流传输中的拥塞控制研究
核电项目物项调用管理的应用研究
LabWindows/CVI下基于ActiveX技术的Excel调用
计算机硬件设备驱动程序分析
铁路货场智能大门集装箱全景图像采集方法研究
基于系统调用的恶意软件检测技术研究
美国视频流市场首现饱和征兆
基于MPC8280的CPU单元与内部总线驱动程序设计
利用RFC技术实现SAP系统接口通信