王艳
(西安航空职业技术学院 计算机工程学院, 西安 710089)
无线通讯技术及智能手机的迅速发展和完善,为视频监控技术提供了强大的技术支撑,随着移动视频监控的不断发展,视频监控系统在各领域得到普遍应用,受到PC机不易移动的局限性,视频数据通过PC端获取的方式已经难以满足监控的移动需求,且传统视频监控还存在布线复杂程度较高、可拓展性较低等缺点,为使传统视频监控系统的问题得以有效解决,对移动视频监控系统的研究成为重要方向之一,实现通过远程视频图像监控。
该技术具备高效的压缩编码功能,音视频多媒体数据经其处理后以媒体流形式通过网络完成传输,移动客户端边播放边下载,无需下载完整文件,缩短了用户等待时间,并且已制定了相关标准。相比于PC机,移动视频监控终端设备的硬件资源有限但对实时性的要求较高,考虑到Android系统的CPU运算速度、缓存的局限,因此本文在设计移动视频监控系统时使用了流媒体实时传输协议(RTP),降低延迟,提高控制传输流的能力及系统的实时性,同时具备较强的自适应网络带宽资源能力[1]。
该技术主要由视频编码(规定了H.264 的编解码算法)和网络提取两层构成,具体的编码原理如图1所示。
图1 H.264视频编码器框图
具备较高的编码效率和网络友好性,视频编码层可有效描述视频内容,对原始视频中冗余时间、空间及统计通过使用离散余弦编码、运动估计等多种方法实现有效压缩。H.264使用了包括灵活宏块排序、多尺寸运动估计、环路去块效应滤波器,像素运动补偿等先进的辅助技术,以使压缩效率得以进一步提高;网络提取层对传输时的H.264 码流所需遵循的规范(在各种网络情况下)进行了详细规定,结合网络资源情况,依据视频的使用特征打包传送数据[1]。
本文采用Client/Server 架构完成移动视频监控系统总体架构的设计,在客户端、服务器端需分别对相应的软件功能进行开发,系统总体架构如图2所示。
图2 远程视频监控系统架构
主要由视频监控设备、视频服务器、监控客户终端三部分构成,各部分间的通信连接通过网络完成,采用摄像头完成监控视频采集端的原始视频数据的采集过程,摄像头通过云台的使用完成对旋转的控制,CMOS视频采集模块采集图像,AD转换模块完成所采集图像到数字图像的转换,并传送至终端服务器[2]。
在解码H.264 标准的视频时需先完成解码软件的移植,考虑到运算量较大的H.264解码算法复杂,本文采用软件包FFMPEG(C语言编码)来实现,作为一种音视频解码包,FFMPEG具备跨平台、源代码开放的优势,提高了录制、编码和流化音视频能力,从而实现了Linux及Android的高效兼容。通过将FFMPEG 代码包移植到Android操作系统即可对由H.264编码的视频数据进行解码,为对其他本地语言编写的代码进行调用,移植过程中由于是采用C语言编写的FFMPEG 软件包,Android 系统中C 程序的调用需使用Java 本地接口(JNI),本文通过JNI接口的使用完成了Java 虚拟机同应用程序间的相互调用,实现Java能够同本地代码间的互操作;为实现Android系统对C/C++程序的调用,JNI 可在基于Java的Android系统中被提供,这些接口由本地代码(其他语言编写)实现,需在Android系统中进行注册,Android系统JN I接口具体如图3所示。
图3 Android 系统 JNI接口
使用 FFMPEG前需先将FFMPEG代码编译成动态库,在通过JNI 技术完成 FFMPEG函数的调用[3]。
系统的核心在于基于Linux 系统的服务器,主要负责对视频进行捕获、通过H.264进行编码、进行RTP分包及云台控制等,对前端采集设备和后端用户的管理通过 SIP信令的转发完成, 摄像头采集到视频数据后,服务器会对 FFMPEG 音视频解码包进行调用,并在此基础上完成H.264 压缩编码,接下来的RTP打包则通过 JRTPLIB 库完成,实现用户客户端到服务器端的 RTP 连接的创建及通过Socket 接口进行的发送环节,确保了数据的实时传输功能的顺利实现;Android客户端通过服务器的访问,完成流媒体 RTP 数据包的接收,再通过JRTPLIB 库的使用完成拆包处理后存放至接收缓冲区,接下来完成 H.264 解码(提高调用 FFMPEG),最终视频播放、保存等通过调用Mediawork 库完成(视频播放数据格式为QCIF 或 CIF),帧速率超过20帧/秒、码率大于64kps[4]。
采用具备Android 系统的设备作为本文移动视频监控的终端设备,作为同用户进行交互的对象,客户端需确保具备基本的美观易于操作的界面的同时具备稳定的相关功能,软件系统功能构成具体如图4所示。
图4 软件系统构成
(1) 客户端界面的实现
应用程序用户界面的创建通过Android 操作系统提供的多个常见UI 控件实现,本文客户端UI 界面主要由四个界面构成(包括登陆认证、选择通道、设置参数、播放视频),具体的界面流程如图5所示。
图5 UI界面流程框图
Android系统中的 UI 控件基于两个类:View 和 ViewGroup,以Android 界面开发方法为依据,各界面需完成对应的 XML 布局文件的编写[5]。
(2) H.264 视频解码器的实现
作为移动监控客户终端的核心部分,视频播放主要通过接收RTP 数据包、H.264 解码及画面显示等过程完成,通过Android 系统采用软件方式对H.264 码流进行解码,SIP 会话通过无线网络传输到Android 系统(在移植完音视频编解码包后),Android 系统将有效的 RTP 数据包从中分拣出来,在此基础上拆包 RTP 完成有效负载的分解,实现 H.264标准编码过程(按照时间戳排序),即可获取最终的视频数据,经解码的 H.264 数据通过应用程序不断向视频播放界面传递,通过画面的不断刷新即可在移动客户端实现流畅视频的获取[5]。
(3) 播放功能的实现
在手机屏幕的视频播放界面播放并显示解码后的视频帧,本文播放功能的实现主要通过onDraw()函数的设计实现,在画面的显示需调用Android 系统自带的Canvason(一种函数Draw的参数是写图元素类的),在onDraw类中完成屏幕的分辨率的设置(通过屏幕宽、高度的获取);在一个buffer 字节类中传入经解码的数据完成图像的输出,再将这个字节类通过 onDraw函数的调用完成图像的显示,视频数据的解码通过调用DecoderNal()函数完成,有新的视频数据解码成功后则此函数解码后返回的数值大于 0 时,此时通过对屏幕进行刷新,从而显示新画面[6]。
(4) 控制系统的实现
使用 TCP/IP 协议完成传输过程以确保控制指令的可靠性,视频采集端云台设备通过客户端对应的功能按钮即可完成控制过程,Android 操作系统的TCP/IP 协议栈相对完整,通过 Socket网络即可完成应用程序的编程,从而实现系统控制指令的传输。基于Android的移动视频监控客户端播放的画面有较高的清晰流畅度,没有出现长时间的卡顿现象,能够满足远程移动监控需要。
本文在研究整个监控系统关键技术的基础上(包括视频编解码、移动流媒体、实时传输等),依据视频监控系统的体系结构,结合JNI 技术,完成了基于Android 智能终端的移动视频监控系统客户端的设计,通过在Android系统中设计H.264 视频解码器,实现监控终端到手持设备上的移植过程,该无线视频监控系统客户端的功能主要通过移动流媒体实现,弥补了传统的视频监控终端移动性较差的不足,用户通过网络即可接入网络实现移动实时的视频监控过程,不受时空限制,能够提供高效的远程移动视频监控服务。