带宽估计(BWE)模块的任务是决定你可以发送多大的视频流且不会造成网络拥塞,以此来保证不会降低视频质量。

在以前的带宽估计算法还是十分基础的,大体上是基于丢包而设计的。通常我们在开始慢慢的增加视频的比特率,直到我们检测到丢包为止。为了检测丢包,你使用标准的RTCP反馈,其中接收端使用RTCP接收端报告(RR)信息来周期性的报告丢包。

现在的带宽估计算法变得更加先进,尝试在拥塞严重到了路由器开始丢弃数据包之前就检测出来。这些算法通过分析数据包之间的延时来预测拥塞情况。想法是当你开始遇到拥塞时,数据会开始流入路由器中的缓冲区,延时也会变得更多样。这些算法中比较出名的几种是Google Congestion Control(就是WebRTC中用的),SCReAM以及SPROUT。

从WebRTC的最初级阶段开始,媒体引擎就是基于远端带宽估计理论而搭建的。正像我之前说的那样,接收端会分析包间延时,并且会对可用带宽产生一个估计值,然后使用RTCP信息报回给发送端,其中RTCP信息使用了一种被设计来完成这项工作的信息类型:REMB。另一个关于WebRTC实现的细节是,发送端不会只使用这个在REMB包中接收的带宽估计值,也会使用反馈的丢包来决定最终发送的目标视频比特率。

这个实现的好处是它可以在检测到使用过度的时候迅速的降低比特率,即使此刻还没有探测到拥塞的时候。

但是在最近版本的Chrome中这点发生了改变,现在带宽估计的所有的逻辑都是发生在发送端。拥塞的基本检测跟以前没有什么大的差别,且发送端需要从接收端传来的延时信息来估计可用的带宽。这是用两个全新的机制/协议来完成的:

#1 传输宽序列号的报头扩展:所有视频RTP数据包都在报头处有额外的4位来包含一个序列号。这是通过下面语句与SDP协商得来:

注意:这种新的序列号的思想是可以对音频和视频只使用一个计数器,但是Chrome还没有将其在音频领域中使用,所以我认为它现在还并不是很有用。

#2 传输反馈:接收端会周期性地将包含有关已接收数据包和包间延时的信息反馈给发送端。为了完成这项工作,接收端使用了新的RTCP包(传输反馈)。这是通过下面这条包括了新RTCP反馈信息的语句在SDP中协商得来:

当你在观察这些传输反馈数据包是什么样子的时候,有意思的是你会意识到其中有Google建议的规范,以及官方标准化方案,但是真正使用的是在源码之中的实际实现。

这个RTCP反馈默认100ms发送一次,但是实际上是动态适应的,只会使用5%的可用带宽(最小值是50ms,最大值是250ms)。

为了将大小控制在最小,这种新的RTCP包的格式十分简洁,包括块内的分组包,以base+diff的形式存储数字,或者将粒度降低到0.25ms为间隔。我做了一个简单的测试,有了这些改进方案,其依旧会使用16Kbps来每50ms发送一次反馈数据包。

你可以在remote_estimator_proxy.h以及transport_feedback.cc中查看相关实现。

发送端带宽估计的好处是什么?Google给出的解释是,这样做的话,所有的决定逻辑都会在一个地方(发送端),而且这会让测试新算法变得更简单,因为你不需要同时取决于两个端点。说实话,由于浏览器的自动更新,我看不出来这点改变可以带来什么大的好处,但是其确实更加的整洁,即便会在带宽使用方面更贵一点。另一项好处是,发送端可以知道自己所发送的数据流是什么类型的,也可以在发送普通视频,而不是做例如屏幕广播这种事情的时候使用不同的算法。

我们会受到实际影响吗?如果你搭建了一个需要进行带宽估计的媒体服务器,在某种程度上你需要更新你的实现。好消息是Chrome还会支持旧机制(REMB)一段时间,至少会持续到Firefox支持它之后。但是REMB可能不会再有新的进展了,而且现在出现bug的可能性会更高,所以我认为推迟更新太久并不是一个好主意。

发送端带宽估计真的就更好吗?我做了一个快速的测试(这是测试页面,你可以尝试一种,或者通过改变布尔值来进行别的测试),其中在Chrome中同时用了两种算法(老的REMB和新的传输反馈),其中新算法的表现要好的多,至少在连接开始阶段的上升部分要好的多。我不认为对于这种结果,除了Google现在全新投入在新算法中,而不管老算法,且所有的赶紧都只会发生在新算法中,这个原因以外还存在着什么技术上的解释。很显然在新算法中,头两秒内肯定是有什么特殊的方法来处理带宽估计,但是我也没有太深入的研究。

