darwin之发送rtp包流程

1.重识ReflectStream

ReflectStream负责rtsp中的一路流反射,负责一路流的 rtcp,rtp两种数据包的接收和发送 。

UDPSocketPair管理rtp,rtcp包数据源 :fSocketA负责接收 rtp包 ,fSocketB接收 rtcp包。

ReflectorSender负责发送数据包: fRTPSender负责发送rtp包,fRTCPSender负责发送rtcp包  。

ReflectorOutput**数组负责管理当前流对应的客户端(接收流 )列表:ReflectorSender遍历ReflectorOutput**数组依次发送数据包。


darwin之发送rtp包流程_第1张图片

2.通过什么机制来发送数据 ?


ReflectorSocket本身是一个task,在其Run函数中用来驱动发送数据包。

ReflectorSocket在获取到数据包后,会立即调用signal方法。

在Run中,由ReflectSender调用ReflectPackets发送数据包。

darwin之发送rtp包流程_第2张图片

ReflectSender遍历ReflectStream维护的水桶客户端,将其发送出去。实际发送数据的接口放在了水桶内部:Writepacket.

darwin之发送rtp包流程_第3张图片

darwin之发送rtp包流程_第4张图片

以上只是提供了 发送数据的一种驱动方式 ,但是 实际发送数据由谁负责 ,并没有 体现 。

实际发送数据的是由RTPStream来负责 。

水桶内部:Writepacket如何与 RTPStream关联呢 ?

水桶(RTPSessionOutput)内部维护了RTPSession(在setup时建立两者关联),在Writepacket中会遍历所有RTPSession中的RTPStream,由RTPStream的Write函数将数据包发送出去。

darwin之发送rtp包流程_第5张图片

darwin之发送rtp包流程_第6张图片


你可能感兴趣的:(darwin代码心得)