之前写过<<webrtc gcc详解>>,有网友反馈过当前用webrtc tcc的拥塞算法比较多,这里详解一下webrtc tcc算法,本文主要内容:
-
tcc架构
-
趋势滤波算法
-
webrtc tcc与gcc的比较
1.前言
webrtc的tcc算法,具体做法是,接收端监控两个数据,并反馈给发送端。
-
丢包率: 接收端计算出丢包率,定期发送rtcp rr报文(内有丢包率)给发送端,发送端通过丢包率的大小来决定是否降低编码的bitrate;
-
Transport-wide RTCP Feedback Message,接收端记录每个rtp报文的wideSeqNumber,到达timestamp,整理后打包成rtcp tcc报文发送给rtp发送端,接收端整理rtcp tcc报文中的到达timestamp与发送端的时间等数据,通过趋势滤波算法,判断拥塞程度,是否降低码率,增加码率,或保持码率。
基于丢包率来调整动态编码,是比较简单,很多厂家经常在sfu服务端进行调整,如:如果不是长肥型网络,在丢包率<30%的情况下,rtcp rr中的丢包率和丢包总数欺骗性的填写0,这样发送端(尤其是web端)就不会轻易的降低bitrate,到达测试的良好效果
但是基于tcc架构的带宽预测,相对比较复杂(但是比卡曼滤波简单很多),本文主要讲解这部分的原理和实现
2. Webrtc Tcc架构
2.1 sdp的关键信息
-
rtp extension header
需要使能这个rtp扩展项:
a=extmap:4 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01
如上例子,extensionId=4,表示有rtp报文将携带扩展项transport-wide sequence。在rtp的扩展头中会有16bit的transport-wide sequence,注意这个wide seq不是针对某个视频或音频,而是针对某个PeerConnection(其中可能传输多个音视频),rtp报文的扩展项如下格式:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 0xBE | 0xDE | length=1 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| ID | L=1 |transport-wide sequence number | zero padding |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-
使能Rtcp Fb transport-cc
a=rtcp-fb:96 transport-cc
如上,在rtcp