WebRTC的带宽估计[转载]的更多相关文章

  1. WebRTC之带宽控制部分学习(1) ------基本demo的介绍

    转自:http://blog.csdn.net/u013160228/article/details/46392037 WebRTC的代码真是非常之大啊,下载以及编译了我好几天才搞完..... 可以看 ...

  2. Pathchirp—有效的带宽估计方法(二)

    上一个blog介绍了有效带宽估计方法:pathload.http://blog.csdn.net/ice110956/article/details/11126491. 做一个小小的总结:pathlo ...

  3. 一个linux 4.9,4.14内核的bbr带宽估计偏低问题

    linux 4.9内核,bbr的带宽估计问题. 一个正常的bbr流量图: 对应的ttl图形: 一个异常的bbr流量图: 可以看出,异常的bbr流量图,出现了一个很低的带宽,且稳定在这个带宽10s左右, ...

  4. TCP的带宽估计和丢包恢复

    一.带宽估计 TCP的带宽估计主要通过拥塞控制算法实现,用到两个变量: 1.cwnd     TCP对当前链路可用带宽的估计 2.ssthreash   拥塞控制算法“假想”出来的可用带宽值 二.丢包 ...

  5. ULPFEC在WebRTC中的实现[转载]

    一.WebRTC对抗网络丢包的两种手段     丢包重传(NACK)和前向纠错(FEC).FEC是一种前向纠错技术,发送端将负载数据加上一定的冗余纠错码一起发送,接收端根据接收到的纠错码对数据进行差错 ...

  6. TCP的那些事(转载)

    (转载本站文章请注明作者和出处 酷 壳 – CoolShell.cn ,请勿用于任何商业用途) TCP是一个巨复杂的协议,因为他要解决很多问题,而这些问题又带出了很多子问题和阴暗面.所以学习TCP本身 ...

  7. WebRTC内置debug工具,详细参数解读 chrome://webrtc-internals/

    为了确保这篇文章所写内容尽可能的准确,我决定请来Philipp Hancke来作为此篇文章的共同作者. 当你想要找到你WebRTC产品中的问题时,webrtc-internals是一个非常棒的工具,因 ...

  8. WebRTC中的NetEQ

    NetEQ使得WebRTC语音引擎能够快速且高解析度地适应不断变化的网络环境,确保了音质优美且缓冲延迟最小,其集成了自适应抖动控制以及丢包隐藏算法. WebRTC和NetEQ概述 WebRTC Web ...

  9. 【转帖】WebRTC回声抵消模块简要分析

    webrtc 的回声抵消(aec.aecm)算法主要包括以下几个重要模块:回声时延估计:NLMS(归一化最小均方自适应算法):NLP(非线性滤波):CNG(舒适噪声产生).一般经典aec算法还应包括双 ...

随机推荐

  1. 常用小技巧之PyCharm IDE

    Pycharm控制台窗口怎样可以显示不同程序的运行结果 默认情况下,每次运行会把之前的那个结果给清理掉. 有时候运行多个程序像对比结果,不太方便. 可以在pycharm的控制台那里点击右键,在弹出的菜 ...

  2. Spring自定义参数解析器

    结合redis编写User自定义参数解析器UserArgumentResolver import javax.servlet.http.Cookie; import javax.servlet.htt ...

  3. python库 使用shutil来删除文件夹时报PermissionError时的解决方案

    解决方案: def handle_remove_read_only(func, path, exc): excvalue = exc[1] if func in (os.rmdir, os.remov ...

  4. 人渣给我笔记本网络适配器里加的的“bluetooth设备(个人局域网)”,卸载不掉

  5. HTML+CSS常用代码(笔记)

    注释标签:对代码进行说明 <!-- 单行注释,也可以对多行文字进行注释 --> 常用格式标签 <b>加粗</b> <i>斜体</i> < ...

  6. PAT B1015A1062德才论(25)

    题目描述 宋代史学家司马光在<资治通鉴>中有一段著名的"德才论":"是故才德全尽谓之圣人,才德兼亡谓之愚人,德胜才谓之君子,才胜德谓之小人.凡取人之术,苟不得 ...

  7. 2019CSP-S游记

    \(2019CSP-S\)游记 \(Day : -26\) 初赛退役失败,准备复赛了... \(Day:0\) 早上\(7:30\)出发坐车去杭州,车上一直在听歌和睡觉中度过(话说锦零的歌真好听).. ...

  8. 黑科技——树剖两次dfs转一次dfs!

    黑科技--树剖两次\(dfs\)转一次\(dfs\)! 重所周知,树链剖分通常是要\(dfs​\)两次的,就像这样: int Fa[N],dep[N],Sz[N],son[N]; void dfs1( ...

  9. sort()方法的用法,参数以及排序原理

    sort() 方法用于对数组的元素进行排序,并返回数组.默认排序顺序是根据字符串Unicode码点.语法:arrayObject.sort(sortby):参数sortby可选.规定排序顺序.必须是函 ...

  10. Jmeter之正则表达式取样器~案例详解

    正则:按照规则提取数据 场景:A请求获得的响应数据,需要作为B请求的提交数据(eg:A:购物车页面→B:下单(正则提取购物车的商品信息,数量信息等)) 常用正则表达式:(.+?) 辅助:添加Debug ...