darwin之发送数据流(ReflectorSession)

来源:互联网 发布:刷火车票软件 编辑:程序博客网 时间:2024/05/16 16:00


1.darwin如何管理推送的rtsp流?
rtsp://[username]:[password]@[ip]:[port]/[codec]/[channel]/[subtype]/av_stream
ReflectorSession与av_stream相关联 ,通过OSRefTable*sSessionMap来管理(key:av_stream,value:ReflectorSession)


2.ReflectorSession内部如何维护rtsp流呢 ?

在其类内部维护了数组:ReflectorStream,每一个ReflectorStream代表一路流
比如一个rtsp流有音视频两路流,则需要创建两个ReflectorStream来分别管理音视频流。


3.ReflectorSession最终的目的是将流发送给所有的客户端,如何实现的?

在每一个ReflectorStream中维护了一个二维数组,数组的每一个元素代表一个rtp客户端。当有rtsp流推送到服务器上时,
会根据av_stream找到对应的ReflectStream。不断的将该流推送给所有的rtp客户端(当有客户端请求相同的av_stream时).


4.ReflectorSession何时创建?

客户端推流时:在DoSetup函数中创建

客户端取流时:在DoDescribe函数中创建

针对推模式,推流客户端推送url为*.sdp流与接流客户端接收的URL一样。因为ReflectorSession与url地址一一对应,因此DoSessionSetup内部只创建一次ReflectorSession。对模式中,ReflectorSession创建是在Dosetup中由推流客户端发送setup请求时在DoSessionSetup中创建,其余的地方调用DoSessionSetup只是引用之前创建好的ReflectorSession。





5.ReflectorSession如何与rtp客户端关联?

所有的客户端都是接受rtp流,而rtsp协议只是为了接收rtp流做铺垫。

当一个rtsp客户端连接请求流时,darwin会新分配一个RTSPSession与之通信。在RTSPSession内部(SetupRequest时)会创建RTPSession,将并所有参数一并传到QTSSReflectorModule模块去处理。

QTSSReflectorModule模块的DoSetup函数中,将ReflectorSession与RTPSessionOutput关联。


在RTSPSession调用QTSSReflectorModule模块时,一并将 QTSS_StandardRTSP_Params参数(rtsp,rtp客户端,rtsp协议包内容)传进去。