打印

Darwin streaming server的主要概念概述

[复制链接]
1630|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
1.core server
每个TaskObject都有两个方法:Signal Run
在每个Task.Run内部,调用GetEvents()接收和从队列弹出所有当前的和之前的事件。
这种事件触发的核心机制渗透到几乎所有Streaming Server subsystem.
        Task objects make it possible for the Streaming Server use a singlethread to run all connections, which is the
Streaming Servers default configuration on a single processor system.
多亏了Task objects,它让Streaming Server使用一个线程来运行所用的连接成为可能。这在但处理系统里是默认配置。
The Streaming Server uses modules to respond to requests and complete tasks.
Streaming Server使用modules来响应请求和完成任务。
三种类型mudules:
1. Content-Managing Modules
   将RTSP请求和应答同media sources关联起来,比如一个文件或者一个broadcast
每个模块负责解释客户端请求,读取和解析它们所支持的文件和网络资源,并用RTSP/RTP做出回应。
具体模块:QTSSFileModule, QTSSReflectorModule, QTSSRelayModuleQTSSMP3StreamingModule
2.Server-Support Modules
        执行资料收集和日志功能。
具体模块:QTSSErrorLogModule, QTSSAccessLogModule, QTSSWebStatsModule, QTSSWebDebugModule,QTSSAdminModule, and QTSSPOSIXFileSystemModule.
3.Access Control Modules
        提供就像URL路径处理那样鉴别与授权功能。
具体模块:QTSSAccessModule, QTSSHomeDirectoryModule, QTSSHttpFileModule,QTSSSpamDefenseModule.
Interface
QTSServerInterface
RTSPSessionInterace
RTPSessionInterface
RTSPRequestInterface
classes
server对象有个参数选择字典。
server拥有一个modules列表,每一个都有一个参数选择字典。
server拥有一个RTP client sessions列表。每个RTP client session有一个RTSP Session和一个或者多个RTP media streams
可以通过这些API遍历(to walk all of ...)活跃的sessionsstreams
rtsp请求:
当服务器收到RTSP请求时创建一个RTSP请求对象,包含一些描述请求属性的信息。这时候,qtssRTSPReqFullRequest属性是唯一属性,它拥有一个值,
这个值包含了RTSP请求的完整内容。
然后,Server按照预先确定的顺序调用模块的具体role



Rtsp请求处理流程:
首先被调用的是RTSP Filter role。Server会遍历并调用每一个注册有RTSP Filter role的module并把RTSP request object传递给它们。
每module的RTSP Filter role都有权改变qtssRTSPReqFullRequest属性值。
当完成所有RTSP Filter role的调用后,Server将解析RTSP请求,解析过程包括:
l 填充RTSP object其余的属性。
l 建立两个session:
① RTSP session
② Client Session
解析过程完毕后,Server将调用每个被注册的RTSP Route role并解析RTSP object,RTSP Route role有权根据某些属性决定是否改变qtssRTSPReqRootDir属性值
,从而改变处理这个请求所使用的文件夹。
随后server调用RTSP Preprocessor role,它根据qtssRTSPReqAbsoluteURL匹配这个请求是否该模块所处理的类型。如果请求匹配,RTSP Preprocessor role将调用QTSS_Write
or QTSS_WriteV 发送数据给client来响应该请求。(调用QTSS_SendStandardRTSPResponse 等,将返回标准应答)
如果没有RTSP Preprocessor role响应该RTSP请求,server将执行被模块成功注册过的RTSP Request role。
最后是RTSP Postprocessor role。





