个人总结,如有错误,还请指正。

1.什么是Jitter?

Jitter是一个统计变量,它用来表征RTP数据包与包的传输时间之间的差异程度。具体的推算公式如下:
J(i) = J(i-1) + (|D(i-1,i)| - J(i-1))/16
i时刻的jitter是由i-1时刻的jitter推出的。其中D(i-1,i)表达式如下:
D(i,j) = (Rj - Ri) - (Sj - Si) = (Rj - Sj) - (Ri - Si)
Si表示i包里的RTP timestamp,Ri表示i包到达目的端时的timestamp。

1.1 Jitter的单位

jitter的单位是RTP中timestamp的单位。RTP timestamp单位和RTP data的采样频率有关,比如采用PCMU编码的audio包采样频率是8000Hz,那timestamp单位就是1/8000 s;采用OPUS编码的audio包采样频率是48000Hz,那timestamp单位就是1/48000 s。
whireshark抓包测试:
1>PCMU:

如图相隔1s的两个包,timestamp相减1441520544 - 1441512544结果等于8000,即PCMU采样频率;
2>OPUS:

相隔1s的两个包,timestamp相减879484868 - 879436868结果等于48000,即OPUS采样频率。

1.2 RTCP中的Jitter

RTP接收端根据上面的公式推算出jitter值后,会通过RTCP发送给对端。以Receiver Report为例,jitter在RTCP中的存放位置如下:

1.3 Jitter计算实例

让我们以一个jitter的计算实例来加深对jitter的理解。我们假设发送端每隔20ms发送一个RTP包,并且理想的传输时间是10ms。为了便于理解,我们使用ms为jitter的计算单位(timestamp单位和时间单位可以换算)。RTCP规定timestamp的起始值是一个随机值,同样为了便于理解,我们起始值设为0。具体计算如下表:

I Si Ri D(i, i-1) J(i)
1 0 10 0 0
2 20 30 0 0
3 40 49 -1 0.0625
4 60 74 5 0.3711
5 80 90 -4 0.5979
6 100 111 1 0.6230
7 120 139 8 1.0841
8 140 150 -9 1.5788
9 160 170 0 1.4802
10 180 191 1 1.4501
11 200 210 -1 1.4220
12 220 229 -1 1.3956
13 240 250 1 1.3709
14 260 271 1 1.3477

从表中可以看出,当包与包的传输时间之间的差异变大时,jitter值也开始增长。同时,jitter并没有随着差异的急速变大而剧烈变化,这是由于有去噪增益1/16。当差异逐渐缩小趋于稳定时,jitter的推算值也趋近于一个预估的均值。

2. Jitter Buffer

因网络状况总是千变万化的,那么包在网络上传输的时间也就不断变化。对于RTC audio的应用场景,为了得到良好的音频效果,我们需要以一个固定的时间间隔来播放音频包。因此,在接收端,无论网络延时怎么变化,我们都需要将变化的延时转化成固定的延时。而这,可以通过jitter buffer来实现。

jitter buffer的实现很简单:我们可以创建一个buffer来存储100ms时长的audio包。假设audio的采样频率是8000Hz,那么100ms就对应800个sample。我们可以设定如果buffer的sample数达到总的一半了,就可以去取出来播放了。

当然,这样做并不能确保播放质量。因为有可能网络实在是太差了,我们想要去取下一个audio包,但是buffer已经空了;也可能buffer已经满了,但是又接收到了audio包(只能丢弃)。为了减少这种风险,我们可以增加buffer的大小,但这样同时也增加了音频的滞后:因为如果buffer里满了50ms的audio包才取出来播放,那audio音频其实滞后了50ms。能不能再改进呢?能。我们可以使用根据jitter值自适应调整大小的buffer。这样既能适应网络状况变换,又能兼顾音频滞后的负面影响。

3. Jitter的起因

除了因为网络状况导致的传输时间变化,jitter还可能是由发送端自身导致的。当发送端的audio包不是从系统声卡采集的,而是从其他应用软件或某个音频文件采集的,那么也可能造成较大的jitter。

参考资料:
1.https://tools.ietf.org/html/rfc3550
2.http://toncar.cz/Tutorials/VoIP/VoIP_Basics_Jitter.html

