webrtc代码走读二十四(RTT延时计算)

一、概述

WebRTC中有两种方式计算RTT:
基于媒体流发送端的计算。通过Sender Report(SR)和Receiver Report(RR)携带的信息计算。
基于媒体流接收端的计算。通过RTCP Extended ReportsRTCP(XR)携带Receiver Reference Time Report Block和DLRR Report Block的信息。
两种方式计算RTT的原理一样。引入XR计算方式,因为在一些场景,两个端点间一个只发媒体数据,一个只接收,这种场景下接收端不会发送SR,导致无法计算RTT。于是扩展了RTCP XR在接收端计算这种方式。

WebRTC是在RTCPReceiver::OnPeriodicRttUpdate获取RTT延时参数的。当该侧客户端在发送数据的时候,获取根据基于媒体流发送端计算的值。当该客户端仅接收媒体数据,才获取基于媒体流接收端计算的值。

 二、基于媒体流发送端的计算 

delay Since Last SR = T22 - T21

RTT = T12 - T11 - (T22 - T21)

RTT = T12 - T11 - Delay Since Last SR

发送端需要打包Sender Report(SR),解析处理Receiver Report(RR)协议。

1、Sender Report(SR)协议

NTP timestamp:64bits。记录着发送该SR的NTP时间戳。

wireshark示例如下:

RTCPSender::BuildSR代码实现如下: 

 

 2、Receiver Report(RR)协议

last SR(LSR): 32 bits。64位NTP时间戳中间的32bit(NTP时间戳指绝对时间,相对1900年1月1日00:00:00经历的时间,单位为秒。完整NTP时间戳用64bits表示,左半32bits表示整数,右半32bits表示小数,一般为了紧凑,取中间32bits表示即可,这时整数与小数分别16bits表示)。记录着上次源SSRC_n发送SR的NTP时间,从收到的SR记录的NTP时间戳获取。如果没有收到SR,值为0。
delay since last SR (DLSR): 32 bits。以1/65536(2^16)秒为单位。记录着上次接收到源SSRC_n发送的SR到当前发送RR的间隔时间。如果没有收到SR,值为0。 

wireshark示例如下:

  •   媒体接收端封装RR报文
PlatformThread::StartThread(void * param) 
->PlatformThread::Run() 
->ProcessThreadImpl2::Run(void * obj)
->ProcessThreadImpl2::Process() 
->ModuleRtpRtcpImpl2::Process() //配置周期发送RTCP的RR报文TimeToSendRTCPReport&SendRTCP
->RTCPSender::SendRTCP
->RTCPSender::ComputeCompoundRTCPPacket
->RTCPSender::BuildRR
->RTCPSender::CreateReportBlocks

接收端发送RTCP的RR报文,是周期发送。 last SR为接收端收到的最后一次RTCP SR报文的NTP时间戳。

 

  •  媒体发送端解析计算RTT值
ModuleRtpRtcpImpl2::IncomingRtcpPacket
->RTCPReceiver::IncomingPacket
->RTCPReceiver::IncomingPacket
->RTCPReceiver::ParseCompoundPacket
->RTCPReceiver::HandleReceiverReport
->RTCPReceiver::HandleReportBlock

RTCPReceiver::HandleReportBlock函数获取发送端的当前NTP时间,然后再从RR报文中提取出last_sr、delay_since_last_sr就可以计算出RTT延时时间。

三、基于媒体流接收端的计算

1、Receiver Reference Time Report Block 

 

wireshark示例:

  2、DLRR Report Block

wireshark示例:

接收端在RTCPReceiver::HandleXrDlrrReportBlock函数计算RTT延时。 

 

 参考:

WebRTC研究:统计参数之往返时延 - 剑痴乎

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当涉及到使用 WebRTC VAD (Voice Activity Detection) 的代码时,你可以参考以下示例: ```python # 导入所需的库 from webrtcvad import Vad import wave # 创建一个 VAD 实例 vad = Vad() # 设置 VAD 的模式(1,2,3) vad.set_mode(2) # 打开音频文件 audio_file = wave.open('audio.wav', 'rb') # 读取音频文件的参数 sample_width = audio_file.getsampwidth() sample_rate = audio_file.getframerate() # 每次处理的音频帧大小(10 毫秒) frame_size = int(sample_rate / 100) # 用于存储检测到的音频活动段的列表 active_segments = [] # 读取并处理音频文件 while True: # 读取一帧音频数据 frame = audio_file.readframes(frame_size) # 如果没有读取到数据,则结束循环 if not frame: break # 将音频数据传递给 VAD 进行活动检测 is_speech = vad.is_speech(frame, sample_rate) # 如果检测到音频活动,则将活动段添加到列表中 if is_speech: active_segments.append(frame) # 关闭音频文件 audio_file.close() # 输出活动段的数量 print(f"Detected {len(active_segments)} active segments") # 处理检测到的活动段... ``` 上述代码中,我们首先导入了必要的库,包括 `webrtcvad` 和 `wave`。然后,我们创建了一个 VAD 实例,并通过 `set_mode` 方法设置 VAD 的模式(1、2 或 3)。接下来,我们打开待处理的音频文件,并读取其参数(采样宽度和采样率)。 我们使用 `readframes` 方法读取每一帧音频数据,并将其传递给 VAD 的 `is_speech` 方法进行活动检测。如果检测到音频活动,则将该活动段添加到 `active_segments` 列表中。 最后,我们关闭音频文件,并可以进一步处理检测到的音频活动段。 请注意,上述代码仅为示例,你可能需要根据实际情况进行适当修改和调整。另外,在使用之前,请确保已安装 `webrtcvad` 库,可以通过以下命令进行安装: ``` pip install webrtcvad ``` 希望对你有帮助!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值