文献标识码:A
DOI:10.16157/j.issn.0258-7998.2015.08.035
中文引用格式:张彤,芦爱余,莫建文. 基于Darwin的多平台多用户直播、点播系统设计[J].电子技术应用,2015,41(8):124-127.
英文引用格式:Zhang Tong,Lu Aiyu,Mo Jianwen. Design of live video streaming, video-on-demand system based on Darwin[J].Application of Electronic Technique,2015,41(8):124-127.
0 引言
随着3G、4G移动互联网的发展,市场上利用手机等移动设备实现视频会议的方案越来越多。无论哪种方案,基本都是由移动设备客户端、服务器端、视频播放客户端三部分组成。而视频播放客户端不外乎采用客户端/服务器端(C/S)或浏览器/服务器端(B/S)架构。代表性的方案有利用WEBRTC实现基于谷歌浏览器的视频会议系统[1-2]。这种B/S架构的用户通过系统内置的摄像头和麦克风采集视频图像和语音信号,通过谷歌浏览器接入Internet建立连接,在网络传输层利用RTP/RTCP协议实时传输语音和视频数据给其他客户端。这种架构的优点是无需安装插件即可在浏览器上打开视频会议,但是视频编码采用VP8编码方式,大部分手机不提供支持,而且在多人视频会议时,会因带宽不足影响会议质量。基于C++的crtmpserver流媒体服务器[3]使用RTMP[4]协议,在Linux平台下运行,支持将手机上传的RTMP流转发、存储的功能。RTMP协议的客户端是Flash,可以很好地支持B/S架构的流媒体服务器设计。然而RTMP协议基于TCP/IP协议,不支持UDP协议,所以网络负荷比UDP大,传输速度也要比UDP慢。
本系统采用开源的Darwin流媒体服务器对实时视频流进行处理,结合开源库mp4v2[5]实现实时视频的转发和录制。Darwin服务器[6]基于RTSP协议进行传输,相比RTMP协议,支持TCP/IP协议和UDP/RTP协议,具有更高的实时性。系统使用手机硬编码实时采集音视频数据。C/S播放客户端采用开源RTSP架构live555[7]结合开源编解码库ffmpeg实现视频直播、点播播放。B/S播放客户端采用Html5[8]技术实现视频点播,由支持RTSP协议的VLC Flash插件实现直播。
1 多平台播放解决方案模型
系统由移动设备客户端、服务器端、视频播放客户端三部分组成。本文中实验的移动客户端为支持安卓系统的手机,通过调用手机设备上的摄像头和麦克风,进行音视频采集。由于在3G网络下服务器访问手机移动IP地址需要“打洞”,故采用手机主动推送的方式进行视频传输。服务器端采用支持RTSP协议的Darwin Stream Server开源服务器,负责RTSP流的转发,因不支持视频存储功能,所以结合开源库mp4v2实现服务器端视频流的录制,存储手机客户端采集的视频到服务器上。播放客户端包括C/S架构的PC播放客户端和B/S架构的浏览器客户端,实现在播放列表中直播或点播文件。系统整体架构如图1所示。
2 手机端设计
2.1 手机端方案
利用手机本身硬件的编码功能,视频采用H264编码,音频采用AAC编码,将编码后的音视频数据封装到RTP包中发送到服务器端。手机客户端主要由音视频采集及编码模块、RTP/RTCP[9]数据压缩及控制模块、RTSP传输控制模块三部分组成,流程框图如图2所示。
2.2 模块设计
(1)音视频采集及编码模块
采用MediaRecorder类,首先调用该类的setAudioSource和setVideoSource设置音视频采集源,再通过该类的setAudioEncoder()和setVideoEncoder()设置音视频的编码方式。以h.264视频编码为例,调用该类中的SetoutputFile函数绑定LocalSocket实现。在编码过程中可以使用硬编码的方式,硬编码是在预览过程提前确定视频的sps、pps、head(一般为0x00000001)。
(2)RTP/RTCP数据压缩及控制模块
RTP包传送可以基于UDP或者TCP,采用TCP作为传输层协议注重可靠性而不是及时性,在RTP传输过程中应用很少,大部分RTP包发送都是采用UDP方式。在RTP会话过程前,发送方需要确定接收方的目标IP及接收端口。
(3)RTSP传输控制模块
RTSP协议作为应用层协议,RTSP命令的传输是基于TCP协议,RTSP本身不作为数据传输的协议,而是作为一种流媒体传输过程的控制协议。
通过RTSP与服务器进行音视频流媒体传输有两种方式:拉模式和推模式。拉模式是主从模式,拉方(例如视频播放客户端)需要维护各个被拉方(例如摄像头)的状态,如url信息、端口信息等,只有拉方主动请求被拉方告知相应信息才能启动。推模式主动权在推方(本文即为安卓移动设备端),从接方(本文即为Darwin服务器)来看,只要做好标准接口即可,无需关注有多少推方会推送数据。由于移动设备在3G网络下,如果选择拉模式,同一个网段下还需穿透NAT,即“打洞”,不方便做远程音视频传输,所以选择推模式下的视频传输。
3 Darwin服务器端设计
本系统中服务器端负责转发和存储音视频数据,主要由RTSP连接建立模块、视频转发模块及视频录制模块三部分构成。视频播放客户端发送RTSP请求,Darwin流媒体服务器通过Modules发送数据包来回复客户,处理相应的RTSP请求。Darwin服务器作为流媒体客户端的中继代理,移动设备在RTSP协议中的ANNOUNCE命令携带.sdp文件到Darwin服务器接收sdp的目录文件中。此后视频播放客户端就可以通过rtsp://
3.1 RTSP连接建立模块
Darwin Streaming Server定义了RTSPListenerSocket Class,它继承自TCPListenerSocket Class,用于对RTSP连接请求进行处理,进入RTSP状态机。通过RTSPSession对象完成对请求类型的匹配,如果匹配成功,则注册QTSS_RTSPPreProcessor_Role角色的模式。在这个角色模式下,进入QTSSReflectorModule类处理了每种RTSP消息,比如本次RTSP请求的Describe、Setup、Play指令。该类中针对各种请求指令都有对应的单独函数处理,分别对应着DoAnnounce、DoDescribe、DoSetup和DoPlay函数。除此之外,RTSP状态机的终结点所在位置也是在QTSSReflectorModule类中,通过Shutdown()函数实现RTSP会话的结束。
3.2 视频转发建立模块
当收到一路RTSP连接请求时,在DSS中为RTSPSession类对象,首先需要解析请求头部是否为转发请求,进而解析其请求的后续部分。进行查询字符串的解析,得到需要转发的具体url,建立一路面向url源的会话,通过Describe命令获取到sdp信息进行保存,再转发到请求Describe的客户端,而且Setup、Play分别将对应的响应码返回给客户端,在转发具体的数据时,建立一路ReflectorSession,将获取到的rtp数据转发到添加进ReflectorSession转发列表的客户端中。
3.3 视频录制模块
要实现视频录制,首先需要找到音视频RTP数据包,然后将编码过后的H264视频和AAC音频数据从RTP包中按续提取出来,并以MP4文件格式封装,最后存成文件。在Darwin服务器中的ProcessRTPData()函数内部处理处理接收到的RTP包,提取char* packetData数据传递到MP4文件生成函数中。具体通过创建MP4文件句柄、设置时间标度、添加h264视频轨道及aac音频轨道[10]、添加序列参数集和图像参数集,最后再写入文件的方式生成MP4文件。具体视频存储步骤如下:
(1)通过MP4Create创建MP4文件句柄。
(2)通过MP4SetTimeScale设置时间标度,即每秒的时钟ticks数。
(3)通过MP4AddH264VideoTrack添加h264视频track,MP4AddAudioTrack添加aac音频track。
(4)通过MP4AddH264SequenceParameterSet和MP4AddH264PictureParameterSet添加序列参数集和图像参数集。
(5)通过MP4WriteSample写一帧视频数据或写一段音频数据。
其中duration这个参数是用来实现音视频同步用的,如果设置错了会造成音视频不同步,甚至会出现crash现象。对于视频流MP4WriteSample函数,每次调用是录制前一帧数据,用当前帧的时间戳和前一帧的时间戳计算duration值,然后把当前帧保存下来在下次调用MP4WriteSample时用,写音频数据一样。
(6)通过MP4Close关闭打开的MP4文件。
4 B/S架构及C/S架构客户端设计
4.1 C/S架构客户端原理
C/S架构的播放客户端通过支持RTSP的开源live555构建与手机移动客户端的RTSP通信,通过开源编解码框架ffmpeg的解码功能进行解码。
通过live555构建RTSP的过程为:首先创建BasicTaskScheduler和BasicUsageEnvironment对象,用于调度不同事件。创建RTSPClient对象,由RTSPClient对象向服务器发送RTSP中的OPTION消息命令并等待接受回应,返回SDPDescription字符串即sdp文件内容。在任务调度while循环中配置所有子会话对象,为每个子会话创建RTPSource和RTCPInstance对象,并创建两个GroupSock对象。将每个GroupSock对象中创建的socket描述符置入 BasicTaskScheduler::fReadSet中,RTPSource对象的创建的依据是SDPDescription。由RTSPClient对象向服务器发送SETUP消息并接受回应,while循环中为每个子会话创建接收器FileSink对象,由RTSPClient对象向服务器发送PLAY消息并接受回应,FileSink的缓冲区和包含写入文件操作的一个函数指针配置给RTPSource对象,这个缓冲区将会在networkReadHandler中接收来自网络的视音频数据。
获取到音视频数据后,通过ffmpeg[11]的解码功能进行解码处理,流程如图3所示。
avformat_open_input函数对输入的文件名进行解析,并发起与Darwin服务器的RTSP交互。在数据读取线程中,使用rtsp_read_packet函数用于每个RTP包的读取和第一次排序解析。首先调用rtp_read函数从缓冲区获取数据,然后通过包队列交给RTP解析函数rtp_parse_packet进行第一次解析。第一次解析的目的是对包进行重新排序,解决因为网络抖动导致接收到的包序列号不连续的问题。具体是根据RTP协议解析RTP包头信息,对RTP包头的包序列号按递增顺序重新排序。然后调用av_parser_parse2函数对RTP包进行第二次重组帧解析,目的是将包中的数据重新按帧进行组合,组成一帧数据的avpacket。
4.2 B/S架构的实现
B/S架构的服务器端采用Apache服务器,Web客户端采用HTML5的技术直接播放缓存在Darwin服务器下的MP4[12]视频。Web客户端通过访问Darwin服务器下录制视频存放的文件夹,获取mp4后缀的文件名,输出到Web客户端播放列表中。Web客户端实现图片保存及视频大小控制等功能。注册VLC的ActiveX[13]嵌入到网页中,实现直播功能。B/S架构播放客户端如图4所示。
5 测试及分析
根据上述设计,客户端采用B/S架构的Web客户端及C/S架构的PC客户端均可正常观看直播视频,通过mp4v2可实现视频存储功能。本系统服务器使用中国电信100M光纤网络,用60个B/S架构及C/S架构客户端分3组同时请求3路手机推送视频。3路手机视频端码率均设为为500 kb/s,视频采集分辨率分别为320×240、640×480、720×1 280,并在720p分辨率的条件下分3次在中国联通3G网络、中国电信3G网络及无线WiFi网络下分别统计手机移动客户端的视频播放延迟时间。其中服务器所用的硬件环境为:中央处理器:Inter Core I5-2 450 M 2.5 GHz双核四线程;内存:4 GB DDR3 1 333 MHz;硬盘:5 400 rad/min;操作系统:32位 Windows7 操作系统。
播放客户端通过RTSP请求观看直播,请求如:rtsp:// 202.193.53.103/teststream.sdp,由sdp文件名区分不同推送视频源。表1统计了在中国联通3G网络、中国电信3G网络及无线WiFi网络下分别统计手机移动客户端的视频播放延迟时间。
通过60个客户端同时请求服务器连接,表明服务器在带宽为100M光纤网络的条件下,可以同时满足60个用户同时请求连接。客户端同时请求的数量由服务器网络带宽决定。通过分别在中国联通3G网络、中国电信3G网络及无线WiFi网络下推送视频的播放延迟区别表明,系统整体满足不同网络条件下的需求,具有较好的实时性。
6 结束语
本文通过移动设备客户端、服务器端、视频播放客户端组成的系统架构阐述了一个新的视频直播、录制及多平台播放的解决方案。详细讨论了移动设备客户端音视频采集及传输方案、服务器端的转发及存储方案,以及视频播放客户端的两种架构,分析了基于live555的RTSP通信过程及基于mp4v2的视频存储过程,开发出了整套直播、点播系统。同时,设计了相应的测试实验,为实现高可靠、高实时性的视频直播系统提供了一种较为可行的方法。
参考文献
[1] ELLEUCH W.Models for multimedia conference between browsers based on WebRTC[C].Wireless and Mobile Computing,Networking and Communications(WiMob),2013 IEEE 9th International Conference on,IEEE,2013:279-284.
[2] RHINOW F,VELOSO P P,PUYELO C,et al.P2P live video streaming in WebRTC[C].2014 World Congress on WCCAIS,2014:1-6.
[3] 丁杰,潘晨光,田源.基于crtmpserver的手机直播系统[J].计算机工程与设计,2014,35(9):3173-3178.
[4] 姜浩然,徐林.基于RTMP的流媒体服务器的研究[J].计算机与数字工程,2011,39(10):104-108.
[5] 史红周,黄晁.一种基于MP4文件的视频流关键帧索引播放方法[J].微电子学与计算机,2002,19(7):44-47.
[6] 李新乐,苏鸿根.流媒体搜索和发布技术在移动设备上的应用[J].计算机工程与设计,2009,30(6):1428-1431.
[7] 茅炎菲,黄忠东.基于RTSP协议网络监控系统的研究与实现[J].计算机工程与设计,2011,32(7):2523-2526.
[8] 罗大晖,陈娟.基于HTML5的Web离线应用研究与实现[J].计算机应用与软件,2012,29(12):262-264.
[9] 李校林,刘海波,张杰,等.RTP/RTCP,RTSP在无线视频监控系统的设计与实现[J].电视技术,2011,35(19):89-92.
[10] 韦崇岭,裴海龙.基于无人机平台H264视频传输系统的设计与实现[J].计算机测量与控制,2012,20(1):209-211.
[11] 刘丽霞,边金松,张琍,等.基于FFMPEG解码的音视频同步实现[J].计算机工程与设计,2013,34(6):2087-2092.
[12] 李兴华,杨天奇.MP4共享FLV数据研究与实现[J].微型机与应用,2014(3):31-34.
[13] ZHU G,ZHANG F,ZHU W,et al.HTML5 based media player for real-time video surveillance[C].Image and Signal Processing(CISP),2012 5th International Congress on.IEEE,2012:245-248.