EasyDarawin流媒体服务器介绍
介绍:
Easydarwin流媒体服务器,是由国内开源流媒体团队维护的一款流媒体框架,号称通过一定的优化能够达到非常高的性能,据说国内很多IPTV厂家,都是基于此开源框架,进行相关的流媒体开发的,所以其用作流媒体基础框架的搭建,是非常合适的。EasyDarwin是EasyDarwin开源流媒体平台的流媒体服务部分,基于Apple的开源项目Darwin Streaming Server(DSS)来开发和扩展应用的,支持RTSP点播、直播功能,同时其集成nginx服务器库文件,从而实现了HLS的扩展支持。Easydarwin本身提供了一个可跨平台的代码框架,很容易的实现代码的跨平台移植,在设计上遵循高性能,简单,模块化等程序设计原则,很容实现功能的修改、重用和扩展,是开发流媒体服务器的很好的框架工具。
Easydarwin是高性能并发服务器,所以这里涉及到一个设计模式Reactor,其采用了Reactor的并发服务设计模式,当有事件发生时则完成相应的Task,Task的完成是通过调用相应的handle来实现的,对于handle的调用是由有限个数的Thread来完成的。时间线程充当Reactor模式中的事件分离器,任务线程充当Reactor模式中事件处理器。
由于Easydarwin是基于DSS框架来开发和扩展,其基础代码框架仍采用DSS,因此这里先介绍下DSS的基础框架。
这里主要参考下面文章进行阐述,复制留档:
http://www.cnblogs.com/lidabo/archive/2014/07/14/3843679.html
DSS的核心服务器部分是由一个父进程所fork出的一个子进程构成,该父进程就构成了整合流媒体服务器。父进程会等待子进程的退出,如果在运行的时候子进程产生了错误从而退出,那么父进程就会fork出一个新的子进程。可以看出,网络客户和服务器直接的对接是由核心服务器来完成的。网络客户RTSPoverRTP来发送或者接受请求。服务器就通过模块来处理相应的请求并向客户端发送数据包。
核心流媒体服务通过创建四种类型的线程来完成自己的工作,具体如下:
服务器自己拥有的主线程。当服务器需要关闭检查,以及在关闭之前记录相关状态打印相关统计信息等任务处理时,一般都是通过这个线程来完成的。
空闲任务线程。这个任务线程是用来对一个周期任务队列的管理,主要管理两种任务,超时任务和Socket任务。
事件线程。套接口相关事件由事件线程负责监听,当有RTSP请求或者收到RTP数据包时,事件线程就会把这些实践交给任务线程来处理。
任务线程。任务线程会把事件从事件线程中取出,并把处理请求传递到对应的服务器模块进行处理,比如把数据包发送给客户端的模块,在默认情况下,核心服务器会为每个处理器核创建一个任务线程。关系如图所示:
二.相关协议介绍
如果要使用QuickTime流媒体服务器的编程接口,您应该熟悉该服务器实现的互联网工程组织(Internet Engineering Task Force,简称IETF)协议,列举如下:
实时流媒体协议(Real Time Streaming Protocol,简称RTSP)
实时传输协议(Real Time Transport Protocol,简称RTP)
实时传输控制协议(Real Time Transport Control Protocol,简称RTCP)
对话描述协议(Session Description Protocol,简称SDP)
(1).实时流媒体协议
当我们需要创建并且对一个或多个时间的同步且连续的音视频的媒体数据流控制的时候,我们需要用到RTSP协议,也就是实时流协议。RTSP并不是通过连续的数据流来创建并控制媒体流数据的,所以不会产生媒体流与控制流的交叉。用另外一种说法就是,RTSP本身是对流媒体服务器的远程控制。为了时间实时音视频数据的受控(快进,暂停)以及按需分配流,这个协议为我们提供了可实现的框架。实时流控制协议可以用在对多个数据发送的会话,通过UDP或者TCP方式,以及基于RTP发送方式来实现。
(2).实时传输协议
RTP协议是互联网上进行媒体数据的一种传输协议,为了实现一对一或者一对多的同步传输和提供时间信息,我们就会采用RTP协议。由于其典型应用建立在UDP传输之上,但也能在TCP或者ATM等其他协议上使用这个协议。实时传输协议本身只能对确保数据的实时性以及完整性,但并不对传输的顺序以及传输可靠性提供保障。由于是建立在UDP协议之上,所以RTP协议本身并没有提供流量控制或者阻塞控制,所以在一般情况下我们需要使用RTCP来进行这些帮助。由于DSS本身默认的传输协议就是RTP协议,而RTP协议需要通过RTCP协议进行流量控制,这样很大程度上增加了机顶盒也就是解码端的CPU处理压力,因此本设计采用UDP协议直接对TS包进行发送,不使用RTP协议进行数据封装,由于UDP协议也缺少流量控制机制,我们使用PCR值来对发送流量进行控制以防止接收端出现缓存溢出影响播放质量。
(3).实时传输控制协议
实时传输控制协议的作用是管理传输的质量,也就是在进程间传输的同时相互交换信息。在建立RTP会话的时候,参与传输的双方周期性的传输RTCP包,这个数据包中包含了所有相关传输的信息,比如数据包大小,丢失的数据包数量等等。因此通常我们利用RTCP来对传输流量或有效载荷进行动态调整,同时与RTP配合有效的控制传输速率,所以特别适合传送实时数据。
(4).对话描述协议
对话描述协议(SDP)就是用来描述多媒体会话通告,多媒体会话邀请和其他形式的多媒体会话初始化的协议。SDP协议对流媒体描述的具体信息如下:会话名和会话目的,会话发起时间,会话中相关的网络信息,会话发起者的相关信息,媒体类型,传输所使用的协议,流媒体编码格式,传输时所使用的端口号,IP网络地址。因此我们可以通过解析SDP协议来获取我们所需要的一些必要的相关信息。
其中RTSP是非常重要的协议,因此后面会结合原代码做一个详细的分析,这个结果对设计模块有着非常重要的影响,也可以说是本设计的关键。
三.模块分类
流媒体服务器使用模块来响应各种请求及完成任务。有三种类型的模块:
(1).内容管理模块
媒体源相关的RTSP请求与响应,我们通过内容管理模块来管理,每个模块都用来对客户的需求进行解释并做相应处理,例如读取和解析模块支持的文件,或者请求的网络源信息,并通过RTP等方式响应。
内容管理模块有以下几个:
QTSSFileModule,
QTSSReflectorModule,
QTSSRelayModule,
QTSSMP3StreamingModule。
(2).服务器支持模块
服务器支持模块执行服务器数据的收集和记录功能。
服务器模块包括:
QTSSErrorLogModule,
QTSSAccessLogModule,
QTSSWebStatsModule,
QTSSWebDebugModule,
QTSSAdminModule,
QTSSPOSIXFileSystemModule。
(3).访问控制模块
访问控制模块提供鉴权和授权功能,以及操作URL路径提供支持。
访问控制模块包括:
QTSSAccessModule,
QTSSHomeDirectoryModule,
QTSSHttpFileModule,
QTSSSpamDefenseModule。
在DSS中的模块分为动态模块和静态模块,动态模块在服务器启动时会首先装载动态模块,之后才会装载一部分静态模块。我们一般建议将我们自己书写的功能模块编译为动态模块来替换或扩展现有的服务器模块,因为它会被优先装载。在QTSS的模块中必须包含Register这个角色,这也是每个模块所必须支持的角色。在模块被装载之后服务器会调用每个模块的Register角色。在这个角色当中,模块会调用QTSS_AddRole函数来记录这个模块所支持的其他角色。然后服务器就将初始化角色来调用每一个拥有这个角色的模块。这个角色主要是做一些初始化的任务,比如说内存的分配或者对数据结构的初始化等等。在关闭服务器的时候,所有模块的Shutdown角色将被调用,这个角色主要是为了结束工作后处理现场,比如释放内存等等。流媒体服务器主要就是通过这种角色来完成相应任务的。