论文部分内容阅读
摘要:介绍了Darwin streaming server(DSS)源码的架构和核心流程;详细分析了Darwin streaming server的关键技术:媒体封包和流量控制;最后给出了Darwin streaming server的应用实例。
关键词:RTP;流媒体;Darwin Streaming Server(DSS)
中图分类号:TP311文献标识码:A文章编号:1009-3044(2008)35-2118-02
Research and Application of the Darwin Streaming Server
WANG Zhi-gang,ZHOU Nan,GAO Qing
(School of Computer Science & Technology, Soochow University,Suzhou 215006,China)
Abstract:This paper introduces the architecture and the core flow of the Darwin streaming server(DSS) source code, then discusses the key technology in detail :Media Data Packetization and Flow Control, at last it shows an example Applications of DSS.
Key words: RTP; streaming media; darwin streaming Server (DSS)
1 引言
作为新一代互联网应用的标志, 流媒体技术在近几年得到了飞速的发展, 并且广泛应用于远程教育、网络监控、视频点播等系统之中。目前在流式媒体领域,有三种占有主导地位的产品,它们分别是Apple公司的Quick Time、Microsoft公司的Media Server以及Real公司的Real System。Darwin Streaming Server(简称DSS)是QuickTime Streaming Server开放式源代码的版本,同时支持FreeBSD、Linux、Solaris、Windows NT和Windows 2000等多个操作系统,是当前所有同类产品中支持平台最多的一个。
2 Darwin流化服务器介绍
Darwin Streaming Server(简称DSS)是QuickTime Streaming Server开放式源代码的版本,目前最新的版本是6.0.3。DSS源代码完全采用标准C++语言写成,编程风格非常优秀,每一个C++类都对应着一对和类同名的.h/.cpp文件。整个服务器包括多个子系统,分别存放在独立的工程内,其中,最为重要的是基础功能类库(Common Utilities Lib)和流化服务器(Streaming Server)两个工程。表1给出了这个两个模块的具体功能。
表1 DSS 程序模块架构分类及功能
3 Server程序详细分析
整个DSS的运行是以模块(Module)为基础,以角色(Role)来分类各项任务的(Task),每一个角色都是为完成某一特定的任务而设定的。当客户端提出请求时,DSS会根据该请求属于哪一个角色来启动适当的模块。如前所述,Server Core 主要分三大模組:Server Core,RTSP subsystem 及RTP subsystem。Server从开始到结束整个流程也大概分为这三个部分。
3.1 Server Core(Startup & Shutdown)
图2 为程序启动与结束时的流程图。服务器在启动的时候,会首先装载没有被编译到服务器里面的模块(即动态模块),然后再装载编译为服务器一部分的模块(即静态模块)。在模块装载完成之后,服务器会调用每个QTSS模块的Register(注册)角色,每个模块都必须支持这个角色。在Register角色中,模块会调用QTSS_AddRole函数来指定自己支持的其它角色。接下来服务器就以Initialize(初始化)角色调用每一个注册支持该角色的模块。Initialize角色执行模块所需要的任何初始化任务,比如分配内存和初始化全局的数据结构。然后进入聆听(Listen)的状态接收客户端的RTSP 请求。
3.2 RTSP 子系统
在服务器调用所有注册了Initialize角色的模块之后,就已经为接收来自客户端的请求做好准备了,这些请求就是RTSP请求。当服务器收到一个RTSP请求时,就会创建一个RTSP请求对象,接着服务器会根据预先定义好的顺序,调用各个模块的相关角色,如图3所示。在处理RTSP请求的时候,服务器调用的第一个角色是RTSP Filter(过滤器)角色。之后,服务器就会对请求进行解析。RTSP请求解析完成之后,服务器会以RTSP Route(路由)角色调用所有注册了该角色的模块,并传入一个RTSP对象。在调用了所有RTSP Route角色之后,服务器就会以RTSP Preprocessor角色调用每个注册了该角色的模块。如果请求的类型互相匹配,则RTSP Preprocessor角色就调用QTSS_Write或者QTSS_WriteV函数来向客户发送数据,对客户端进行响应。如果没有RTSP Preprocessor角色对RTSP的请求进行响应,则服务器就以RTSP Request(请求)角色调用成功注册了该角色的模块(第一个注册RTSP Request角色的模块,是唯一一个可以注册RTSP Request角色的模块)。RTSP Request角色负责响应所有没有被RTSP Preprocessor角色(的模块)处理过的RTSP请求。RTSP Request角色对请求进行处理之后,服务器就调用注册了RTSP Postprocessor角色的模块。处理RTSP Preprocessor或者RTSP Request角色的模块可能需要为特定的客户会话生成一些媒体数据。如果这样的话,模块可以通过调用QTSS_Play函数来实现,这个函数会使模块的RTP Send Packets(RTP发送数据包)角色被调用,即进入RTP子系统。
3.3 RTP子系统
RTP subsystem 主要包括RTP 封包传送及RTCP串流控制两部份。在封包传送方面,RTP Send Packets角色调用QTSS_Write或者QTSS_WriteV函数,在RTP会话的基础上向客户发送数据。当RTP Send Packets角色发送完成一些数据包之后,就会把控制权返回给服务器,并指定服务器下次调用模块的RTP Send Packets角色的间隔时间。这个周期会一直重复,直到所有的媒体数据包被发送完成,或者由于客户请求的原因需要暂停或中止客户会话为止。在串流控制方面,当Server 接收到RTCP 封包时会先判定此RTCP 封包属于哪一种,根据封包的种类,Server 会呼叫相应的模块进行处理。
4 服务器关键技术研究
在了解了DSS整个运行流程的基础上,本文主要研究了下面两个重点:DSS对媒体资料的封包的算法和服务器端如何控制流量。这两者的目的都是在使得客户端的播放能够清晰流畅。
4.1 媒体封包切割(Media Data Packetization)
在封包切割前,我们必须得到以下的几个信息:
1) 在单一RTP 封包中能容纳的最大QuickTime 媒体数据尺寸(Maxima QT Media Data Size, MQD)
2) 此种媒体数据其所有取样(Sample)尺寸是否固定?(Constant QT Sample Size, CQS)
3) 此种媒体数据其所有取样的持续期间(Duration)是否固定?(Constant QT Duration , CQD)
4) 当所有取样尺寸固定时其取样尺寸为多少?(Constant Sample Size, CSS)
5) 当取样尺寸不固定时其某一个取样的大小(Sample Size, SS)
根据以上的信息,DSS 采用三种封包切割方式:
1) (CQS=true)and(CQD=true)and(CSS<=0.5 * MQD)把多个取样封装成一个RTP 封包,同时每个RTP标头中M 字段设为1,QT 标头中的PCK 字段也设为1。(RTP 标头中M 字段设为1,表示此为某一取样的最后一个封包;QT 标头的PCK字段表示该封包切割所采用的方式。)
2) ((CQS=false)or(CQD=false))and(SS<=05 * MQD)数个取样封装成一个RTP 封包,同时此一RTP封包标头的M 字段设为1,QT 标头中PCK 栏位设为2。
3) 不符合(1)和(2)的情况时,采用之。单一的取样被封装成一个或数个RTP 封包中,同时最后一个属于该取样的RTP 封包之M字段设为1,其它设为0;QT 标头PCK 字段设为3。由于客户端必须以一个取样为单位进行封包重组,因此根据RTP 的M 字段及QT 的PCK 字段,可以知道此一封包所采用的分割方式,同时采取相应的封包重组方法。另外在处理某一封包遗失时,也可以快速决定是否该丢弃与其相关的封包,增进客户端的效率。
4.2 流量控制(Flow Control)
DSS 利用客户端传送回来的RTCP 封包信息以及变量“Quality level”来达成流量控制的机制。这些信息包括“Loss Rate”,“Getting better”以及“Getting worse”消息。
1) 封包遗失率(Loss Rate):
如果客户端的RTCP 回报中封包遗失率连续数次大于某一数值(此值为一百分比定值,由程序给定,称SLossThinTolerance),则将ratchetless 设为True,表示需要调降传输速度。如果RTCP 回报中封包遗失率连续数次小于某一数值(此为一百分比定值,称为SLossThickTolerance),则将ratchetmore 设为True。
2)“Getting Worse”及“Getting Better”:如果客户端的RTCP 发出“Getting Worse”的消息,则直接将ratchetless 设为True。如果客户端的RTCP 发出“Getting Better”的消息,则直接将ratchetmore 设为True。由ratchetless 或ratchetmore 的设定,可以调整QualityLevel 的数值。DSS 根据QualityLevel 的数值大小来决定传输速度的快或慢,进而达到一部份的流量控制的目的。
5 DSS应用实例
作为一个运行于多个操作系统平台的开发源代码的服务器,其不但功能强大、易于操作,而且DSS还提供了一种称为Module的二次开发接口。使用这个开发接口,我们可以充分利用服务器的可扩展性及其实现的多种协议,并且能够保证和将来版本兼容。这样就可以分为两种用途:直接使用和二次开发使用。
5.1 直接使用DSS
作为一个具有工业强度的产品,DSS完全可以直接用在我们项目中,例如,利用Vara software公司的Wirecast可以采集USB Camer实时的影音图像,然后通过简单的设置后发送给DSS,通过DSS传送出去,这样就可以建立我们的实时影音服务器。同时,如果存在大量客户端,我们可以利用DSS的中继功能通过简单的增加PC机的数量来满足我们的需求,简单快捷,成本也并非一定高于找开发人员开发程序。
5.2 二次开发使用
我们可以利用DSS作为平台进行二次开发,如增加对媒体格式的支持,增加客户身份认证,增加对媒体内容的管理等模块,使DSS成为一个符合实际需求的实用系统。抱此目的的读者在掌握DSS整体流程的基础上,应着重于其二次开发平台(如Module)以及底层文件和媒体格式支持库的研究。
6 结束语
作为三大主要流式媒体应用中唯一一个开放源代码的产品,DSS让开发人员能够从最底层研究流式媒体技术,事实上,当前国内外许多公司正是在DSS的基础上开发了自己的流式媒体相关产品,而且通过研究DSS, 我们学习到了高级网络编程(Socket)、多线程之间的通信、任务调度、系统资源(CPU、磁盘等)的合理利用以及用于流式媒体的多个标准协议(RTP/RTCP、RTSP、SDP)的具体实现等等。这也是我们研究源码的意义所在。
参考文献:
[1] Apple Computer Inc. QTSS Modules Programming Guide, 2006.
[2] Sven Hessler, Michael Welzl. An Empirical Study of the Congestion Response of RealPlayer, Windows Media Player and QuickTime. IEEE. 2005.
[3] 黄拔峰,钟明,杨传均,张家钰.Darwin Streaming Server的研究与应用[J].计算机工程,2004(10):134-135.
关键词:RTP;流媒体;Darwin Streaming Server(DSS)
中图分类号:TP311文献标识码:A文章编号:1009-3044(2008)35-2118-02
Research and Application of the Darwin Streaming Server
WANG Zhi-gang,ZHOU Nan,GAO Qing
(School of Computer Science & Technology, Soochow University,Suzhou 215006,China)
Abstract:This paper introduces the architecture and the core flow of the Darwin streaming server(DSS) source code, then discusses the key technology in detail :Media Data Packetization and Flow Control, at last it shows an example Applications of DSS.
Key words: RTP; streaming media; darwin streaming Server (DSS)
1 引言
作为新一代互联网应用的标志, 流媒体技术在近几年得到了飞速的发展, 并且广泛应用于远程教育、网络监控、视频点播等系统之中。目前在流式媒体领域,有三种占有主导地位的产品,它们分别是Apple公司的Quick Time、Microsoft公司的Media Server以及Real公司的Real System。Darwin Streaming Server(简称DSS)是QuickTime Streaming Server开放式源代码的版本,同时支持FreeBSD、Linux、Solaris、Windows NT和Windows 2000等多个操作系统,是当前所有同类产品中支持平台最多的一个。
2 Darwin流化服务器介绍
Darwin Streaming Server(简称DSS)是QuickTime Streaming Server开放式源代码的版本,目前最新的版本是6.0.3。DSS源代码完全采用标准C++语言写成,编程风格非常优秀,每一个C++类都对应着一对和类同名的.h/.cpp文件。整个服务器包括多个子系统,分别存放在独立的工程内,其中,最为重要的是基础功能类库(Common Utilities Lib)和流化服务器(Streaming Server)两个工程。表1给出了这个两个模块的具体功能。
表1 DSS 程序模块架构分类及功能
3 Server程序详细分析
整个DSS的运行是以模块(Module)为基础,以角色(Role)来分类各项任务的(Task),每一个角色都是为完成某一特定的任务而设定的。当客户端提出请求时,DSS会根据该请求属于哪一个角色来启动适当的模块。如前所述,Server Core 主要分三大模組:Server Core,RTSP subsystem 及RTP subsystem。Server从开始到结束整个流程也大概分为这三个部分。
3.1 Server Core(Startup & Shutdown)
图2 为程序启动与结束时的流程图。服务器在启动的时候,会首先装载没有被编译到服务器里面的模块(即动态模块),然后再装载编译为服务器一部分的模块(即静态模块)。在模块装载完成之后,服务器会调用每个QTSS模块的Register(注册)角色,每个模块都必须支持这个角色。在Register角色中,模块会调用QTSS_AddRole函数来指定自己支持的其它角色。接下来服务器就以Initialize(初始化)角色调用每一个注册支持该角色的模块。Initialize角色执行模块所需要的任何初始化任务,比如分配内存和初始化全局的数据结构。然后进入聆听(Listen)的状态接收客户端的RTSP 请求。
3.2 RTSP 子系统
在服务器调用所有注册了Initialize角色的模块之后,就已经为接收来自客户端的请求做好准备了,这些请求就是RTSP请求。当服务器收到一个RTSP请求时,就会创建一个RTSP请求对象,接着服务器会根据预先定义好的顺序,调用各个模块的相关角色,如图3所示。在处理RTSP请求的时候,服务器调用的第一个角色是RTSP Filter(过滤器)角色。之后,服务器就会对请求进行解析。RTSP请求解析完成之后,服务器会以RTSP Route(路由)角色调用所有注册了该角色的模块,并传入一个RTSP对象。在调用了所有RTSP Route角色之后,服务器就会以RTSP Preprocessor角色调用每个注册了该角色的模块。如果请求的类型互相匹配,则RTSP Preprocessor角色就调用QTSS_Write或者QTSS_WriteV函数来向客户发送数据,对客户端进行响应。如果没有RTSP Preprocessor角色对RTSP的请求进行响应,则服务器就以RTSP Request(请求)角色调用成功注册了该角色的模块(第一个注册RTSP Request角色的模块,是唯一一个可以注册RTSP Request角色的模块)。RTSP Request角色负责响应所有没有被RTSP Preprocessor角色(的模块)处理过的RTSP请求。RTSP Request角色对请求进行处理之后,服务器就调用注册了RTSP Postprocessor角色的模块。处理RTSP Preprocessor或者RTSP Request角色的模块可能需要为特定的客户会话生成一些媒体数据。如果这样的话,模块可以通过调用QTSS_Play函数来实现,这个函数会使模块的RTP Send Packets(RTP发送数据包)角色被调用,即进入RTP子系统。
3.3 RTP子系统
RTP subsystem 主要包括RTP 封包传送及RTCP串流控制两部份。在封包传送方面,RTP Send Packets角色调用QTSS_Write或者QTSS_WriteV函数,在RTP会话的基础上向客户发送数据。当RTP Send Packets角色发送完成一些数据包之后,就会把控制权返回给服务器,并指定服务器下次调用模块的RTP Send Packets角色的间隔时间。这个周期会一直重复,直到所有的媒体数据包被发送完成,或者由于客户请求的原因需要暂停或中止客户会话为止。在串流控制方面,当Server 接收到RTCP 封包时会先判定此RTCP 封包属于哪一种,根据封包的种类,Server 会呼叫相应的模块进行处理。
4 服务器关键技术研究
在了解了DSS整个运行流程的基础上,本文主要研究了下面两个重点:DSS对媒体资料的封包的算法和服务器端如何控制流量。这两者的目的都是在使得客户端的播放能够清晰流畅。
4.1 媒体封包切割(Media Data Packetization)
在封包切割前,我们必须得到以下的几个信息:
1) 在单一RTP 封包中能容纳的最大QuickTime 媒体数据尺寸(Maxima QT Media Data Size, MQD)
2) 此种媒体数据其所有取样(Sample)尺寸是否固定?(Constant QT Sample Size, CQS)
3) 此种媒体数据其所有取样的持续期间(Duration)是否固定?(Constant QT Duration , CQD)
4) 当所有取样尺寸固定时其取样尺寸为多少?(Constant Sample Size, CSS)
5) 当取样尺寸不固定时其某一个取样的大小(Sample Size, SS)
根据以上的信息,DSS 采用三种封包切割方式:
1) (CQS=true)and(CQD=true)and(CSS<=0.5 * MQD)把多个取样封装成一个RTP 封包,同时每个RTP标头中M 字段设为1,QT 标头中的PCK 字段也设为1。(RTP 标头中M 字段设为1,表示此为某一取样的最后一个封包;QT 标头的PCK字段表示该封包切割所采用的方式。)
2) ((CQS=false)or(CQD=false))and(SS<=05 * MQD)数个取样封装成一个RTP 封包,同时此一RTP封包标头的M 字段设为1,QT 标头中PCK 栏位设为2。
3) 不符合(1)和(2)的情况时,采用之。单一的取样被封装成一个或数个RTP 封包中,同时最后一个属于该取样的RTP 封包之M字段设为1,其它设为0;QT 标头PCK 字段设为3。由于客户端必须以一个取样为单位进行封包重组,因此根据RTP 的M 字段及QT 的PCK 字段,可以知道此一封包所采用的分割方式,同时采取相应的封包重组方法。另外在处理某一封包遗失时,也可以快速决定是否该丢弃与其相关的封包,增进客户端的效率。
4.2 流量控制(Flow Control)
DSS 利用客户端传送回来的RTCP 封包信息以及变量“Quality level”来达成流量控制的机制。这些信息包括“Loss Rate”,“Getting better”以及“Getting worse”消息。
1) 封包遗失率(Loss Rate):
如果客户端的RTCP 回报中封包遗失率连续数次大于某一数值(此值为一百分比定值,由程序给定,称SLossThinTolerance),则将ratchetless 设为True,表示需要调降传输速度。如果RTCP 回报中封包遗失率连续数次小于某一数值(此为一百分比定值,称为SLossThickTolerance),则将ratchetmore 设为True。
2)“Getting Worse”及“Getting Better”:如果客户端的RTCP 发出“Getting Worse”的消息,则直接将ratchetless 设为True。如果客户端的RTCP 发出“Getting Better”的消息,则直接将ratchetmore 设为True。由ratchetless 或ratchetmore 的设定,可以调整QualityLevel 的数值。DSS 根据QualityLevel 的数值大小来决定传输速度的快或慢,进而达到一部份的流量控制的目的。
5 DSS应用实例
作为一个运行于多个操作系统平台的开发源代码的服务器,其不但功能强大、易于操作,而且DSS还提供了一种称为Module的二次开发接口。使用这个开发接口,我们可以充分利用服务器的可扩展性及其实现的多种协议,并且能够保证和将来版本兼容。这样就可以分为两种用途:直接使用和二次开发使用。
5.1 直接使用DSS
作为一个具有工业强度的产品,DSS完全可以直接用在我们项目中,例如,利用Vara software公司的Wirecast可以采集USB Camer实时的影音图像,然后通过简单的设置后发送给DSS,通过DSS传送出去,这样就可以建立我们的实时影音服务器。同时,如果存在大量客户端,我们可以利用DSS的中继功能通过简单的增加PC机的数量来满足我们的需求,简单快捷,成本也并非一定高于找开发人员开发程序。
5.2 二次开发使用
我们可以利用DSS作为平台进行二次开发,如增加对媒体格式的支持,增加客户身份认证,增加对媒体内容的管理等模块,使DSS成为一个符合实际需求的实用系统。抱此目的的读者在掌握DSS整体流程的基础上,应着重于其二次开发平台(如Module)以及底层文件和媒体格式支持库的研究。
6 结束语
作为三大主要流式媒体应用中唯一一个开放源代码的产品,DSS让开发人员能够从最底层研究流式媒体技术,事实上,当前国内外许多公司正是在DSS的基础上开发了自己的流式媒体相关产品,而且通过研究DSS, 我们学习到了高级网络编程(Socket)、多线程之间的通信、任务调度、系统资源(CPU、磁盘等)的合理利用以及用于流式媒体的多个标准协议(RTP/RTCP、RTSP、SDP)的具体实现等等。这也是我们研究源码的意义所在。
参考文献:
[1] Apple Computer Inc. QTSS Modules Programming Guide, 2006.
[2] Sven Hessler, Michael Welzl. An Empirical Study of the Congestion Response of RealPlayer, Windows Media Player and QuickTime. IEEE. 2005.
[3] 黄拔峰,钟明,杨传均,张家钰.Darwin Streaming Server的研究与应用[J].计算机工程,2004(10):134-135.