2022年Rtsp流媒体服务器小结 .pdf
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《2022年Rtsp流媒体服务器小结 .pdf》由会员分享,可在线阅读,更多相关《2022年Rtsp流媒体服务器小结 .pdf(14页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、Darwin Streaming Server流媒体服务器小结Darwin Streaming Server(简称 DSS)是 QuickTime Streaming Server开放式源代码的版本,同时支持FreeBSD、Linux、Solaris、Windows NT 和 Windows 2000等多个操作系统,是当前所有同类产品中支持平台最多的一个。DSS 源代码完全采用标准C+语言写成,每个C+类都对应着一对和类同名的.h/.cpp文件。整个服务器包括多个子系统, 分别存放在独立的工程内, 其中,最为重要的是基础功能类库( CommonUtilitiesLib )和流化服务器( Str
2、eamingServer )两个工程,前者是整个系统的通用代码工具箱,包括了线程管理、 数据结构、 网络和文本分析等多个功能模块。后者包含了DSS 对多个国际标准的实现,是整个服务器的主工程。DSS 实现了四种 IETF 制定的国际标准, 分别是:实时流传输协议RTSP(Real-time Streaming Protocol, RFC 2326)、实时传输协议(RTP Real-time Transfer Protocol,RFC 1889)、实时传输控制协议RTCP(Real-time Transport Control Protocol,RFC 1889) 、会话描述协议 SDP (Se
3、ssion Description Protocol ,RFC 2327)。核心服务器通过创建四种类型的线程来完成自己的工作,具体如下:1. 主线程 (main thread):这个线程负责检查服务器是否需要关闭,记录状态信息,或者打印统计信息。2. 空闲任务线程 (Idle Task thread):空闲任务线程管理一个周期性的任务队列,该任务队列有两种类型:超时任务和套接口任务。3. 事件线程 (Event thread):事件线程负责侦听套接口事件,比如收到 RTSP 请求和 RTP数据包,然后把事件传递给任务线程。4. 一个或多个任务线程 (Task threads):任务线程从事件线
4、程中接收RTSP 和 RTP请求,然后把请求传递到恰当的服务器模块进行处理,把数据包发送给客户端。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 14 页 - - - - - - - - - 一基础功能类库(Common Utilities)1.Darwin Streaming Server支持包括 Windows,Linux 以及 Solaris 在内的多种操作系统平台。我们知道,Windows 和 Unix(或 Unix-like )操作系统之间无论从内核还是编程接口
5、上都有着本质的区别,即使是 Linux 和 Solaris,在编程接口上也大为不同。为此, DSS开发了多个用于处理时间、临界区、信号量、事件、互斥量和线程等操作系统相关的类,这些类为上层提供了统一的使用接口,但在内部却需要针对不同的操作系统采用不同的方法实现。OSCond 状态变量的基本功能和操作,OSMutex 互斥量的基本功能和操作,OSThread 线程类, OSFileSource 简单文件类, OSQueue 队列类,OSHashTable 哈希表类, OSHeap 堆类, OSRef 参考引用类。2.Task 类,用来处理事件通知机制。在Task.h/cpp 文 件 中 , 定
6、义 了 三 个 主 要 的 类 , 分 别 是 : 任 务 线 程 池 类(TaskThreadPool Class ) 、 任务线程类(TaskThread Class ) 以及任务类(Task Class ) 。每个 Task 对象有两个主要的方法:Signal 和 Run。当服务器希望发送一个事件给某个 Task对象时,就会调用 Signal()方法;而 Run()方法是在 Task 对象获得处理该事件的时间片后运行的,服务器中的大部分工作都是在不同Task 对象的Run()函数中进行的。 每个 Task 对象的目标就是利用很小的且不会阻塞的时间片完成服务器指定某个工作。任务线程类 (T
7、askThread ) 是 OSThread类的一个子类,代表专门用于运行任务类的一个线程。在每个任务线程对象内部都有一个OSQueue_Blocking类型的任务队列, 存储该线程需要执行的任务。 服务器调用一个任务的Signal 函数,实际上就是将该任务加入到某个任务线程类的任务队列中去。另外,为了统一管理这些任务线程, DSS还开发了任务线程池类, 该类负责生成、删除以及维护内部的任务线程列表。这种由事件去触发任务的概念已经被集成到了DSS的各个子系统中。例如,在 DSS 中经常将一个 Task 对象和一个 Socket 对象关联在一起,当Socket 对象收到事件(通过select()
8、函数),相对应的Task 对象就会被传信(通过Signal()函数);而包含着处理代码的Run()函数就将在某个任务线程中运行。3.Socket类DSS 中的 Socket 类一般都采用异步模式的(即非阻塞的),而且能够向对应的 Task 对象传信( Signal),Socket类中具有代表性的类是:EventContext、EventThread 、Socket、UDPSocket、TCPSocket以及 TCPListenerSocket等等。在 eventcontext.h/.cpp文件中,定义了两个类:EventContext类和 EventThread类。 Event Context
9、提供了检测 Unix 式的文件描述符( Socket就是一种文件描述符)产生的事件(通常是EV_RE 或 EV_WR)的能力,同时还可以传信指定的任务。 EventThread类是 OSThread类的子类,它本身很简单,只是重载了 OSThread的纯虚函数 Entry(),用以监控所有的Socket端口是否有数据到来。EventContext对象负责维护指定的描述符, 其主要函数包括 InitNonBlocking 、CleanUp和 RequestEvent等。 其中 InitNonBlocking 函数调用 Socket API ioctlsocket将用户指定的描述符设置为异步,Cl
10、eanUp 函数用于关闭该描述符;另外,用户通过 RequestEvent函数申请对该描述符中某些事件的监听名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 14 页 - - - - - - - - - Socket Class 、UDPSocket Class和 TCPSocketClass三个类都是 EventContext的子类,它们封装了 TCP 和 UDP 的部分实现,同时扩展了EventContext 中的事件,但都没有改变其运行机制。TCPListenerSo
11、cket用于监听 TCP 端口,当一个新连接请求到达后,该类将赋予这个新连接一个Socket对象和一个 Task对象的配对。二服务器模块:处理网络和协议。 主要有 3 个子系统: RTSP 子系统,RTP子系统以及公共服务子系统。服务器内核:这个子系统中的类都有一个QTSS 前缀。QTSSServer负责处理服务器的启动和关闭。QTSSServerInterface负责保存服务器全局变量, 以及收集服务器的各种统计信息。QTSSPrefs是存储服务器偏好设定的地方。QTSSModule,QTSSModuleInterface,和 QTSSCallbacks 类的唯一目的就是支持QTSS 的模块
12、 API。(1) RTSP子系统负责解析和处理 RTSP 请求,以及实现 QTSS 模块 API 的 RTSP 部分。其中的几个类直接对应QTSS API的一些元素(例如, RTSPRequestInterface类就是对应 QTSS_RTSPRequestObject 对象)。每一个 RTSP/TCP 连接都对应一个RTSP的session.主要的类有RTSPSession,RTSPRequest,RTSPResponseStream 和 RTSPRequestStream. (2) RTP 子系统负责媒体数据包的发送,根据RTCP的反馈进行服务质量控制。主要的类有RTPSession,RT
13、PStream和 RTCPTask. (3) 公共服务子系统负责服务器的启动 / 关闭,初始化参数设置以及为Module机制,跨平台的多线程和事件机制等提供支持。DSS提供了一种称为Module 的二次开发接口。使用这个开发接口,我们可以自由扩张服务器的功能。DSS定义了一个 TCPListenerSocket类的子类 RTSPListenerSocket , 用于监听 RTSP连接请求。 RTSPListenerSocket类做的唯一一件事就是重载了GetSessionTask函数,当客户的连接请求到达后,它创建了一个Socket 对象和 RTSPSession对象的配对。RTSPSessi
14、on对象是 Task类的子类,是专门用于处理 RTSP请求的任务类。当 client端发出 Play 请求时,server 端的 RTSPListenerSocket 监听到这个请求, Run 创建一个 RTSPSession ,这个 RTSPSession被加入到任务队列中, 当时间片到达时, TaskThread 线程就会调用 RTSPSession对象的函数,在Run函数中,维护一个 RTSPSession状态机,对客户的RTSP 请求做出不同的处理。请求分析完成后, RTSPSession进入请求处理状态 (kProcessingRequest ),DSS名师资料总结 - - -精品资
15、料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 14 页 - - - - - - - - - 会调用注册了“请求处理任务”(QTSS_RTSTRequest_Role )的module, 而QTSSFileModule 就是这样一个Module。QTSSFileModule 定义了一个分发函数QTSSFileModuleDispatch ,它根据传入的任务类别和任务参数调用相应的函数。此 时 传 入 的 任 务 是QTSS_RTSTRequest_Role , 相 应 的 处 理 函 数 是Proce
16、ssRTSPRequest,该函数根据传入的RTSP Method调用相应的处理函数,此时传入的 method是 play ,所以调用函数DoPlay。IdleTaskThread, 它的 Entry 中不停的超时等待, 查看它队列中的 task是否到期,是则调用该 task-signal. IdleTask 的 SetIdleTimer()里面调用 IdleTaskThread-SetIdleTimer()把该 task加入它的 fIdleHeap. 程序的数据流程为四部分,就是:1,task 。每个 Task 对象有两个主要的方法: Signal 和 Run 。当服务器希望发送一个事件给某
17、个 Task 对象时,就会调用Signal()方法;而 Run()方法是在 Task 对象获得处理该事件的时间片后运行的,应用可以通过继承Task 并重写 Run()方法实现自己的任务。2,EventContext 事件的触发者 , 当事件发生时,调用Task:signal(). 3,TaskThread,任务的驱动线程,对一个或者多个Task 进行调度,通过调用Task:run() 处理事件 . 4,EventThread ,EventContext 的驱动线程,可以处理多个EventContext, 发生 事 件 时 调 用EventContext:process_event(),后 者
18、将 调 用Task:Signal() 流程:1,Client或者 Task 的子类向 Event Context注册事件。2,EventContext 将事件放入 EventThread 的 Pool 内。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 14 页 - - - - - - - - - 3,EventThread 调用 select 等待多个事件中任一个触发。4,事件触发以后, EventThread 调用 EventContext:ProcessEvent(
19、)。5,调用 Task:signal()。6,Task:signal()将 task 放入 TaskThread 的队列。7, TaskThread调度相应的 Task, 执行其 Run()方法。 它的具体实现在各个 Module中定义。DSS的基本功能单元称为模块 (module), 每一个模块都是处理某一类事件的功能集合。例如 QTSSAcessModule 就是鉴权授权事件的主要处理模块,类似于桌面窗口的事件处理中的事件, DSS 服务器核心处理 RTSP 请求, 定义了若干角色(role ) ,一个角色就是一项任务, 一个模块可以注册若干个角色,表示这个模块可以处理这些注册的任务。 比
20、如一个模块注册了QTSS_RSTPPreProcess_Role, 则可以调用这个 Module 来预处理 RSTP 请求。根据不同的任务, 服务器会传递不同的对象给模块,这些对象中包含有为完成这个任务所包含的一系列数据以及为向服务器传递信息而存在的数据结构。Darwin streaming server的媒体存储格式 hint track格式以及被 ISO,ISMA等标准组织采纳并成为正式标准。Hint track是 Darwin streaming server的扩展,通过在媒体文件中增加hint track 轨道,存放了一些预先生成好的媒体描述信息 (SDP格式)和媒体数据打包的索引信息
21、。 通过 ISMA传输协议进行传输时,可以直接根据数据打包索引信息来打包发送,不需要对信息进行重复的分析格式组装数据包的处理过程。普 通 文 件 可 以 通 过 一 些 工 具 添 加hint track属 性 。 开 源 的 工 具 有mpeg4ip,mp4info.RTSP 数据处理名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 14 页 - - - - - - - - - 首先经由 “RTSP Filter Role” 对封包资料做某些改变等前置处理。 当 RTSP
22、 Filter Role 完成,开始进行对该请求封包的分析以取得各种参数并建立一个RTSP session 及一个 Client session.RTSP session 主要负责处理此一请求所建立的RTSP 连线阶段的请求 / 回应。 Client session则负责串流传送阶段的维护工作。对该请求分析完毕后, server 呼叫各模块中的” RTSP Route Role”对 RTSP 对象进行参数修改和设定。他可以改变文件的处理目录。接着呼叫” Preprocessor Role”判断该请求属于RTSP 封包中的哪一种类型, 以便把该请求传送到对应的函数处理此一请求,若无法判别属于哪一
23、类型, 则将其传送到” RTSP Request Role”, 此一角色处理所有在”Preprocessor Role”中未定义的类型。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 14 页 - - - - - - - - - 最后,来到“Postprocessor Role”,此角色负责统计的工作, 例如存取记录等。在处理” Preporcessor Role”或是“ RTSP Request Role”中的各模块时,可能会产生串流媒体资料。需要产生媒体资料时,程式会
24、呼叫 Client session 中的“QTSS_Play ”物件,此物件会触发在 “RTP Send Packets Role”中的各个模块,同时进入 RTP subsystem 中。RTP subsystem: RTP subsystem 主要包括 RTP 封包传送及 RTCP 串流控制两部份。在封包传送方面,“ RTP Send Packets Role ”在 RTP session 中经由呼叫“ QTSS_Write ”或“QTSS_WriteV ”把媒体资料传送到客户端。 在传送过程中, 每送一次封包后,Server 等待一个时间值再继续呼叫”RTP Send Packets Ro
25、le”传送封包。在串流控制方面,当Server 接收到 RTCP 封包时会先判定此 RTCP封包属于哪一种封包, RFC1889 中定义了五种 RTCP 封包,分別是: SR(Source description),RR(Receiver description), SDES(Source Description Items , include items) ,APP(Application specific functions)及 BYE。根据封包的种类, Server 会呼叫“RTCP Process Role”中相应的模块进行处理。名师资料总结 - - -精品资料欢迎下载 - - - -
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年Rtsp流媒体服务器小结 2022 Rtsp 流媒体 服务器 小结
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内