流媒体协议与Darwin服务器PPT课件.ppt_第1页
流媒体协议与Darwin服务器PPT课件.ppt_第2页
流媒体协议与Darwin服务器PPT课件.ppt_第3页
流媒体协议与Darwin服务器PPT课件.ppt_第4页
流媒体协议与Darwin服务器PPT课件.ppt_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

流媒体协议与DARWIN媒体服务器 1 1流媒体协议介绍1 1Rtp RTP RealTimeTransportProtocol 实时传输协议RTP为数据提供了具有实时特征的终端对终端传送服务 如在组播或单播网络服务下的交互式式视频音频或仿真数据 RTP由两个相近链接部分组成 RTP 传送具有实时属性的数据 RTP控制协议RTCP 监控服务质量并传送正在进行的会话参与者的相关信息 2 协议结构 PT 识别RTP有效载荷的格式 并通过应用程序决定其解释 序列号 每发送一个RTP数据包 序列号增加1 接收方可以依次检测数据包的丢失并恢复数据包序列 Timestamp 反映RTP数据包中的第一个八位组的采样时间 SSRC 同步源 该标识符随机选择 旨在确保在同一个RTP会话中不存在两个同步源具有相同的SSRC标识符 3 RTCP协议 当应用程序开始一个RTP会话时将使用两个端口 一个给RTP 一个给RTCP RTP本身并不能为按顺序传送数据包提供可靠的传送机制 也不提供流量控制或拥塞控制 它依靠RTCP提供这些服务 在RTP的会话之间周期的发放一些RTCP包以用来传监听服务质量和交换会话用户信息等功能 RTCP包中含有已发送的数据包的数量 丢失的数据包的数量等统计资料 因此 服务器可以利用这些信息动态地改变传输速率 甚至改变有效载荷类型 RTP和RTCP配合使用 它们能以有效的反馈和最小的开销使传输效率最佳化 因而特别适合传送网上的实时数据 根据用户间的数据传输反馈信息 可以制定流量控制的策略 而会话用户信息的交互 可以制定会话控制的策略 4 1 2 RTSP RealTimeStreamingProtocol RTSP协议定义了如何有效地通过IP网络传送多媒体数据 是一种客户端到服务器端的多媒体描述协议 RTSP是一个流媒体标示控制协议 用于控制具有实时特性的传输服务 它本身并不传输数据 而是利用低层传输协议提供的传输服务如RTP来传输数据 它提供对媒体流的控制功能 例如播放 暂停 快进等 RTSP定义控制中所用的消息 操作方法 状态码以及头域等 另外还描述与RTP的交互操作 RTSP制定时参考了HTTP 1 1 在语法及操作上均与HTTP 1 1相似 并使HTTP的扩展机制在大多数情况下 可以加到RTSP上 5 C S DESCRIBErtsp 127 0 0 1 sample 100kbit mp4RTSP 1 0 r nCSeq 1 r nAccept application sdp r nBandwidth 384000 r n r nS C RTSP 1 0200OK r nServer DSS 5 5 1 Build 489 8 Platform Win32 Release Darwin r nCseq 1 r nContent length 1203 r nContent Type application sdp r nx Accept Retransmit our retransmit r nx Accept Dynamic Rate 1 r nContent Base rtsp 127 0 0 1 sample 100kbit mp4 r n r nv 0 r no StreamingServer33430791571109298958000INIP4127 0 0 1 r ns sample 100kbit mp4 r nu http r ne admin r nc INIP40 0 0 0 r nb AS 96 r nt 00 r na control r n 6 a mpeg4 iod data application mpeg4 iod base64 AoJrAE w z wOBdgABQNhkYXRhOmFwcGxpY2F0aW9uL21wZWc0LW9kLWF1O2Jhc2U2NCxBWUVDQVV3Rkh3TklBTWtnQUdVRUx5QVJBRzNkQUFFaytBQUJKUGdGSUFBQUFiRHpBQUFCdFE3Z1FNRFBBQUFCQUFBQUFTQUFoRUQ2S0RBZzhxSWZCaEFBUkFBQUFsZ0FBQUFBSUFBQUFBQURBVElDbndNdUFHVUFCSUNBZ0JSQUZRQVlBQUFBVGlBQUFFNGdCWUNBZ0FJVmtBWVFBRVFBQUI5QUFBQWZRQ0FnQUFBQUF3PT0EDQEFAADIAAAAAAAAAAAGCQEAAAAAAAAAAANpAAJARmRhdGE6YXBwbGljYXRpb24vbXBlZzQtYmlmcy1hdTtiYXNlNjQsd0JBU2daTUNvRmNtRUVIOEFBQUIvQUFBQkVLQ0tDbjQEEgINAABkAAAAAAAAAAAFAwAAYAYJAQAAAAAAAAAA r na isma compliance 1 1 0 1 r na range npt 0 70 00000 r nm video0RTP AVP96 r nb AS 76 r na rtpmap 96MP4V ES 90000 r na control trackID 3 r na cliprect 0 0 242 192 r na framesize 96192 242 r na fmtp 96profile level id 1 config 000001B0F3000001B50EE040C0CF0000010000000120008440FA283020F2A21F r na mpeg4 esid 201 r nm audio0RTP AVP97 r nb AS 20 r na rtpmap 97mpeg4 generic 8000 2 r na control trackID 4 r na fmtp 97profile level id 15 mode AAC hbr sizelength 13 indexlength 3 indexdeltalength 3 config 1590 r na mpeg4 esid 101 r n 7 1 3sdp SDP SessionDescriptionProtocol 会话描述协议 SDP 为会话通知 会话邀请和其它形式的多媒体会话初始化等目的提供了多媒体会话描述 会话目录用于协助多媒体会议的通告 并为会话参与者传送相关设置信息 SDP即用于将这种信息传输到接收端SDP文本信息包括 会话名称和意图 会话持续时间 构成会话的媒体 有关接收媒体的信息 地址等 8 协议结构 SDP信息是文本信息 采用UTF 8编码中的ISO10646字符集 SDP会话描述如下 v 协议版本 o 所有者 创建者和会话标识符 s 会话名称 一个或更多时间描述 如下所示 0个或多个媒体描述 如下所示 时间描述t 会话活动时间 媒体描述m 媒体名称和传输地址 9 例子 其中 DESCRIBE SETUP PLAY命令是遵循rtsp协议的 而会话描述是遵循sdp协议的 媒体数据的传输是采用rtp协议的 10 2 Darwin流媒体服务器介绍 2 1各个流媒体解决方案比较2 1 1流媒体商业解决方案比较目前市面上有realnetworks公司的realsystem microsoft公司的windowsmedia系统 苹果公司的quicktime流媒体系统及philips公司的webcine 后者在目前市场上的占有率微乎其微 而另外三大主流流媒体解决方案则占据了90 以上的市场 11 微软的流媒体系统以其方便性 先进性 集成性 低费用等特点而渐渐被人们注意 它的缺点是仅支持windows操作系统 采用的是私有协议MMS而不是RTSP RTP协议 提供SDK进行二次开发 Realnetwork公司的流媒体系统是目前最流行的流媒体解决方案 支持几乎所有主流的个人计算机平台 提供SDK进行二次开发 苹果公司的流媒体系统支持几乎所有主流的个人计算机平台 提供媒体服务器darwinstreamserver DSS 的开源代码 播放器quicktime提供SDK进行二次开发 12 2 1 2开源流媒体服务器比较 开源方面 因为目前编解码器及流媒体的标准未定 开源资源比较紊乱 下面对开源领域较多人使用的程序做一比较 13 2 2DSS架构 DSS处理流媒体的过程如图所示 客户端经由DSS中的RTPsession及RTSPsession建立RTP UDP IP数据连接以及RTSP TCP IP控制连接 接着流媒体数据由RTP链路传送到客户RTSP链路控制RTP流的播放 14 2 2 1服务器架构 15 服务器自己拥有的主线程 MainThread 这个线程负责检查服务器是否需要关闭 记录状态信息 或者打印统计信息 空闲任务线程 IdleTaskThread 空闲任务线程管理一个周期性的任务队列 事件线程 EventThread 事件线程负责侦听套接口事件 比如收到RTSP请求和RTP数据包 然后把事件传递给任务线程 一个或者多个任务 Task 线程 任务线程从事件线程中接收RTSP和RTP请求 然后把请求传递到恰当的服务器模块进行处理 把数据包发送给客户端 缺省情况下 核心服务器为每一个处理器创建一个任务线程 16 2 2 1 1任务线程 DSS中RTSP监听对象 RTSP会话对象 RTP会话对象均为 任务 对象 可被任务线程调度完成RTSP请求监听 RTSP请求处理 RTP数据包发送等工作 每个任务对象都有两个主要的方法 Signal和Run 用于实现任务对象的通知和运行 任务对象的概念图如图3所示 17 Signal方法若想要通知任务对象完成某一任务 只需调用其Signal方法 并传递事件 即通知任务对象某一事件 例如在RTP会话任务对象的Play 中想要启动RTP任务对象开始发送RTP数据包 则通知RTP会话对象一个 启动事件 StartEvent 任务对象Signal方法所作的工作仅仅是设置任务对象的事件标记值并将任务对象自身作为一个队列元素加入到任务线程的任务对象队列中去 然后任务线程会调度到该任务并完成特定任务 Run方法在任务线程调度到某一任务对象后 会调用其Run方法来完成特定的工作 在任务对象的Run方法中 首先根据其事件标记值判断被通知的事件 然后根据该事件完成特定的任务 任务对象的运行任务线程调度任务对象并调用任务对象的Run方法完成任务后 根据返回值对任务对象有进一步的处理 若返回值为负 则删除该任务对象 一般任务对象在收到 kill事件 后 其Run方法返回负值使得任务对象在任务线程上被删除 若返回值为零 则不进行进一部处理 使得在任务对象只有在收到新的事件通知后才能够再次被调度运行 若返回值为正 则标明该任务对象在返回值时间间隔后需再次被调度运行 则设置其事件标记为空闲 并以当前时刻和返回值之和作为其运行时刻 然后将其插入到任务队列中 使得在任务对象的运行时刻到来后会被任务线程调度得以运行 18 2 2 1 2事件线程 19 事件线程在启动时构造有一个消息窗口用于接收消息 套接字若想通过该消息窗口产生消息 需调用WSAAsyncSelectQ函数请求 当套接字上有网络事件时 产生消息到该消息窗口 事件线程启动后 它一直循环阻塞等待消息 若接收到消息 即有套接字收到数据 根据消息中参数找到对应的套接字并撤销该套接字的 网络事件通知消息 功能 最后调用该套接字处理消息 并循环等待消息 在套接字处理事件时将该事件通知给与之联系在一起的任务对象 即调用该任务对象的Signal方法 所传递事件为读取数据事件 这样可以将套接字与任务对象联系起来 当套接字上收到数据后可在事件线程上通知对应的任务对象 任务对象在任务线程上得到运行以处理来自套接字的数据 例如 RTSP监听任务对象和其监听套接字联系起来 RTSP会话任务对象和其会话连接套接字联系起来 而RTCP任务对象和所有RTP会话接收RTCP数据包的套接字联系起来 因此 通过任务 事件机制 使得在单个线程上处理所有的流会话成为可能 20 2 2 1 3空闲线程 21 在服务器启动时创建 启动有空闲线程 它用于为任务对象提供定时信息 对任务对象进行定时 只需设置其 时间到时刻 当前时刻与延时值之和 并将任务对象作为一个最小堆元素插入到空闲线程的最小堆中 当需要撤销任务对象的定时功能时 只需将其从空闲线程的最小堆中删除即可 空闲线程通过为任务对象通知 空闲事件 提供定时器功能 在RTSP监听对象中就用到了这种定时器 当服务器的文件描述符不够用时 暂停一段时间不接收来自客户端的连接请求 当暂停时间到后由空闲线程通知其再开始接收 处理RTSP连接请求 22 2 3对一个客户端请求的处理流程 SInt64RTSPSession Run while this IsLiveSession switch fState casekReadingRequest casekFilteringRequest casekRoutingRequest casekAuthenticatingRequest casekAuthorizingRequest casekPreprocessingRequest casekProcessingRequest casekPostProcessingRequest casekSendingResponse casekCleaningUp 23 1第一次请求到达进入kReadingFirstRequest状态 该状态主要负责从RTSPRequestStream类的对象fInputStream中读出客户的RTSP请求2正常情况下 在获得一个完整的RTSP请求后 系统将进入kHTTPFilteringRequest状态该状态检查RTSP连接是否需要经过HTTP代理实现 如不需要 转入kHaveNonTunnelMessage状态 3进入kHaveNonTunnelMessage状态后 系统创建了RTSPRequest类的对象fRequest 该对象解析客户的RTSP请求 并保存各种属性 fRequest对象被传递给其他状态处理 4接着进入kFilteringRequest状态 二次开发人员可以通过编写Module对客户的请求做出特殊处理 如果客户的请求为正常的RTSP请求 系统调用SetupRequest函数建立用于管理数据传输的RTPSession类对象 5进入kRoutingRequest状态 调用二次开发人员加入的Module 用于将该请求路由 Routing 出去 缺省情况下 系统本身对此状态不做处理 6进入kAuthenticatingRequest状态 调用二次开发人员加入的安全模块 主要用于客户身份验证以及其他如规则的处理 读者如果希望开发具有商业用途的流式媒体服务器 该模块必须进行二次开发 7进入kPreprocessingRequest和kProcessingRequest及kPostProcessingRequest状态 这三种状态都是通过调用系统自带或二次开发人员添加的Module来处理RTSP请求 例如系统提供了QTSSReflectorModule QTSSSplitterModule以及QTSSFileModule等模块 其中比较重要的QTSSFileModule属于QTLib库的部分 此处不再详述 8进入kSendingResponse状态 用于发送对客户RTSP请求处理完成之后的响应 系统在该状态调用了fOutputStream Flush 函数将在fOutputStream中尚未发出的请求响应通过Socket端口完全发送出去 9进入kCleaningUp状态 清除所有上次处理的数据 并将状态设置为kReadingRequest等待下次请求到达 24 在介绍RTSP的运行流程时 我们发现RTSPSession对象通过调用SetupRequest函数为客户建立RTPSession对象 RTPSession类是Task类的子类 因此它重载了Task类的Run函数 该函数通过调用FileModule cpp文件中的SendPacket 函数向客户发送RTP协议打包的流式媒体数据 当客户通过利用RTSP向RTSPSession对象发出PLAY命令后 RTSPSession对象将调用RTPSession对象的Play 函数 Play函数准备好需要打包发送的数据后 利用Task类的Signal函数传信RTPSession对象 使其被加入某个TaskThread的任务队列 从而运行其Run函数 另外 对同一个节目中的每一个独立的RTP流 如音频流或视频流等 DSS都定义了一个RTPStream类与之对应 显然一个RTPSession对象可能包含多个RTPStream对象 25 2 4模块的二次开发2 4 1模块定义 作为一个运行于多个操作系统平台的开发源代码的服务器 DSS提供了一种称为Module的二次开发接口 使用这个开发接口 我们可以充分利用服务器的可扩展性及其实现的多种协议 并且能够保证和将来版本兼容 DSS中的许多核心功能也是以Module的方式预先实现并且编译的 因此可以说对Module的支持已经被设计到DSS的内核中去了 模块是功能的集合体 它针对特定的功能表现为特定的角色 服务器在调用模块时 通知模块扮演某个角色以完成特定的功能 用角色名描述特定的功能 DSS流服务器中服务器通过内核调用模块 模块也通过内核调用服务器 为了实现内核对模块的支持 内核对模块的调用 每个模块都有两个程序 主程序 mainroutine 和派遣程序 dispatchroutine 主程序用于服务器启动时内核加载模块 派遣程序用于服务器通过内核调用模块完成特定的功能 26 27 2 4 2服务器的启动和关闭 28 服务器在启动的时候 会首先装载没有被编译到服务器里面的模块 即动态模块 然后再装载编译为服务器一部分的模块 即静态模块 如果我们正在书写模块来代替现有的服务器功能 可以将它编译为动态模块 使它率先被服务器装载 在模块装载完成之后 服务器会调用每个QTSS模块的Register 注册 角色 每个模块都必须支持这个角色 在Register角色中 模块会调用QTSS AddRole函数来指定自己支持的其它角色 接下来服务器就以Initialize 初始化 角色调用每一个注册支持该角色的模块 Initialize角色执行模块所需要的任何初始化任务 比如分配内存和初始化全局的数据结构 在服务器关闭的时候 服务器以Shutdown角色调用每个注册了该角色模块 在处理Shutdown角色的时候 模块应该执行一些收拾现场的任务 并释放全局的数据结构 29 下面我们将分析DSS的一个内嵌Module QTSSFileModule的源代码来说明Module的编程方式 QTSSFileModule的实现在QTSSFileModule cpp文件中 30 首先 每个QTSSModule必须实现一个主函数 服务器调用该函数用于启动和初始化模块中的QTSS函数 QTSSFileModule主函数的实现如下 QTSS ErrorQTSSFileModule Main void inPrivateArgs return stublibrary main inPrivateArgs QTSSFileModuleDispatch 其中QTSSFileModuleDispatch是Module必须实现的分发函数名 另一个需要实现的是分发函数 服务器调用该函数实现某个特殊任务 此时 服务器将向分发函数传入任务的名字和一个任务相关的参数块 QTSSFileModule分发函数的实现如下 QTSS ErrorQTSSFileModuleDispatch QTSS RoleinRole QTSS RoleParamPtrinParamBlock 根据传入的任务名称和入参执行相应的处理函数tch inRole 任务名称 caseQTSS Register Role returnRegister inParamBlock regParams caseQTSS Initialize Role returnInitialize inParamBlock initParams caseQTSS RereadPrefs Role returnRereadPrefs caseQTSS RTSPRequest Role returnProcessRTSPRequest inParamBlock rtspRequestParams caseQTSS RTPSendPackets Role returnSendPackets inParamBlock rtpSendPacketsParams caseQTSS ClientSessionClosing Role returnDestroySession inParamBlock clientSessionClosingParams returnQTSS NoErr 31 DSS提供了两种方式把我们自己开发的Module添加到服务器中 一种称为静态模块 StaticModule 该方式将我们开发的Module代码直接编译到内核中去 另一种称为动态模块 DynamicModule 该方式将我们开发的Module单独编译称为一个动态库 然后修改配置 使服务器在启动时将其加载 无论是静态模块还是动态模块

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论