侯沛德,杨军平,许存禄
(兰州大学信息科学与工程学院,甘肃兰州 730000)
随着无线网络以及流媒体在技术基础、传输速率等方面的飞速发展,智能终端性能的不断提高,极大的促进了移动流媒体的发展,进而促进移动多媒体业务的普及。在国内外市场上,主要推出的是数字控制的模拟视频监控和数字视频监控两类产品。前者技术发展已经非常成熟、性能稳定,并在实际工程应用中得到广泛应用,特别是在大、中型视频监控工程中的应用尤为广泛;后者是新近崛起的以计算机技术及图像视频压缩为核心的新型视频监控系统,该系统解决了模拟系统部分弊端而迅速崛起,但仍需进一步完善和发展。目前,第三代基于网络摄像机的网络视频监控系统正兴起,以它特有的优势会逐步成为监控系统新的潮流。
众所周知,视频信息具有直观性、确切性、高效性、广泛性等特点,但视频信息量太大,要视频得到有效应用,首先需解决视频压缩编码问题,其次解决压缩后视频质量保证的问题,因此既要有较大的压缩比,又要保证一定的视频质量。2003年3月,ⅠTU-T/ⅠSO正式公布了H.264视频压缩标准,它具有的目前最高压缩效率使它成为了无线系统的最佳候选标准[1]。
笔者主要针对目前较为流行的ⅠOS平台,实现了基于ⅠOS平台下移动流媒体数据的接收、解码、丢包处理、播放、录制视频等功能。采用了RTSP协议对视频进行封装发送,同时采用H.264编码标准,在保持监控系统特点的前提下,尽量将编解码过程在达到监控系统的要求下做到最简与最优,因此对FFmpeg开源框架进行研究,优化该框架的解码部分,最终实现ⅠOS平台上的实时解码工作[2]。
本系统的设计目标是通过iPhone手机客户端,实现对视频监控系统所获得的视频图像的实时获取并实时显示在客户端屏幕上,从而实现移动终端的实时视频流监控。一般移动流媒体服务器系统包括三个部分:①与流媒体服务器相连接的视频摄像头;②流媒体服务器;③移动终端,这样用户就可以利用此系统来查看所需要监控的地方。图1所示为文中视频监控系统的基本架构,各个子系统的功能如下。
(1)web服务器:该部分负责对系统的管理,主要对视频列表及相关信息的管理等。
(2)流媒体服务器:该部分负责将获取的视频流信息进行编码、分流、响应客户端的请求以及发送请求的对应流媒体数据流等。
(3)移动终端:该部分完成查看实时监控视频画面以及云台控制的工作。
视频监控系统中视频传输播放的流程图如图2所示,各个模块功能介绍如下。
(1)摄像头负责原始视频数据的采集,它不用去考虑传输数据的格式。
(2)将原始视频数据解析拆包处理,去除冗余信息,并将其转换为解码过需要的格式,本系统需要标准的H.264编码格式的数据。
(3)在客户端进行解码,恢复出所需要的图像数据并缓存在客户端。
(4)将缓存的图像数据在客户端以UⅠⅠmage为载体显示出来。
图1 视频监控系统的基本架构
图2 视频传输播放的流程图
超文本传输协议,是Web服务中常用的一种协议,通过发送HTML来完成数据通信,也支持多媒体数据的传送。
RTP(Real-Time Transport Protocol)是一种针对多媒体数据流传输的协议,该协议支持一对一和一对多的传输情况,同时可提供时间信息和实现数据流同步。RTP协议大多数情况下通过UDP来传输数据,当然也支持TCP。当一个应用程序开始一个RTP会话时,会使用两个端口:一个用来支持RTP,另一个是为RTCP提供服务。RTP本身并不能按顺序传送数据包提供可靠的传输机制,也不提供流量控制或者拥塞控制,这就需要RTCP来协助完成。
RTCP(Real-Time Transport Control Protocol)与RTP协议协调工作,共同提供流量控制和拥塞控制的服务。在RTP的会话期间RTCP扮演着质量监督检测员的身份。RTP在RTCP的配合下,可以有效的进行反馈而达到减小开销提高传输效率的目的。
实时流协议RTSP(Real-Time Streaming Protocol)是有Netscape和RealNetworks提出的。使用该协议,可以通过ⅠP网络完成一对多的数据通信工作。RTSP协议可以很好的控制多个数据链路,并且提供选择基于RTP上发送机制的解决方案。从体系结构方面来讲,它处于RTP和RTCP协议的上层,使用了RTP或TCP协议进行数据传输,RTSP协议利用流技术将数据分成数据包,而数据包的大小可以由网络的带宽所决定。用户不需要下载整个媒体文件就可以实现播放,具体的播放过程为:客户端下载完成并解码第一个数据包进行播放的同时,对已经下载好的第二个数据包进行解码,而同时下载第三个数据包。通过RTSP协议就可以让服务器端跟踪流媒体在传输过程的时间,地址,方式,并可以实现暂停,快放等交互功能。
H.264和以前的标准一样,也是DPCM加变换编码的混合编码模式。但它采用“回归基本”的简洁设计,加强了对各种信道的适应能力,采用“网络友好”的结构和语法,有利于对误码和丢包的处理;应用目标范围较宽,以满足不同速率、不同解析度以及不同传输(存储)场合的需求。
技术上,H.264在所有码率下都能持续提供较高的视频质量。H.264能工作在低延时模式以适应实时通信的应用(如视频会议),同时又能很好地工作在没有延时限制的应用,如视频存储和以服务器为基础的视频流式应用。H.264提供包传输网中处理包丢失所需的工具,以及在易误码的无线网中处理比特误码的工具。
在系统层面上,H.264在视频编码层(Video Coding Layer,VCL)和网络提取层(Network Abstraction Layer,NAL)之间进行概念性分割,前者是视频内容的核心压缩内容之表述,后者是通过特定类型网络进行递送的表述,这样的结构便于信息的封装和对信息进行更好的优先级控制。
从官方网站上下载FFmpeg的源码,由于FFmpeg针对不同版本和硬件处理器,在内部处理上会有区别,因此需要区别于不同的环境相应改变编译脚本,才能保证FFmpeg在ios平台下的正确使用。我们依次编译对armv7、armv7s以及i386的支持,重新建立bash脚本来合并静态库,,编译成功之后就会生成六个静态库,分别是 Libavcodec.a、Libavdevice.a、Libavfilter.a、Libavformat.a、Libavutil.a、Libswscale.a。在这些静态库中,主要会用到Libavcodec.a和Libavformat.a这两个库,Libavcodec.a这个库主要功能包括视频的编解码工作以及网络协议;而Libavformat.a这个库则提供了我们所需要的绝大多数的媒体格式。
采用ⅠOS系统自带的UⅠⅠmage作为最终的显示,具体实现流程如下。
(1)利用HTTP协议请求摄像头设备端口的相关信息,以此来构建视频流数据的RTSP地址。
(2)构建RTSPClient类来协调视频流数据的传输,接收以及解码等操作,最后传输图像数据到视频播放器来进行显示,它由TcpSocket类,VideoFrame-Extractor类,TypeChange类,AsyncUdpSocket类分工协调完成全部工作。
TcpSocket类初始化输入输出流,并为建立基于UDP的socket链接提供相关信息;syncUdp-Socket类是 UDP/ⅠP socket网络库,包装自 CFSocket,用于UDP视频流数据的传输,RTSP视频流数据默认采用UDP协议进行传输或者组播,会导致在私有网络下视频流数据不能正常传输的问题,需要把视频流的传输模式强制转换成TCP传输来保证视频数据流的传输,Tcp-Socket利用TCP传输模式来向视频解码类VideoFrameExtractor传输视频流数;Type-Change类提供数据类型相互转换的一些接口;VideoFrameExtractor类用于视频流数据解码、抽取、转换以及录像及云台控制实现,它利用FFmpeg将视频数据流抽取成一帧一帧的图片,然后以每秒30帧左右的速率,用ⅠOS系统类UⅠⅠmageView 播放这些图片。
因为网络环境的不稳定造成视频流数据传输的不稳定,所以可能导致播放不流畅、拖影等问题,有时候会出现一卡一卡的现象,因此需要一个帧率控制算法,来动态调节帧率,使视频播放在一个相对稳定的状态。具体则需要设定三个阀值:①最大帧数的阀值MAX_FRAME_COUNT(30);②最小帧数的阀值MⅠN_FRAME_COUNT(15);③帧率改变之后等待下一次改变的值WAⅠT_FRAME_COUNT(15)。
当实际解码的帧数大于最大帧数的阀值(MAX_FRAME_COUNT),则加大帧率的值,加大之后,需要等待若干帧数(WAⅠT_FRAME_COUNT),再进行下一次判断。
当实际解码的帧数小于最小帧数的阀值(MⅠN_FRAME_COUNT),则减少帧率的值,减少之后,需要等待若干帧数(WAⅠT_FRAME_COUNT),再进行下一次判断,帧率的改变最好每次控制在8%左右,这样人的肉眼相对难以察觉到帧率的变化,为用户提供相对舒适的播放效果。最终实现效果如图3所示。图3为ⅠOS模拟器实现的实时视频流播放效果图,该图像是320×240像素大小的视频。
图3 视频传输播放的效果图
采用RTSP协议实现了基于ⅠOS的实时视频监控系统,基本满足了用户实时查看监控视频的要求,后续工作可根据无线网络自身的特性,进行更加有效的视频编码、帧率控制以及丢包处理优化来降低视频的延时性以及提高图像的清晰度,使用户有更加友好体验。
[1] 毕厚杰.新一代视频压缩编码标准-H.264/AVC[M].北京:人民邮电出版社,2005.
[2] 王 磊.基于x264的智能手机监控系统的设计与研究[D].昆明:昆明理工大学,2012.
[3] Apple 官方开发文档[EB/OL].网址 https://developer.apple.com/library/ios/navigation/.