一、 什么是JitterBuffer

Jitter Buffer也叫做抖动缓冲区,它是实时音视频里面的一个重要模块,它对数据包丢失、乱序、延迟到达等情况进行处理,平滑的向解码模块输出数据包/帧,抵抗各种弱网情况对播放/渲染造成的影响,降低卡顿,提高用户的观看体验。

二、JitterBuffer在音视频系统中的位置

JitterBuffer在实时音视频系统中的位置如下所示:

三、 视频JitterBuffer的工作原理

1. JitterBuffer的核心思想

Jitter buffer的核心思想是用时间换空间,以增大端到端的延迟为代价来换取视频通话的流畅性。当网络不稳定时(抖动发生),增加buffer的长度,多缓存一些数据,以应对将来可能发生的抖动;当网络稳定下来时,减小buffer的长度,少缓存一些数据,降低视频端到端的延迟,提高实时性。因此jitter buffer的运行过程是一个根据抖动来动态调整buffer长度的过程。好的jitter buffer能够在保证尽量不卡的前提下降低端到端的延迟,即它能够在延迟和卡顿率之间取得较好的平衡。

2. 产生抖动的原因

1) 网络传输路径改变。例如,当前的传输路径是A,但是下一刻路径A上的某个路由器出现了故障,这时候数据包的路径就会发生改变,导致端到端的传输时长发生变化。

2) 网络自身的抖动。很多情况下网络有噪声,产生抖动是很正常的。

3) 网络发生拥塞。拥塞发生的时候,数据包会在路由器上排队,导致端到端延迟变大。

4) 抗丢包手段带来的额外抖动。网络出现丢包的时候,我们一般会使用nack/arq去重传数据,重传会带来额外的延迟。

3. 计算抖动的方法

数据包传输时长的变化就是抖动,假设相邻的两个数据包packet1和packet2,它们发送时间戳是send_timestamp1和send_ timestamp2,接收时间戳是recv_ timestamp1和recv_ timestamp2,那么它们之间的抖动可以按照下面的方法计算:

这是最简单的计算方法,要想准确计算出网络抖动还需要考虑很多因素,这里不再赘述。

4. JitterBuffer的工作原理

1) 接收侧收到数据包,开始组帧,这一步是必须的,帧不完整会导致花屏。

2) 每个帧组好之后,放进buffer里,然后按照帧序号进行排序。

3) 检查帧的参考关系。对于解码器来说,如果一个帧的参考帧丢失了,那么这个帧将解码失败或者花屏,所以参考关系必须要满足之后才能把数据送进解码器里。

4) 根据每一帧的时间戳(采集时间戳或者发送时间戳)以及接收时间戳计算抖动。这里的难点在于如何精确计算抖动。

5) 根据抖动计算buffer的长度。

6) 根据抖动自适应的调整buffer长度。抖动越大,预留的buffer长度越大,这样可以利用增加延迟的方式来降低卡顿;抖动越小,预留的buffer长度越小,这样可以降低延迟。

四、浅析webrtc里的视频JitterBuffer

1.WebRTC里视频JitterBuffer的运行机制

Jitterbuffer被两个线程操作,写线程负责组帧完成之后把数据写入JitterBuffer里,读线程负责从JitterBuffer里读取数据然后解码。

写线程

1) 判断当前视频帧是否有效,把帧插入buffer里,然后移除buffer里过期的、无效的帧;

2) 判断帧之间的参考关系是否已经满足;

3) 如果当前帧可以解码,那么激活解码线程(读线程)。

读线程

1) 找到buffer中第一个可以解码的帧(假设它是frame):如果这个帧的渲染时间戳是无效的,那么根据当前的抖动(开始的时候抖动值是0,它在步骤3中被更新)计算每个帧的渲染时间戳(render timestamp),并保存在帧信息中,然后根据这个帧的渲染时间戳和当前时间计算最大需要等待的时间(最大的等待时间不会超过200毫秒),然后休眠等待;

2) 如果在等待的时间内还有新的可以解码的帧到来,那么重复步骤2,直到超时;

3) 根据frame的时间信息以及帧大小计算新的抖动值,并用这个抖动更新当前的抖动。

2. 计算抖动延迟

抖动延迟由网络抖动延迟、解码延迟、渲染延迟构成。其中,解码延迟和渲染延迟比较稳定,网络抖动延迟是动态变化的。计算网络抖动是Jitterbuffer的核心之一。webrtc认为网络抖动由两个部分构成:

