0%

live_transJitterbuffer

jitterBuffer概述

jitterBuffer:

jitterBuffer严格上来说分为jitter和buffer,一些实现上把jitterbuffer一起实现,所以就直接称为jitterbuffer.

jitter:

维基百科上对jitter的定义:

1
2
3
抖动(英语:Jitter),又可称为时基误差,指的是电子学和电信领域中,周期信号与真实周期之间的差异,通常是相当于参考时钟信号而言。
时基误差会影响数字模拟转换器的模拟输出。在通信连结(如USB,PCI-E,SATA,OC-48)中,尤其是采样信号的还原过程中,是不希望发生抖动的。[1]
像所有的随时间变化的信号一样,抖动可以被量化,比如均方根,峰-峰值位移;也可以用频谱分布进行量化。

在网络相关的场景下,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.html

    buffer和jitter的关系

    如上所述:jitterBuffer严格上来说分为jitter和buffer,一些实现上把jitterbuffer一起实现,所以就直接称为jitterbuffer.
    而且,buffer往往依赖jitter。
    buffer主要是流媒体传输过程中为了有序或者依赖顺序,而造的缓冲区,常和jitter一起使用,缓冲区的使用,会带来延迟。

    webrtc jitter的实现。

    注意是在解码后。
    https://www.cnblogs.com/ishen/p/15000909.html

webrtc buffer

在webrtc实现中,jitter和buffer是相对分开的。

视频buffer

分为包buffer,帧buffer等。因为处理阶段不同。

音频buffer:

简单展示