webrtc video jitter详解(二)

1,kalman滤波原理

https://www.zhihu.com/question/23971601

假设你有两个传感器,测的是同一个信号。可是它们每次的读数都不太一样,怎么办?
取平均。
再假设你知道其中贵的那个传感器应该准一些,便宜的那个应该差一些。那有比取平均更好的办法吗?
加权平均。
怎么加权?假设两个传感器的误差都符合正态分布,假设你知道这两个正态分布的方差,用这两个方差值,(此处省略若干数学公式),你可以得到一个“最优”的权重。
接下来,重点来了:假设你只有一个传感器,但是你还有一个数学模型。模型可以帮你算出一个值,但也不是那么准。怎么办?
把模型算出来的值,和传感器测出的值,(就像两个传感器那样),取加权平均。
OK,最后一点说明:你的模型其实只是一个步长的,也就是说,知道x(k),我可以求x(k+1)。问题是x(k)是多少呢?答案:x(k)就是你上一步卡尔曼滤波得到的、所谓加权平均之后的那个、对x在k时刻的最佳估计值。

我的理解是分别计算模型值和测量值的方差,方差越小,说明置信度越高,计算加权平均时权重越大。

2,webrtc中jitterdelay计算

  • 观测值:frameDelay = t(i) – t(i-1) – (T(i) – T(i-1))
    其中t(i)表示当前帧本地接收时刻,t(i-1)表示上一帧本地接收时刻;T(i)表示当前帧的时间戳,T(i-1)表示上一帧的时间戳。frameDelay表示相邻两帧的相对延迟
  • 模型值:frameDelay= (frameSize – prevFrameSize )*theta[0] + theta[1]
    其中theta[0]表示信道传输速率的倒数,theta[1]表示网络排队时延
    通过kalman滤波计算出theta[0]和theta[1](参阅这篇文章https://www.jianshu.com/p/bb34995c549a),然后计算jitterdelay。

JitterDelay由两部分延迟造成:传输大帧引起的延迟和网络噪声引起的延迟。其计算公式如下
JitterDelay = theta[0] * (MaxFS – AvgFS) + [noiseStdDevs * sqrt(varNoise) – noiseStdDevOffset]

其中theta[0]是信道传输速率的倒数,MaxFS是自会话开始以来所收到的最大帧大小,AvgFS表示平均帧大小。
noiseStdDevs表示噪声系数2.33,varNoise表示噪声方差(观测值frameDelay与模型值差值的方差),noiseStdDevOffset是噪声扣除常数30

3,webrtc中延时应用

在VCMTiming中计算延时
用current_delay_ms_表示前一帧总的延时(jitterdelay+ decodedelay + renderdelay)

VCMReceiver::FrameForDecoding(max_wait_time_ms)
   =>VCMJitterBuffer::NextCompleteFrame //返回decodable_frames_.Front()
   =>VCMTiming::SetJitterDelay  //根据kalman滤波算出的网络抖动延时,更新到timing里
   =>VCMTiming::UpdateCurrentDelay  
      =>计算总的延时target_delay_ms=jitterdelay+ decodedelay + renderdelay,
      =>计算与当前延时抖动,delay_diff_ms=target_delay_ms-current_delay_ms_
      =>控制delay_diff_ms在(-100/fps, 100/fps)范围内,即前后两帧的延时抖动不能超过100ms/fps
      =>更新current_delay_ms_+=delay_diff_ms
   =>VCMTiming::RenderTimeMs  //计算该帧显示的绝对时间
      =>(当前帧的时间戳-第一帧的时间戳)/90+第一帧绝对时间,得到当前帧的绝对时间
      =>控制current_delay_ms_在(min_playout_delay_ms_,max_playout_delay_ms_)范围内,得到actual_delay 
      //其中min_playout_delay_ms_与音视频同步相关
      =>返回当前帧绝对时间+actual_delay,即该帧显示的绝对时间render_time_ms
   =>根据render_time_ms-当前时间-decodedelay-renderdelay得到还富余的时间wait_time_ms
   =>在wait_time_ms满足最大获取时间max_wait_time_ms的前提下,线程等待(wait_time_ms)。
      否则函数结束,返回null;即当前缓冲区内没有满足时间要求应该显示的帧
   =>VCMJitterBuffer::ExtractAndSetDecode //此时真正从decodable_frames_删除frame,更新decode_state

在该帧实际解码前,还会根据实际时间更新timing中current_delay_ms_,如果程序运行中实际耗时超过预期等待时间,在current_delay_ms_不超过target_delay_ms的前提下,将current_delay_ms_更新到实际的延时。

优化点:1. 如果想要降低缓冲延时,减小max_playout_delay_ms_;如果想提高视频平滑度,增加min_playout_delay_ms_
2. NACK作为抗丢包方法会引入额外延迟,这个延迟不是网络自身的抖动,如果Jitterbuffer不把NACK带来的延迟考虑进去,那么很容易导致卡顿,jitterdelay需要根据nack请求数量提前加上rtt延时,不要等到重发包到达再增加延时

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: WebRTC抖动缓冲器是一种用于处理网络延迟和抖动的技术。它可以在音频和视频传输过程中缓存数据包,以确保数据包按照正确的顺序到达接收方,并且可以在需要时进行重传。抖动缓冲器可以帮助提高音频和视频的质量,减少延迟和丢包率,从而提高用户体验。 ### 回答2: WebRTC jitterbuffer是一种用于优化WebRTC音频和视频流的技术。在网络通信中,数据包的传输不可避免地会出现延迟,这可能导致音频和视频流的中断和卡顿。为了解决这个问题,WebRTC jitterbuffer使用一种缓冲机制,以平衡延迟和数据传输的完整性。 WebRTC jitterbuffer接收来自网络的音频和视频帧,并通过调整它们的播放时间来平衡延迟。如果网络不稳定或拥塞,WebRTC jitterbuffer会增加缓冲,以确保音频或视频流的连续性。当网络稳定时,WebRTC jitterbuffer会逐渐减少缓冲的大小,以减少延迟和改善实时反应性。 此外,WebRTC jitterbuffer还可根据特定的需求进行定制。例如,它可以根据网络质量和设备性能进行动态调整。它还可以通过将音频和视频流分别处理,来更好地优化总体性能。 总的来说,WebRTC jitterbuffer是一种有效的技术,可以帮助WebRTC用户克服网络延迟的问题,提供更好的音频和视频通信体验。随着WebRTC应用程序的广泛应用,WebRTC jitterbuffer的重要性也逐渐凸显。 ### 回答3: WebRTC JitterBuffer – 意指 WebRTC 的抖动缓冲器,是一种数据处理机制,主要用于解决因网络传输延迟不一致导致的数据抖动或突变问题。WebRTC 向来被视为一种适用于实时实时通信场景的音视频传输协议,依靠其先进的传输技术,WebRTC 能够将高品质的音视频数据进行实时传输,并保证在不同网络延迟下的稳定性和流畅性。 然而,由于公共互联网环境的不可预测性,很容易会遭遇到网络延迟、数据丢包等问题,从而导致用户在接收音视频时出现抖动的情况。这时候就需要使用 WebRTC JitterBuffer 来对数据进行处理,使其变得更加平滑,并对数据进行合理的延时处理WebRTC 抖动缓冲器的主要作用是针对网络抖动或突变对音视频数据进行一定的延迟处理,并从丢包数据中恢复丢失的数据。在 WebRTC 中,一般会采用混合适应性抖动缓冲器(Hybrid Adaptive Jitter Buffer)的机制来进行处理,具体详见以下的处理流程: 1.接收数据 - WebRTC 首先会收集音视频数据,并对数据进行封装和编码,然后通过 UDP 协议进行传输。 2.处理网络抖动 - 当数据经过网络时,会因为网络延迟、网络丢包、网络拥塞等原因造成数据的抖动现象。WebRTC JitterBuffer 就会在此时进行响应,对抖动数据进行中间处理,从而使数据流畅而不受到抖动的影响。 3.延迟处理 - 当 WebRTC JitterBuffer 处理完抖动数据后,还可以对数据进行一定的延迟处理。这是因为,数据在传输过程中,很容易收到网络情况的影响,从而导致数据的突变现象。延迟处理可以缓解这一问题,并使音视频数据更平滑地呈现在用户面前。 4.数据解码 - 最后,WebRTC JitterBuffer 将处理好的音视频数据进行解码,然后交给音频或视频播放器进行渲染和播放。 综上所述,WebRTC JitterBuffer 可以说是 WebRTC 传输协议中重要的一个环节,通过它可以解决音视频传输过程中的抖动或突变问题,并保障了音视频数据的流畅和稳定性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值