1) 网络噪声带来的抖动延迟,也叫做网络排队延迟

2) 传输大的视频帧(特别是关键帧)对网络造成冲击带来的抖动延迟

为了准确估算出抖动延迟,必须要估算出网络排队延迟和信道速率(通过信道速率可以计算大的视频帧对网络造成的冲击所带来的延迟) 。webrtc使用卡尔曼滤波估算网络排队延迟和信道速率。卡尔曼滤波是一种预测的算法,它以协方差为标准,根据上一时刻的系统状态估算当前时刻系统的状态,然后根据当前的测量值调整当前时刻系统的状态,最后得到当前最优的系统状态。它认为估算出来的值和测量出来值都是有偏差的,因此要根据一个偏好因子(卡尔曼滤波增益系数)来判断我们最后需要的值更加偏向于估计值还是测量值。由于卡尔曼滤波比较复杂,这里并不打算深入探讨,下面介绍一下使用卡尔曼滤波计算网络抖动延迟的大致流程:

1) 抖动的计算与信道速率、网络排队延迟有关,因此要计算抖动,就必须先计算信道速度和网络排队延迟

2) 把信道速率和网络排队延迟当作系统状态,算法的目标就是估算出最优的信道速度和网络排队延迟。假设系统是一个线性系统,如果网络非常好,那么很容易估算出当前系统的状态等于上一个时刻的系统状态,也就是说信道速度和网络排队延迟保持不变

3) 但是实际上网络是动态变化的,因此需要对估算出的这个系统状态(即信道速度和网络排队延迟)进行调整

4) 调整的具体方式:

a) 根据抖动延迟的观测值(两帧传输时长的变化值)和预测值(根据上一个系统状态推导出来),计算它们的残差;

b) 利用残差计算网络噪声;

c) 根据抖动延迟观测值、前后两帧大小差值、网络噪声、系统误差协方差等计算卡尔曼增益系数

d) 利用卡尔曼增益系数更新系统状态(即信道速率和网络排队延迟)

5) 根据更新后的系统状态计算抖动延迟:

3. 根据抖动延迟计算视频帧的渲染时间

得到网络抖动延迟之后,计算总的抖动延迟:jitter_delay = net_jitter_delay + decode_delay + render_delay。然后根据抖动延迟和当前的时间,计算什么时候渲染当前的视频帧,然后根据渲染时间和当前时间确定当前帧在解码之前需要等待的时间(wait_time),通过wait_time保证了各个视频之间是平滑的,减少了卡顿。另外在等待的时间内也可以缓存更多的视频帧,避免了下一次遇到弱网时再次卡顿。

五、视频JitterBuffer在云信NRTC中的应用

NRTC是网易云信自研的实时音视频通信系统,NRTC的Jitterbuffer在计算网络抖动的基础上考虑了丢包带来的影响。一般的抗丢包手段有FEC和NACK,两种方法各有优劣,FEC延迟比较低,但是浪费带宽,NACK可以节省带宽,但是会带来延迟。NRTC使用FEC+NACK作为抗丢包手段,当遇到突发丢包时,使用NACK请求发送方重发丢失的包,如果丢包持续,那么使用FEC增加冗余防止丢包。根据前面的分析我们知道,NACK作为抗丢包手段是会引入额外延迟的,这个延迟不是网络自身的抖动,如果Jitterbuffer不把NACK带来的延迟考虑进去,那么很容易导致卡顿,降低用户的主观体验,因此NRTC的Jitterbuffer把网络抖动和NACK带来的延迟综合考虑,通过实时监测网络变化,在低延迟和流畅性上取得了比较好的平衡。

