欢迎来到天天文库
浏览记录
ID:6335392
大小:200.33 KB
页数:14页
时间:2018-01-10
《rtsp流媒体服务器小结》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、DarwinStreamingServer流媒体服务器小结DarwinStreamingServer(简称DSS)是QuickTimeStreamingServer开放式源代码的版本,同时支持FreeBSD、Linux、Solaris、WindowsNT和Windows2000等多个操作系统,是当前所有同类产品中支持平台最多的一个。DSS源代码完全采用标准C++语言写成,每个C++类都对应着一对和类同名的.h/.cpp文件。整个服务器包括多个子系统,分别存放在独立的工程内,其中,最为重要的是基础功能类库(CommonUtilitiesLi
2、b)和流化服务器(StreamingServer)两个工程,前者是整个系统的通用代码工具箱,包括了线程管理、数据结构、网络和文本分析等多个功能模块。后者包含了DSS对多个国际标准的实现,是整个服务器的主工程。DSS实现了四种IETF制定的国际标准,分别是:实时流传输协议RTSP(Real-timeStreamingProtocol,RFC2326)、实时传输协议(RTPReal-timeTransferProtocol,RFC1889)、实时传输控制协议RTCP(Real-timeTransportControlProtocol,RFC1
3、889)、会话描述协议SDP(SessionDescriptionProtocol,RFC2327)。核心服务器通过创建四种类型的线程来完成自己的工作,具体如下:1.主线程(mainthread):这个线程负责检查服务器是否需要关闭,记录状态信息,或者打印统计信息。2.空闲任务线程(IdleTaskthread):空闲任务线程管理一个周期性的任务队列,该任务队列有两种类型:超时任务和套接口任务。3.事件线程(Eventthread):事件线程负责侦听套接口事件,比如收到RTSP请求和RTP数据包,然后把事件传递给任务线程。4.一个或多个任
4、务线程(Taskthreads):任务线程从事件线程中接收RTSP和RTP请求,然后把请求传递到恰当的服务器模块进行处理,把数据包发送给客户端。一.基础功能类库(CommonUtilities)1.DarwinStreamingServer支持包括Windows,Linux以及Solaris在内的多种操作系统平台。我们知道,Windows和Unix(或Unix-like)操作系统之间无论从内核还是编程接口上都有着本质的区别,即使是Linux和Solaris,在编程接口上也大为不同。为此,DSS开发了多个用于处理时间、临界区、信号量、事件、
5、互斥量和线程等操作系统相关的类,这些类为上层提供了统一的使用接口,但在内部却需要针对不同的操作系统采用不同的方法实现。OSCond 状态变量的基本功能和操作,OSMutex 互斥量的基本功能和操作,OSThread 线程类,OSFileSource 简单文件类,OSQueue 队列类,OSHashTable 哈希表类,OSHeap 堆类,OSRef 参考引用类。2.Task类,用来处理事件通知机制。在Task.h/cpp文件中,定义了三个主要的类,分别是:任务线程池类(TaskThreadPoolClass)
6、、任务线程类(TaskThreadClass)以及任务类(TaskClass)。每个Task对象有两个主要的方法:Signal和Run。当服务器希望发送一个事件给某个Task对象时,就会调用Signal()方法;而Run()方法是在Task对象获得处理该事件的时间片后运行的,服务器中的大部分工作都是在不同Task对象的Run()函数中进行的。每个Task对象的目标就是利用很小的且不会阻塞的时间片完成服务器指定某个工作。任务线程类(TaskThread)是OSThread类的一个子类,代表专门用于运行任务类的一个线程。在每个任务线程对象内部
7、都有一个OSQueue_Blocking类型的任务队列,存储该线程需要执行的任务。服务器调用一个任务的Signal函数,实际上就是将该任务加入到某个任务线程类的任务队列中去。另外,为了统一管理这些任务线程,DSS还开发了任务线程池类,该类负责生成、删除以及维护内部的任务线程列表。这种由事件去触发任务的概念已经被集成到了DSS的各个子系统中。例如,在DSS中经常将一个Task对象和一个Socket对象关联在一起,当Socket对象收到事件(通过select()函数),相对应的Task对象就会被传信(通过Signal()函数);而包含着处理代
8、码的Run()函数就将在某个任务线程中运行。3.Socket类DSS中的Socket类一般都采用异步模式的(即非阻塞的),而且能够向对应的Task对象传信(Signal),Socket类中具有
此文档下载收益归作者所有