ULPFEC在WebRTC中的实现[转载]
一、WebRTC对抗网络丢包的两种手段
二、ULPFEC
三、ULPFEC基本概念
ULPFEC数据包中包含发送端需要告知接收端的一些重要信息,包括本FEC数据包所保护的媒体数据、保护级别和每个级别的保护长度。特别地,FEC数据包针对每个保护级别k设置一个偏移量掩码m(k),如果m(k)的第i位被设置为1,则序列号为N+i的媒体数据包在本FEC包的第k级别被保护。其中N为基准序列号,在本FEC包中设置。第k级别保护的媒体数据大小由L(k)指示,该值也在FEC包中设置。以上保护长度、偏移量掩码、负载类型和基准序列号能够完全确定生成FEC数据包中的奇偶校验码。
一般来说,FEC是带宽和保护力度的权衡,针对同样的媒体数据,更多的FEC数据包意味着更有力的抗丢包保护,但同时也会消耗更多的带宽。通常情况下,对于媒体数据包,不同部分的重要程度不一样。因此,我们可以针对数据包的不同部分实施不同程度保护(即非均等保护前向纠错),以充分利用带宽资源。更多带宽花费在更重要的数据部分,相反,较少带宽花费在不那么重要的数据部分。媒体数据包根据重要程度划分为若干部分,每个部分就是我们所说的保护级别,每个部分的长度即为保护长度,每个FEC包可携带多个保护级别的奇偶校验码。根据数据包不同部分重要程度进行保护的算法,就是所谓的ULPFEC非均等保护前向纠错。
作者:weizhenwei
链接:https://www.jianshu.com/p/06a27ebacec7
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
四、WebRTC中FEC和ARQ的优缺点
FEC
优点:单向传输,延迟小;
缺点:丢包率波动大时,抗丢包能力差,网络利用率不高;
ARQ
优点:网络利用率高;
缺点:延迟大,当延迟大或拥塞丢包时,会导致更严重的拥塞,不能使用ARQ;
ARQ全称Automatic Repeate reQuest,丢包重传,是一种通过重传关键数据包来纠错的信道保护算法,通常使用的是选择重传ARQ。
具体来说,发送端每一个数据包都植入顺序号码和时间戳,顺序号码代表被发送数据包的顺序,允许接收端可以通过监测顺序号码来发现丢包事件;时间戳代表语音视频数据包解码的时间点。发送端发送数据包后,如果接收端没有收到,接收端将会通过RTCP/TCP信道发送一个重传请求。发送端维护一个缓冲队列,当收到重传请求的时候将会重传数据包。接收端也会维护一个缓冲队列,等待尚未收到的数据包以及对已经收到的数据包进行排序。在解码deadline到来之前,接收端把缓冲区的数据包交给解码器进行解码。在解码deadline的时间点,接收端要么已经收齐了预期的数据包,要么已经决定放弃继续等待。
无论是码率自适应、FEC还是ARQ,都要依赖带宽估算算法来工作。码率自适应根据带宽估算的结果来自动调节码率;FEC和ARQ根据带宽估算的结果来分配冗余数据所占的带宽。
最新文章
- redis基础总结
- 题目:利用条件运算符的嵌套来完成此题:学习成绩>;=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。
- Visual Studio 2013 新功能 Memory Dump 分析器
- getAttribute()方法的使用小笔记
- Myeclipse搭建struts2环境
- sql异常
- java之URL类
- Ubuntu系统下为IDEA创建启动图标
- xampp进程和非进程执行
- 自动生成api文档
- github与git之间怎么建立连接
- 使用JavaScript实现一个俄罗斯方块
- centos命令安装
- 如何使用ABBYY FineReader 12将JPEG文件转换成Word文档
- 【小超_Android】2015最流行的android组件、工具、框架大全(兴许)
- sd卡不能格式化
- 在Asp.Net Core中使用Session
- linux内核 asmlinkage宏
- python 爬虫基础知识(继续补充)
- LightOJ1214 Large Division 基础数论+同余定理
热门文章
- Redis集群的原理和搭建(转载)
- 函数节流之debounce
- Oracle 的查询-scott用户介绍
- Springboot问题解决记录
- POSTGRESQL日期函数大全
- LINK : fatal error LNK1104: cannot open file的解决方法
- Make It One CodeForces - 1043F (数论,最短路,好题)
- Tomcat中的服务器组件和 服务组件
- HashSet——add remove contains方法底层代码分析(hashCode equals 方法的重写)
- jvm 中内存的栈和数据结构中的栈的区别