一  概念

如果在发送端计算,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值。

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

Logo

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

更多推荐