鲍 轩,章坚武
(杭州电子科技大学通信工程学院,浙江杭州310018)
目前,国内外众多IT公司在移动视频监控领域,投入了大规模的人力物力进行项目研究与开发。移动视频相关技术也已经成为国内各高校和研究所的研究热点。基于无线网络将是今后监控设备的必然选择,移动智能终端是监控应用的最佳平台,随着3G成熟,LTE网络商用时代的到来,移动视频监控技术将逐步走向成熟与稳定[1]。本文介绍一种以Android智能手机为终端的音视频监控系统,该系统把网络视频监控和智能移动终端相结合,不仅克服了普通网络视频监控对监控客户端地点上的限制,还进一步缩短了处理紧急情况的反映时间。
Android是基于Linux开放性内核的操作系统,是Google公司在2007年11月5日公布的手机操作系统,Android采用软件堆层的架构,主要为3部分:底层以Linux核心为基础,提供基本功能;中间层包括函数库和虚拟机;最上层是各种应用软件[2]。
Android应用程序用Java语言编写,每个应用程序都拥有一个独立的Dalvik虚拟机实例,这个实例驻留在一个由Linux内核管理的进程中。Dalvik支持Java Native Interface(JNI)编程方式,Android应用程序可以通过JNI调用C/C++开发的共享库,实现“JAVA+C”的编程方式。开发Android应用程序最简捷的方式是安装Android SDK和Eclipse IDE。
Eclipse提供了一个丰富的Java环境,Java代码通过编译后,Android Developer Tools会将它打包,用于安装。
网络监控系统由服务器端(视频采集端)、网络和客户端(视频播放端)组成。服务器端将流媒体数据经过编码处理通过网络传输到客户端。客户端可以通过一系列的处理恢复原始流媒体数据,也可以根据用户需求发送控制命令,实现对前端设备的控制操作,如云台控制等[3]。如图1所示。
图1 音视频监控系统
服务器端包括4个模块,它们是数据采集,数据压缩,数据打包和RTP包发送。数据采集模块负责将音视频模拟信号转化为数字信号。为了减少网络传输的数据量和提高传输效率从采集模块得到的数据必须通过压缩模块进行处理。音视频分别选用了G.711和H.264压缩标准。数据打包模块负责将数据添加一些必要包头信息(如数据类型,时间信息,序列号等),在客户端通过包头中的信息来实现音视频同步。RTP包发送模块的作用是将已经打包好的数据通过网络发送到客户端。
客户端的各个模块是服务器端的逆过程,在网络传输过程中由于网络延迟等原因会导致接收到的RTP数据包顺序打乱,数据缓存模块是用于恢复数据包的正常顺序,从缓存模块出来的数据传入同步调整模块,最后将同步调整后的数据包传入数据解压模块和播放模块。
对于网络监控系统来说,如果音视频不同步,那么监控对象的真实情况就无法正确反映,将会给监控人员带来不便。本文提出了一种解决音视频不同步的有效方法。在服务器利用RTP包中的时间戳来标记每帧音视频数据的时间信息,然后再将打上时间戳的音视频流通过网络发送给客户端。在客户端用一个缓存来消除数据流中的延时时延和恢复数据包的顺序。最后将数据流送入音视频同步调整模块进行同步播放。在同步调整模块中,利用时间戳进行同步调整时需要在客户端设计一个参考时钟,依据接收到音视频时间戳和参考时间之间的关系来判断当前音视频数据是立即播放还是延时播放甚至是之间丢弃。视频信息中有关键帧的判断,所以这里的参考时钟主要以视频为主。
同步调整算法如下:将接收到音视频数据分别放到各自的缓存中,当缓存存到一定数量时,开始播放,同时进行同步调整[4]。当音频时间戳大于视频时间戳一定值时,说明音频落后于视频,需要等待。当音频时间戳小于视频时间戳一定值时,说明音频超前于视频,需要加快播放,这里采取的是丢弃音频包,来达到加快播放的速度。
音视频播放的线程设计如图2所示,在接收视频数据时,由于首帧进入解码器的不是关键帧,会导致解码器崩溃,所以把视频数据写入缓存前先要进行一个关键帧的判断。当缓存区写入一定数量数据时,才开始读数据。再获取各自的时间戳信息,在音视频播放前进行同步调整,最后达到同步播放的效果。
图2 音视频播放的线程设计
在监控系统中,视频的编码压缩是十分关键的工作。H.264是目前最先进的视频压缩算法,它是由视频编码层VLC和网络提取层NAL两部分组成[4]。H.264标准对编码效率和图像质量进行了诸多改进,且抗丢包性能和抗误码性能好,适应各种网络环境,非常适合于对压缩率要求高,网络环境复杂的移动视频监控。
客户端接收的数据是经过H.264编码压缩后的数据,需要经过H.264解码还原视频图像后才能够显示,因此,H.264解码器是客户端的关键部分。这里移植了开源的音视频解码库FFmpeg进行H.264解码[5]。在Android应用程序中使用FFmpeg的步骤如下:
(1)在Linux环境下安装Android原生开发工具包NDK;
(2)创建jni文件夹,将FFmpeg工程复制到文件夹下;
(3)创建Android.mk文件,分别在LOCAL_SRC_FILES和LOCAL_C_INCLUDES项中添加编译模块所需源文件和头文件目录;
(4)执行NDK开发包中的build脚本,生成对应的.so共享库,并复制到Android工程下的libs/armeabi目录下;
(5)在Android程序中通过System.loadLibrary(“H.264Android”)加载所需要的库,加载成功后,应用程序就可以使用H264Decoder函数进行H.264的解码。
通过实验室的测试,服务器端发送H.264视频数据和G.711音频数据,客户端安装在Android手机上,通过WIFI接入无线网络与服务器建立连接。可实现云台控制,设防报警等操作。视频画面质量主要是受码率(数据传输时单位时间传输的数据位数)和帧率(每秒显示图片数)的影响,码率越大画面越清晰,帧率越大画面越流畅。如图3所示,左图显示的是帧率为10fps,码率300kbps时视频效果。右图显示的是帧率为15fps,码率在300kbps时视频效果。而在音视频同步方面,感受不到音视频不同步的感觉。
图3 监控客户端画面
随着3G时代,数据传输速度有了大幅提升,为移动实时视频业务的实现创造有利的条件,本文设计的这款基于android手机的音视频监控软件,在实际应用中具有较大的意义。
[1] 田俊静,张波,黄湘情.Android基础教程[M].北京:人民邮电出版社,2010:25-31.
[2] 郭宏志.Android应用开发详解[M].北京:电子工业出版社,2010:21-27.
[3] 吴静,侯玉华.移动视频监控业务技术方案分析[J].信息通信技术,2009,10(5):36-42.
[4] 王庆娟.移动视频监控系统的研究与设计[D].广州:华南理工大学,2009:57-62.
[5] Butler,Margaret.Android:Changing the mobile landscape[J].IEEE Pervasive Computing,2011,10(1):4-7.