RTP/RTCP中的Jitter相关推荐

  1. 在SIP对讲机中RTP/RTCP的实现

    RTP/RTCP的定义及用途,还是请大家自己google.对于wifi手机来说呢,RTP协议用来传送编码后的语音,RTCP协议用来传送控制信息,公司的RTCP附带了一些语音统计信息和jitter bu ...

  2. 开源实时音视频技术WebRTC中RTP/RTCP数据传输协议的应用

    1.前言 RTP/RTCP协议是流媒体通信的基石.RTP协议定义流媒体数据在互联网上传输的数据包格式,而RTCP协议则负责可靠传输.流量控制和拥塞控制等服务质量保证.在WebRTC项目中,RTP/RT ...

  3. 智能终端会议系统(20)---网络视频传输协议--RTP/RTCP/RTSP/SIP/SDP 之间关系

    网络视频传输协议--RTP/RTCP/RTSP/SIP/SDP 之间关系 RTP/RTCP/RTSP/SIP/SDP 关系 1. RTP Real-time Transport Protocol,是用 ...

  4. RTP/RTCP/RTSP/SIP/SDP 关系(直接看总结)

    RTP/RTCP/RTSP/SIP/SDP 关系   RTP(实时传输协议,传输层) Real-time Transport Protocol)是用于Internet上针对多媒体数据流的一种传输层协议 ...

  5. RTP/RTCP协议与RTSP协议

    基本概念 流式传输 包括顺序流式传输(Progressive Streaming)和实时流式传输(Real-time Streaming).直播场景中使用progressive streaming和r ...

  6. 流媒体协议介绍(rtp/rtcp/rtsp/rtmp/mms/hls)

    RTP     参考文档 RFC3550/RFC3551     Real-time Transport Protocol)是用于Internet上针对多媒体数据流的一种传输层协议.RTP协议详细说明 ...

  7. wireshark抓rtsp rtp rtcp包手把手教你分析包结构 H264 H265

    系列音视频开发 文章目录 系列音视频开发 前言 一.RTSP是什么? 二.RTP是什么? 三.RTCP是什么? 四.RTSP 源码学习 五.H265 RTSP流 总结 前言 在安防行业中,onvif协 ...

  8. 流媒体-RTP/RTCP

    一.简介 1)RTP(Realtime TransportProtocol):是针对Internet上多媒体数据流的一个传输协议,工作在一对一或一对多的传输情况下,其目的是提供时间信息和实现流同步.R ...

  9. 音视频传输-之RTP/RTCP协议

    前言 RTP/RTCP协议设计用来传输音视频数据,对应的RFC文档为:RFC3550,对应的中文版RFC3550中文版 RTP被定义为在一对一或者一对多的传输情况下工作,其目的是为了提供时间信息和实现 ...

最新文章

  1. 谷歌大脑AutoML最新进展:用进化算法发现神经网络架构
  2. 程序员面试题精选100题(62)-C/C++/C#面试题(5)
  3. parcelable 缺点_成都金牛区茶道炭优缺点-兴木华木炭
  4. hdu 5410(背包问题变形)
  5. 【Linux】一步一步学Linux——rmdir命令(22)
  6. 51Nod 1179 最大的最大公约数
  7. celery异步邮件发送系统出现django.core.exceptions.ImproperlyConfigured: Requested setting EMAIL_FROM
  8. find命令用法集锦
  9. 《linux系统及其编程》实验课记录(六)
  10. apache禁止访问文件或目录执行权限、禁止运行脚本PHP文件的设置方法
  11. xstream java_XStream将java转化成xml的简单使用
  12. 数据结构 以数组的形式存储数据(c语言 干货满满)
  13. 常用股票软件linux,在 Linux 下看股票?
  14. Monkey patcher for Lua
  15. 自动加减工单结存算法实现
  16. 2020中国邮政总行信息技术岗校招笔试经历
  17. 基于SpringBoot的影视/短视频网站系统
  18. 数据结构考研:电脑磁盘碎片的定义、产生原理和清理原因(文件碎片/机械硬盘/固态硬盘/硬盘清理/计算机/软件工程/王道论坛)
  19. linux 卸载x264,问一些linux下x264编码的问题
  20. 谈谈Jesse James Garrett提到的Ajax

热门文章

  1. 自然语言处理-LDA建模代码
  2. java 学习案例之英汉字典
  3. .net Core 介绍
  4. 字符串在Python中的本质是一个序列。 数字类型不是序列,不是可迭代对象,只能看做一个整体不可分割...
  5. 【机器学习】梯度下降中矩阵的迹的求导证明
  6. TortoiseSVN的bin目录下面没有svn.exe
  7. 11-6渐变的用途和设定技巧
  8. 监控管理平台 OpenNMS
  9. Wizard的动态添加
  10. java 蓝桥杯 算法训练 区间k大数查询(题解)