黄俊伟,巴 义
(重庆邮电大学通信与信息工程学院,重庆 400065)
随着信息化产业的高速发展,人们对自己的生活居住环境也提出了更高的需求。在智能家居大力推广下,视频监控作为其中的一个重要模块也已经备受关注。移动视频监控是指用户通过3G手机上网方式随时随地观看远程监控端的视频。目前市面上主要存在着两种视频监控系统类型,一种是以数字录像设备为核心的传统视频监控系统,另一种是以嵌入式技术为核心的视频监控系统。本文所设计的视频监控系统正是基于后者,该系统与传统的相比较,不需要复杂布线,实时性强、性能稳定、成本低廉,并且整体架构简洁,客户端由手机代替传统的PC监控,方便用户使用[1]。因此这种以嵌入式技术为核心,将嵌入式技术、流媒体技术、网络技术结合为一体的监控系统具有很强的研究意义。而监控前端一体化也正是未来发展的方向。
V4L2(Video for Linux 2)是Linux中关于视频设备的内核驱动,并已成为Linux 2.6的标准接口。目前V4L2可以支持多种设备,并提供了视频采集接口、视频输出接口、直接传输视频接口等。基于V4L2的视频采集采用流水线方式,操作极为简单方便,应用程序通过调用V4L2提供API完成对摄像头的基本操作[2]。很多操作都是通过调用iotcl函数来实现设备的打开、关闭,以及设置图像格式等。
本文设计理念是基于家庭智能化而提出的设想。通过在家中门窗等重要位置安装摄像头,用户只要在有手机信号覆盖的范围下,通过手机上网的方式就可以对家庭的情况进行实时监控[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 移动视频监控系统软件框图
本文工作重心在于系统的软件设计,主要包括开发环境搭建和移动视频监控采集端软件设计两大方面。在采集端分为系统软件和应用软件,系统软件主要包括Bootloader、嵌入式Linux操作系统移植,驱动程序移植;应用软件包括视频采集,H.264编码压缩、RTP/RTCP协议传输应用程序设计编写。
嵌入式开发采用交叉编译方式,需要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编译。
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释放当前使用的摄像头。
本移动视频监控系统对实时性要求非常高,因此该系统必须具有低时延和低丢包率特性。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 视频流传输过程
本文提出了一个基于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.