流媒体弱网优化之路(WebRTC)——断点调试GCC

流媒体弱网优化之路(WebRTC)——断点调试GCC

——
我正在的github给大家开发一个用于做实验的项目 —— github.com/qw225967/Bifrost

目标:可以让大家熟悉各类Qos能力、带宽估计能力,提供每个环节关键参数调节接口并实现一个json全配置,提供全面的可视化算法观察能力。

欢迎大家使用
——


一、GCC调用回顾

  GCC的调用过程存在发送端与接收端两个方向的处理过程,会出现三个过程:
  1.数据发送(记录发送内容);
  2.接收端计算delta,并回复发送端rtcp;
  3.接收feedback,计算斜率输出带宽估计结果。

// 1.GCC发送端数据包发送
rtp_transport_controller_send_->OnAddPacket(packetInfo)
rtp_transport_controller_send_->OnSentPacket(sentPacket, packetInfo.length);

// 2.GCC接收端delta计算(自定义实现)
IncomingPacket(uint64_t nowMs, const RtpPacket* packet)// 3.GCC发送端回调调用
rtp_transport_controller_send_->OnTransportFeedback(*feedback);

二、发送端调试

2.1 OnAddPacket

  将数据包存入transport_feedback_adapter记录序号等信息。

  其中 send_side_bwe_with_overhead_ 为是否考虑将RTP头信息参加估计,这个会影响整个计算的码率。例如:一个正常的RTP头可能是12bytes,但是增加别的扩展头时就会多一些码率占用(abs、mid、tcc、volume 等)。这个置为true就会考虑拓展头占用,false就不考虑。

在这里插入图片描述
  AddPacket中转存了序号等数据并记录发送时间,随后插入队列等待feedback的时候计算数据。
在这里插入图片描述
在这里插入图片描述

2.2 OnSentPacket

  发送数据包并更新存储在adapter发送时间

  发送的过程中会根据 info 中的 included_in_feedback 标记确定该包是否要包含到feedback的统计计算中。如果没有包含则会计算为pending_untracked_size_(不在统计内的包,因为gcc要囊括所有的数据发送情况才能保证带宽估计的准确度)。
在这里插入图片描述
在这里插入图片描述

  更新完发送数据后会计算得到发送到网络的数据量,用于记录飞行数据。

2.3 OnTransportFeedback

  该函数是计算带宽的最终函数,接收到feedback的rtcp包后,我们会得到其中的delta(具体的原理查看我的GCC分析的系列文章——流媒体学习之路(WebRTC)——GCC分析)。
在这里插入图片描述
  transport_feedback_adapter_ 会取出我们之前发送时存入的数据信息,包括发送的序号、数据包大小和发送时间等。然后这两部分的数据会流入到两个不同的位置(后面我再写个webrtc更简单的科普文)。就可以计算出对端接收到的数据量以及delta。

  计算的重点在GoogCcNetworkController的OnTransportPacketsFeedback函数。
  1.从拥塞窗口类更新飞行数据信息(congestion_window_pushback_controller_ 该类目前是实验属性,暂未开启);
  2.更新带宽计算类里用于确定ack数据包的rtt(bandwidth_estimation_ 这个类是丢包估计计算类)。
在这里插入图片描述
  3.packet_feedback_only 模式:
  3.1 更新延迟带宽估计类的rtt数据(该类是主要做延迟带宽估计的类,也可以说是最重要的类——这里的rtt是用于码率计算时确定下一个周期增长码率的)。
  3.2 丢包带宽估计类的rtt记录。
  3.3 丢包带宽估计类更新丢包率(只根据feedback计算的丢包率)。
在这里插入图片描述
  4.应用受限器判断启动(alr_detector_ 类作为判断是否存在无法生成更多数据的情况)。
  5.ack计算类输入feedback数据(acknowledged_bitrate_estimator_ 是计算对端确认数据的类)。
  6.探测数据类计算探测到的带宽(probe_bitrate_estimator_ 用于计算发送的探测包确认的数据)。
          ————对端接收的数据为:探测数据+ack数据。
  7.将数据设置到丢包估计类中。
  8.将feedback数据设置到网络状态估计类中(network_estimator_ 这是个对网络状态进行估计的类,是个在开发中的类咱未开启)。
  9.延迟带宽估计类输入feedback数据进行计算(delay_based_bwe_ 延迟估计类是gcc的核心类,IncomingPacketFeedbackVector是计算的核心函数)。
在这里插入图片描述
  10.把丢包带宽估计的目标码率放入带宽估计类进行计算。
  11.把延迟带宽估计的数据放入丢包带宽估计类中进行对比。
  12.返回最终更新的码率内容。
在这里插入图片描述

三、总结

  本文简单演示了断点整个GCC统计的流程——比较水。大家如果有兴趣的话可以在github下载我的demo代码,一点点去断点调试,后续会加入更多的带宽估计算法,并且会做更多有趣的实验。欢迎大家使用!

  ————下面展示的是在出现带宽限制时,trend变化的趋势、估计码率和发送码率的变化。

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值