一、延时计算原理
1)jitter延时计算公式
JitterDelay由两部分延迟造成:传输大帧引起的延迟和网络噪声引起的延迟。计算公式如下:
JitterDelay = theta[0] * (MaxFS – AvgFS) + [noiseStdDevs * sqrt(varNoise) – noiseStdDevOffset]
该公式详细推导过程,请参见大牛的文章《WebRTC视频接收缓冲区基于KalmanFilter的延迟模型》
theta[0]:信道传输速率的倒数
MaxFS:自会话开始以来所收到的最大帧大小
AvgFS:表示平均帧大小
noiseStdDevs:表示噪声系数2.33
varNoise:表示噪声方差
noiseStdDevOffset:是噪声扣除常数30
2)jitter延时更新流程
二、延时计算代码
1)总述
FrameBuffer::ReturnReason FrameBuffer::NextFrame函数调用计算函数。
CalculateDelay计算frameDelay延时。
UpdateEstimate更新jitter延时时间。
VCMJitterEstimator::CalculateEstimate计算最终的jitter时间。
2)frameDelay帧间延时时间计算
实现函数:VCMInterFrameDelay::CalculateDelay
计算原理:
理论上发送端发送一帧时间(T1-G1 first timestamp)与接收端接收一帧的时间相等(G1_size)。但是实际上由于网络延时等异常,会出现(G1_size)大于(T1-G1 first timestamp)的情况。他们时间的差值就是该帧在网络上传输的延时时间。
视频1秒钟对应90KHZ的采样率,时间戳是根据这个关系式换算成时间。