module调用serverQTSS_Play生成媒体数据。server调用RTP Send Packets role。RTP Send Packets role 调用QTSS_Write 或 QTSS_WriteV向client发送数据。
QTSS Modules必须遵守下面的原则:
1. 执行任务,然后将控制权交个server要尽可能快。快速返回可以让server在响应大数量客户端请求时保持负载平衡。
2. 为流I/O过程中出现QTSS_WouldBlock错误做准备。QTSS_Write、QTSS_WriteV、QTSS_Read等回调函数会在I/O将要阻塞时返回QTSS_WouldBlock。
3. 尽量避免使用同步I/O。一个I/O阻塞可能会影响其它客户端的流媒体质量。
Server Time
QTSS_TimeVal记录了server的内部时钟:从1970年一月一号凌晨0点开始的毫秒数。
QTSS Streams
QTSSStream 这是一个广义的Stream抽象,用来从许多I/O类型读取或写入数据,包含但不仅仅局限于文件(File),还有错误日志(error log),sockets,以及利用RTSP/RTP进行的交互等
(具体例子看92页最后一行)。
除非特别注明,所有的流数据(streams)都是异步的。
Module需要有处理QTSS_WouldBlock 错误的代码,服从限制条件,遵守这一章前边提出的几个原则。
一个流回调函数(stream callback)在完成被请求的操作后,将要求当前线程阻塞,这将返回一个QTSS_WouldBlock错误。例如在一个socket上QTSS_Write时,socket正在接受流控制。
当模块(module)收到一个QTSS_WouldBlock结果时,模块将调用QTSS_RequestEvent回调函数向server请求一个通知,该通知在指定的stream对I/O可用时发出。调用QTSS_RequestEvent后
,模块应立即将控制权交还给server。当指定的stream对I/O可用时,模块(module)将会在同一个角色(role),同一个状态被重新唤醒(re-invoked).
流类型(Stream types):
QTSS_ErrorLogStream
QTSS_FileStream
QTSS_RTSPSessionStream
QTSS_RTSPRequestStream
QTSS_RTPStreamStream
QTSS_SocketStream
QTSS Services
Service可能是server提供的内置(build-in)service。也可能是其它模块提供的额外(added)service。
一个service实例:a logging module允许其它module写信息到错误日志。




相关帖子

沙发
keer_zu|  楼主 | 2014-9-5 22:02 | 只看该作者
yyy71cj 发表于 2014-9-5 21:53
嗯,很高深,你都让坛友们很难回帖

苹果的开源项目,最近正在研究这个,有结果就想分享给大家。

使用特权

评论回复
板凳
keer_zu|  楼主 | 2014-9-6 07:53 | 只看该作者
yyy71cj 发表于 2014-9-6 07:38
这代码源远流长,看起来让人望而生畏。可否先将思想晒晒,然后再对症下代码? ...

说的也是,虽然我没弄代码,虽然也是思想,不过没有切入点,OK。

使用特权

评论回复
地板
keer_zu|  楼主 | 2014-9-9 15:39 | 只看该作者
QTSS Services
Service可能是server提供的内置(build-in)service。也可能是其它模块提供的额外(added)service。
一个service实例:a logging module允许其它module写信息到错误日志。
模块(module)使用回调函数调用和注册services。
模块(module)用类似添加/查找Object的属性(attributes)的方式添加/查找service。
么个Service有一个名字,调用的模块必须知道这个名字,并使它成为一个ID。
每个service有它自己特殊的参数块儿格式。输出service的模块必须 ********** *********

添加service的模块在它自己的register角色(role)调用QTSS_AddService添加模块到server的内部services数据库。
void MyAddService()
{
QTSS_Error theErr = QTSS_AddService("MyService", &MyServiceFunction);
}

使用一个service时,必须先调用QTSS_IDForService获取ID,有了这个ID,模块再调用QTSS_DoService让这个service运行起来。
Starting a service:

void MyInvokeService()
{
// Service functions take a single void* parameter that corresponds
// to a parameter block specific to the service.
MyServiceParamBlock theParamBlock;
// Initialize service-specific parameters in the parameter block.
theParamBlock.myArgument = xxx;
QTSS_ServiceID theServiceID = qtssIllegalServiceID;
// Get the service ID by providing the name of the service.
QTSS_Error theErr = QTSS_IDForService(‘MyService’, &theServiceID);
if (theErr != QTSS_NoErr)
return; // The service isn’t available.
// Run the service.
theErr = QTSS_DoService(theServiceID, &theParamBlock);
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:qq群:49734243 Email:zukeqiang@gmail.com

1349

主题

12426

帖子

53

粉丝