潘永健
广东鼎华科技股份有限公司 广东佛山 528000
摘要: 随着流媒体技术、无线网络技术以及视频压缩技术的不断进步,视频监控系统的应用日益广泛和深入。为解决网络视频传输过程中存在丢包、延时等问题,提高基于Android 平台的高清监控视频在移动客户端的播放效果,本研究分析一种采用基于Android 平台的优化设计方案,旨在为用户随时随地监看高清监控视频提供一个技术解决方案。
关键词:监控视频系统;Android平台;数据解码
视频监控技术是无线网络技术、流媒体技术以及视频监控技术等多种技术融合的产物。而监控视频系统作为现代安防系统的重要组成部分,以其方便、直观、信息内容丰富等多方面的优点在安防系统中发挥着越来越重要的作用。当前,无线通信技术和多媒体技术的发展,为视频监控管理系统性能的提升提供了强大的技术支持。
1.问题的提出
无线网络视频监控系统主要由四个部分组成,分别是摄像机、有线或无线网络、视频服务器和移动应用客户端。这是结合音视频处理、网络通信、数据存储等多种信息技术的综合体。基于Android 平台的移动视频监控系统相比PC 机桌面式终端的监控系统,极大地扩展了监控应用的灵活性与范围,并且充分调用各个模块的硬件性能优势,进而在降低系统通信开销的同时提高了应用的拓展性[1]。
无线视频播放是移动高清视频监控系统的主要功能,它是基于Android 平台移动监控终端的核心技术。目前在视频监控领域主要采用VLC 等开源技术,实现视频封装、编解码和播放等功能,VLC 中包含live555 和ffmpeg 两个重要的类库。其中,Live555 主要使用RTSP 协议来支持各种编码格式的音视频数据,进行流化、接收和处理等。而ffmpeg 拥有音频/视频编解码库libavcodec,它为流化的音视频数据提供转换和编解码等的完整解决方案。经过ffmpeg 解码完成之后,使用VLC 在移动客户端视频监控系统程序界面上进行视频播放。当live555 将接收到的视频数据包选择网络用户数据报协议( UDP) 作为视频流的传输协议时,因UDP 协议是基于非连接的、只负责发送不负责检查发送结果的不可靠协议,这种不可靠性使得live555数据包进行视频传输时产生数据帧丢失现象。
而当live555 使用TCP 协议实施数据传输时,由于TCP 协议是基于连接的、按顺序接收的可靠协议,这种可靠协议若遇到过大的网络数据流量,很容易发生节点路由设备因数据堵塞而出现缓冲区溢出现象,从而会使视频数据包发生丢失现象。以上两种传输模式都会造成视频播放出现马赛克、花屏等影响播放效果的现象。
2.优化设计方案
2.1 视频编译环境优化设置
本优化设计主要基于Libvlcjni.so 库进行设计。在Android 视频播放应用程序开发中, libVLC 给Android应用程序的接口库提供了一个功能强大的Libvlcjni.so 库。在多个网络协议支持层面, libvlcjni.so 开发库支持RTP、HTTP、RTSP 等多种网络应用协议,是一个成熟稳定的开源播放器开发库[2]。
客户端视频播放器通过libVLC 提供的libvlcjni.so 中的JNI 接口函数来实现高清监控视频控制和播放。在实际研究测试中,由于VLC 项目对LINUX 平台的支持最好,因此首先需要依托LINUX 平台来编译VLC,并从中下载获取libvlcjni.so 库。
在编译之前,首先需要搭建针对Android 平台的软件编译环境,包括: AndroidSDK、NDK、JDK 等一些列开发配置工具。经过测试,发现在LINUX 操作系统下的Ubuntu15.10 环境中交叉编译VLC for Android获取libvlcjni.so 库效率较高,具体设计如下:
编译宿主主机系统: Ubuntu 16.04 LTS;
Android 原生开发包NDK 版本: androidndk-r10;
Android 软件开发包SDK 版本: android-sdk-22;
Java 开发包JDK 版本: jdk-1.8.0_65;
VLC for Android 的编译环境搭建完成后,进入根目录,使用shell 脚本“. /compile. sh”开始编译实施。在项目环境的编译过程中, shell 脚本文件会自动从网络下载基于的源代码。VLC 作为具备多种格式音视频解码器的多媒体播放器,能作为基于unicast 或multicast 设计的流媒体服务器在IPv4 或IPv6 的高速有线无线网络环境下使用。系统编译完成后会在主文件夹下的libs 文件夹中生成重要的libvlcjni.so 库和其他相关的接口类库,此时可将整个libs 文件夹拷贝到Android 客户端项目文件中,那么在后期的项目程序开发过程中便可调用libvlcjni.so 库,实现移动视频播放功能的开发。
2.2 优化视频播放器的设计
libVLC 作为VLC for Android 提供给用户二次开发所封装的接口库。它封装了复杂的VLC 架构,在开发过程中,只需要将这些类和接口函数包含到工程项目中,就可直接调用预置的、封装好的类和函数[3]。具体过程如下:
第一步: 声明对象。首先声明一个IVideoPlayer对象m_videoPlayer,它代表视频播放器对象。接着声明一个libVLC 对象m_libVLC,视频播放、暂停等操作都由它来承担。
IVideoplayer m_videoplayer;
LibVLC m_LibVLC;
第二步: 创建LibVLC 视频播放器实例。首先利用已声明的m _ libVLC 对象调用其中的getinstance( ) 函数获取到一个实例。然后利用m_libVLC 调用attachSurface( ) 函数来绑定播放器m_IVideoPlayer 和视频播放窗口视图s_View。
m_libVLC = LibVLC. getinstance( ) ;
m_ libVLC. attachSurface ( s _ View,m _ Video-Player) ;
第三步: 创建视频播放表。首先利用MediaList创建一个列表实例m_List,然后将网络视频地址添加到m_List 实例中,该地址连接着视频服务器的视频源,等待用户点击链接地址的访问。
MediaList m_List =m_LibVLC.getmediaList( ) ;
m_List.add( new media( m_Libvlc, libVLC.Path-ToURl( Url) , false) ;
第四步: 实现视频播放功能。利用m_libvlc 对象通过调用playIndex( ) 函数来解析播放列表中的视频链接地址。
m_libVLC.playIndex( 0) ;
第五步: 实现视频播放器停止播放功能。实现这个功能的同时要完成三项任务。首先需要通过m_libvlc 对象调用Stop( ) 函数实现视频播放的停止,然后利用m_libvlc 对象的detachSurface( ) 函数来解除s_View 和m_LibVLC 两者之间的链接绑定,最后使用destroy( ) 函数来释放对象占用的资源,并销毁m_libVLC 对象。
m_libVLC.stop( ) ;
m_libVLC.detachSurface( ) ;
m_libVLC.destroy( ) ;
2.3 获取H.264 视频数据设计
在高清视频监控领域目前主要使用H.264 这种视频编码标准。基于H.264 的视频流帧结构序列由I、B、P 三部分组成。在视频数据中,视频都是由若干个顺序图像组成。在H.264 序列图像里的第一个图像都由I 帧图像组成,也被称为IDR 图像。I帧图像是图像解码的核心句法元素,I 帧可直接解码,一旦发生错误或丢失,该视频序列的后续图像信息几乎不可能再被正确解码出来[4]。而P 帧数据的解码则需要在I 帧的基础上。当用户观看视频时,通过移动终端点击URL 地址,VLC 调用live555 模块展开H.264 视频流数据的获取。H.264 视频数据获取过程主要分为三个层次,RTP 层、NAL 层、VCL层。见图1。
图1 H.264 视频数据获取层次
RTP 视频数据获取层是基础层。在这一层系统将通过RTP 协议来传输H. 264 视频,它对从H.264视频中获得的数据信息中剥离出每个网络适配层单元,然后在每个单元前添加相应的起始码:0x000001,用来指示一个NALU 的起始和终止位置。最后将包含RTP 协议的起始码和网络适配单元数据包发送出去。
NAL 视频数据抽取层是中间层。在这一层基础层传输来的数据包解析为NAL 头、RBSP 原始字节序列负荷两部分,对NAL 数据包头实施解析判断,并做出两种处理方式。第一判断是否有特殊字符标记,若有错误则对数据包进行抛弃处理,若正确则将NAL 数据包送到VCL 视频编码层。在做完这个判断后,系统自动释放数据链表所占用的内存资源,并对下一个RTP 数据包的起始编码更新,以实现前后数据的连接。
VCL 视频数据编码层处于最顶层,主要采用运动补偿预测,变换编码和熵编码等一系列手段对数据重新编码、压缩、封装,使视频内容得以更高效地传输、播放,以确保送到客户端解码器端的网络适配单元符合标准的顺序[4]。
2.4 建立缓冲验证机制
视频帧数据缓冲验证机制工作建立主要是为了消除网络状况不佳或其他原因而引起的RTP 数据包被动丢失和因延时时间过长而引起的数据主动丢弃所带来的H.264 视频解码错误。H.264 视频帧缓冲验证机制运行处于RTP 层与NAL 层工作时序之间,基本设计思想如下: 首先在数据获取层和数据解析层之间建立一个H.264 视频帧数据缓冲验证机制层。然后从RTP 数据层中获取一个完整视频帧所有信息的RTP 数据包,并把RTP 数据包指针存储在缓冲层的一个队列中。接着利用NAL 包头中的结束标志位来定位一个视频帧结束位置。最后对缓冲层中视频帧数据进行前后序列号验证,如果前后帧序列号连续且完整,则说明RTP 数据正确,如果序列号有错误或不连续,则说明这一视频帧信息不完整或有错误在其中。为了避免错误数据被VLC 送到ffmpeg 进行视频解码,该验证机制有效防止了解码错误的扩散,对在下一个I 帧到来之前的视频帧采用丢弃策略。
3.实验测试
对于以上的优化设计策略的合理性和实际使用效果,实验采用了模拟网络丢包测试,即在视频数据每隔500 个数据包传输完成后,人工丢弃一个数据包的策略。在实验过程中采用对比法利用同一视频在“未经修改的VLC 播放器”和“优化后的VLC 播放器”中进行播放效果测试,测试视频数据分为两种,第一种为码率上限1 024 Kbit /s,分辨率为720P,测试结果第二种为码率上限2 048Kbit /s,分辨率为1 080 P。
从两组实验测试效果可以看出,未经优化的视频播放器在播放视频时由于原始视频数据在传输时发生了丢包错误,最终出现了因视频帧数据信息不完整而无法正确解码所产生的马赛克、亮斑、杂色等影响观看效果图像,这一现象尤其是在暗部区域和边缘区域表现更为明显。而优化后的视频播放器由于系统采取了一系列合理的优化处理方法,使得视频播放器不会接收错误数据包并实施解码,因而播放出来的视频就没有出现花屏和马赛克等现象。因此,从本实验数据可以得出: 基于Android 平台的高清监控视频系统的优化设计对于因数据传输丢包、编解码误差、网络延时时间过长等引起的错误视频数据能够有效处理,保证了播放内容的清晰度。
4.结束语
综上,为了能够给用户提供提供安全可靠更高效的安防服务,本研究提出一种基于Android 平台的视频监控系统的优化设计方案。系统经过测试表明,优化设计方案能够有效解决网络视频因丢包和延时带来的视频播放不清晰的问题,提高视频监控的准确性。能够为完善基于Android的高清视频监控系统设计提供一定的借鉴。
参考文献:
[1]王瑞. 基于Android的高清视频监控系统的研究设计[D]. 青岛大学, 2016.
[2]常志沛. 基于Android的智能手机视频监控系统的设计与实现[D]. 大连海事大学, 2011.
[3]李江. 基于Android的4G网络移动高清视频监控系统关键技术的研究[D]. 浙江大学, 2016.
[4]刘诚, 段红光, 巴义. 基于Android移动视频监控系统客户端的研究与设计[J]. 电视技术, 2013, 37(4):85-88.
论文作者:潘永健
论文发表刊物:《防护工程》2018年第12期
论文发表时间:2018/10/22
标签:视频论文; 数据论文; 数据包论文; 监控系统论文; 视频播放论文; 协议论文; 系统论文; 《防护工程》2018年第12期论文;