jitterBuffer概述
jitterBuffer:
jitterBuffer严格上来说分为jitter和buffer,一些实现上把jitterbuffer一起实现,所以就直接称为jitterbuffer.
jitter:
维基百科上对jitter的定义:
1 | 抖动(英语:Jitter),又可称为时基误差,指的是电子学和电信领域中,周期信号与真实周期之间的差异,通常是相当于参考时钟信号而言。 |
在网络相关的场景下,jitter也是表示抖动,但是是表示网络的抖动。什么叫网络的抖动?网络传输就像水的传输,正常情况下的传输,是匀速的,像匀速的水流,
当出现了影响网络的因素,如拥塞等,就像水管出现拥堵,水流此时就不是稳定的了,网络上的包传输也不是匀速的,原本能在t1+1 的时间到达,拖到了t1+2才到。
Buffer:
即常规的缓存。因为乱序到达,丢包,或者处理不过来等情况做处理,缓存就是解决这些场景问题的一种手段。也是一种结构。
jitter的本质
为什么需要关心jitter?
网络上的数据包非匀速到达,即抖动,会导致一些问题,比如包乱序了,原本应该到达的包没到,可能会阻塞其他包的处理,如tcp的首包问题。一些实现处理这些问题往往是等到乱序了,出现问题了,才去处理,
此时问题已经发生。甚至已经很严重了,带有延迟性。
如何更早的发现? 答案就是jitter,当然,也可能出现jitter抖动和乱序同时发生的情况,jitter在这里的优势是更好的量化和控制。
PS: 一些实现通过乱序丢包来做类似jitter的处理,当他们无法计算出jitter时,也是有合理性的。jitter的表示
jitter是一个时间值,单位一般是ms,一般代表网络抖动。jitter的使用场景
jitter一般用于在网络传输不平滑的情况下(如乱序,帧大小变化,网络传输速率变化),平滑帧率(解码帧率,或传输出帧帧率等等)jitter的基本计算:
1
2
3
4
5
6
7
8
9
10根据RFC3550,假设RTP包i,RTP报头记录的时间戳为Si(单位为采样率),到达接收端的时间为Ri(单位同样为采样率),对于包i,j,我们定义一个变量D,描述两个包时间的差异,由接收时间差减去发送时间差:
(即i->j的抖动)
D(i,j)=(Rj−Ri)−(Sj−Si)=(Rj−Sj)−(Ri−Si)(1)
为了消除噪声,抖动J按如下公式定义:
J(i)=J(i−1)+(|D(i−1,i)|−J(i−1))/16(2)
上述公式中i-1指的是前一个收到的包,不是按RTP序列号计数的。增益参数1/16是为了消除噪声影响,使抖动收敛在较合理范围内,避免突发数据的影响。
由公式可知,如果接受端收到的包间隔跟发送端发送间隔一样,那么抖动为0。如何更准确的计算jitter:
因为网络速率,网络情况等是一个随机过程(即每个时间的状态是不一样的),所以计算每个网络状态下的抖动来得到jitter,可以利用卡尔曼滤波来较准确的计算到。
推荐一篇:webrtc的jitter 算法:卡尔曼滤波,在解码时计算。
https://www.cnblogs.com/ishen/p/15000909.htmlbuffer和jitter的关系
如上所述:jitterBuffer严格上来说分为jitter和buffer,一些实现上把jitterbuffer一起实现,所以就直接称为jitterbuffer.
而且,buffer往往依赖jitter。
buffer主要是流媒体传输过程中为了有序或者依赖顺序,而造的缓冲区,常和jitter一起使用,缓冲区的使用,会带来延迟。webrtc jitter的实现。
webrtc buffer
在webrtc实现中,jitter和buffer是相对分开的。
视频buffer
分为包buffer,帧buffer等。因为处理阶段不同。
音频buffer:
简单展示