EasyDarwin 客户端播放转发流代码分析

10 篇文章 0 订阅
6 篇文章 1 订阅

在之前博文https://blog.csdn.net/blobliu/article/details/83012338中分析了转发流及相关类的分析,便会想到当我们播放转发流的时候EasyDarwin是怎么工作的。本次博文便来分析客户端播放转发流代码。

如前面提到的博文讲的ReflectorSocket是接收推流端数据的Socket。ReflectorSocket继承自UDPSocket,同时继承自IdleTask。

IdleTask继承自Task,Task是定义的线程类。

在推流成功后,新建ReflectorSocket就被放入线程执行,执行Run()方法。

在Run()方法中,主要做了两件事

  1. 从端口获取进来的数据
  2. 转发数据并检查是否要发送

1. 从端口获取进来的数据调用的方法是GetIncomingData(...)

在ReflectorSocket::GetIncomingData(...)中调用ReflectorSocket父类的RecvFrom(...)函数接收数据,对应接收到的数据调用之前博文提到的ReflectorSocket::ProcessPacket(...)方法进行处理。

2. 转发数据调用的方法是ReflectPackets(...),这个方法属于转发器(ReflectorSender)。遍历获取所有非空转发器调用ReflectPackets(...)。

在ReflectPackets(...)中通过for循环获取当前转发器(ReflectorSender)的转发流(ReflectorStream fStream)的每一个转发输出流(ReflecotrOutput* theOutput),判断theOutput是否为空,不为空是否正在播放,每一个转发输出流对应一个url,在客户端请求播放这个url的视频流时,对应的转发输出流状态在RTSP播放请求交互中被置为正在播放。

所以当客户端请求播放某个ur时,对应的转发输出流符合IsPlaying(),最终调用SendPacketsToOutput(...)函数将转发输出流的数据就行发送给客户端。

在ReflectorSender::SendPacketsToOutput(...)中调用的核心方法就是WritePacket(...)。

对于推流模式(非拉流),调用的方法是RTPSessionOutput::WritePacket(...)。

在此函数中调用的核心方法是QTSS_Write()。

QTSS_Write()函数调用的是回调类(QTSSCallbacks)中的QTSS_Write(...)函数。

可以看出在QTSSCallback::QTSS_Write(...)中调用的是Write(...)函数,具体调用的是RTPStream中的虚函数。

在此函数中最终调用SendTo方法发送RTP和RTCP数据到客户端。

发送RTP数据。

发送RTCP数据。

至此完成EasyDarwin完成将转发流发送到客户端播放。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值