网易干货 | 浅析视频Jitter Buffer相关推荐

  1. 报名丨“眼界大开 声临其境”网易首届音视频技术大会倒计时!

    视觉是万物感知的主要信息来源,听觉让沉默的信息更进一步,变得"有声有色". 移动互联网时代下,"声色俱佳"的在线学习.工作.娱乐方式广受欢迎,互动直播.视频会议 ...

  2. webrtc jitter buffer

    一.jitter buffer 介绍  二.jitter 估计  三.buffer 处理 rtp 包逻辑  四.接收和解码流程  五.FrameBuffer 类介绍 /*  ************* ...

  3. 仿网易/QQ空间视频列表滚动连播炫酷效果

    代码地址如下: http://www.demodashi.com/demo/11201.html 一.准备工作 AndroidStudio 开发环境 需要下载七牛的开源播放器SDK 本例子实现了仿网易 ...

  4. 网易上线短视频创作平台“网易知识公路“

    ​继腾讯,百度之后,网易也盯上了短视频领域,重磅上线短视频创作平台--网易知识公路,正式杀入短视频赛道. 根据杰哥了解,网易这次短视频计划,貌似也是准备闭环私域运营,主要围绕网易自家开发的短视频创作平 ...

  5. rtcp 的jitter buffer

    //@[TOC](jitter buffer) jitter buffer rtcp xr jb 草案 觉得这篇draft写的挺好,适合入门阅读. zhangbin 20191128 翻译 jitte ...

  6. java jitter buffer_android webrtc jitter buffer大小设置

    1. PeerConnectionClient.java 设置在如下接口: private void createPeerConnectionInternal(Context context,EglB ...

  7. 音频传输之Jitter Buffer设计与实现

    在语音通信中Jitter Buffer(下面简称JB)是接收侧一个非常重要的模块,它是决定音质的重要因素之一.一方面它会把收到的乱序的语音包排好序放在buffer里正确的位置上,另一方面它把接收到的语 ...

  8. 网易视频云: 网易平台级视频服务存储技术

    现在,网易视频云与大家分享一下网易平台级视频服务存储技术. 云计算近年以每年32%的增长率飞速发展,视频云领域也正以80%的流量逐年递增,腾讯.阿里.金山.,乐视,当然还有网易,各大厂商都加入了视频云 ...

  9. 网易自媒体视频,批量修改md5采集下载上传,批量自动去水印加水印软件 今日头条自媒体视频,youtubu...

    网易自媒体视频,批量修改md5采集下载上传,批量自动去水印加水印软件 今日头条自媒体视频,youtubu 视频去重,批量自动去水印加水印软件 快视频,视频消重技术去水印去logo字幕工具 搜狐自媒体视 ...

最新文章

  1. connot not ensure the target project location exist and is accessible
  2. centos卸载harbor_【Harbor】Harbor镜像仓库的安装与历史版本镜像的清理
  3. 你能找到心仪的妹子吗?- 时间复杂度进阶
  4. 在Ubuntu中打开pycharm步骤:
  5. 【每周NLP论文推荐】 开发聊天机器人必读的重要论文
  6. java 画树_java – 如何绘制代表连接节点图的树?
  7. thinkphp3.2+cropper上传多张图片剪切图片
  8. 解决Ajax中IE浏览器缓存问题
  9. 计算机毕业设计jsp社区养老服务管理系统
  10. 什么是有氧运动?什么是无氧运动?哪个减肥效果更好?
  11. 阿联酋选出首位 AI 国务部长(附Youtube视频)
  12. C语言:L1-078 吉老师的回归 (15 分)
  13. 计算机开机后黑屏鼠标显示桌面图标,电脑开机后黑屏只有一个鼠标箭头怎么办 电脑黑屏的解决方法...
  14. 是时候回答【我为什么要学习 Go 语言(golang)】这个问题了
  15. Go设置一个工作区打开多个项目
  16. 木材材积表快速计算器_木材材积表计算器
  17. Beacon of BLE
  18. fan类java_(Fan类)(Fan class)
  19. SMETA验厂咨询,SMETA参考实践指南BPG(本文件)的制作旨在提供一份一致的全球审核程序
  20. SardineChain联合发起人James:区块链改造机器人

热门文章

  1. zookeeper系列(九)zookeeper的会话详解
  2. 函数mod(a,m)
  3. search Paths $(SRCROOT)和$(PROJECT_DIR)区别
  4. [ActionScript 3.0] 对数组中的元素进行排序Array.sort()的方法
  5. 线上Tomcat支持Eclipse远程调试的方法
  6. QlikView Script -组合键处理
  7. python末位1的位置_用Python黑了整个学院学姐的电话和QQ,爬虫牛皮!兄弟们耗子尾之!...
  8. easy connect 获取服务端配置信息失败_安装配置mysql
  9. P16对member进行代码生成时,访问端口出现This application has no explicit mapping for /error, so you are seeing this
  10. 2021-11-18Collections