WebRTC的RTT计算及作用
rtcp::Rrtr在rrtr.cc。1 VCMNackFecMethod::ProtectionFactor(...),根据rtt,丢包率,判断是用nack还是fec。RTCP SR、RR包的发送间隔大概是1秒1个,间隔不能改成很大,影响RTT更新。如果在发送端计算,RTT = 接收RR包时间-发送SR包时间-DLSR(接收端发送RR包-接收SR包时间)将64位的NTP时间,整数取低16位,分数
一 概念
如果在发送端计算,RTT = 接收RR包时间-发送SR包时间-DLSR(接收端发送RR包-接收SR包时间)
即T-rr - T-sr -(T1-rr - T1-sr)。
发送SR包时间即RR包的LSR,发送SR包时的ntp时间。
将64位的NTP时间,整数取低16位,分数取高16位,变成了32位,即4字节,compact ntp。
NTP时间:1900年1月1日0秒,到现在经过了多少秒。
unix时间:1970年1月1日0秒,到现在经过了多少秒。
二 在发送端计算
//注意:先计算ntp的时间,再转成毫秒
RTCPReceiver::HandleReportBlock(
{
uint32_t send_time_ntp = report_block.last_sr(); //LSR
if (send_time_ntp != 0) {
uint32_t delay_ntp = report_block.delay_since_last_sr(); //DLSR
// Local NTP time.
uint32_t receive_time_ntp =
CompactNtp(TimeMicrosToNtp(last_received_rb_.us()));
// RTT in 1/(2^16) seconds.
uint32_t rtt_ntp = receive_time_ntp - delay_ntp - send_time_ntp;
// Convert to 1/1000 seconds (milliseconds).
rtt_ms = CompactNtpRttToMs(rtt_ntp);
}
}
三 RTT用在那 ?
1 VCMNackFecMethod::ProtectionFactor(...),根据rtt,丢包率,判断是用nack还是fec。
2 fec的protect factor值。
3 NackModule2::UpdateRtt(...)
4 Report,统计相关参数。
不丢包,rtt_ms比20小。
RTCP SR、RR包的发送间隔大概是1秒1个,默认是1秒,间隔不能改成很大,影响RTT更新。腾讯视频会议大概是2、3秒一个。
四 在接收端计算
存在不发送视频流的情况:比如:主播带货观众不发送视频流,视频会议培训,只接收。
extended_reports.cc中
接收端发送:RtcpTransceiverImpl::CreateCompoundPacket,xr.SetRrtr(rrtr); rtcp::Rrtr在rrtr.cc。
发送端发送:RTCPSender::BuildExtendedReports,xr.AddDlrrItem(rti); Dlrr在dlrr.cc。
RTCPReceiver::HandleXrDlrrReportBlock有rtt计算。
uint32_t send_time_ntp = rti.last_rr;
// RFC3611, section 4.5, LRR field discription states:
// If no such block has been received, the field is set to zero.
if (send_time_ntp == 0)
return;
uint32_t delay_ntp = rti.delay_since_last_rr;
uint32_t now_ntp = CompactNtp(TimeMicrosToNtp(clock_->TimeInMicroseconds()));
uint32_t rtt_ntp = now_ntp - delay_ntp - send_time_ntp;
如何启用?
AddDefaultFeedbackParams(VideoCodec* codec,
新增:codec->AddFeedbackParam(FeedbackParam(kRtcpFbParamRrtr, kParamValueEmpty));
WebRtcVideoChannel::WebRtcVideoReceiveStream::ConfigureCodecs(中
config_.rtp.rtcp_xr.receiver_reference_time_report = HasRrtr(codec.codec);为true了。
sdp中就会新增:a=rtcp-fb:96 rrtr。

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐
所有评论(0)