带宽估计(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. maven 运行web工程

    1.使用命令mvn package,将工程打包成war包 2.把war包放置到tomcat的webapps目录下,运行tomcat

  2. Design Linked List

    Design your implementation of the linked list. You can choose to use the singly linked list or the d ...

  3. Nginx安装SSL证书,开启HTTPS加密

    效果就是访问博客的时候出现一把小绿锁,更加安(好)全(看). 实现步骤如下: 申请SSL证书 阿里云可以申请一年的免费证书,下载到本地 上传证书到服务器 scp [文件名] root@[ip地址]:/ ...

  4. TP5实现自定义抛出异常消息(关闭debug)

    重写Handle的render方法,实现自定义异常消息----------------------------------------------------------------------- 首 ...

  5. Codeforces 1228E. Another Filling the Grid

    传送门 看到 $n=250$ 显然考虑 $n^3$ 的 $dp$ 设 $f[i][j]$ 表示填完前 $i$ 行,目前有 $j$ 列的最小值是 $1$ 的合法方案数 那么对于 $f[i][j]$ ,枚 ...

  6. 怎样理解 Vue 中的 v-if 和 v-show ?

    1. v-if 实现了真正的 条件渲染, 条件为真时, 节点被创建, 相应的监听函数也会生效, 条件为假时, 节点被销毁, 触发事件监听函数不会生效. 而 v-show 只是使用了 display:n ...

  7. asp.net 6.aspx页面

    1.aspx页面的头部 <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Us ...

  8. Winform_chart控件_心得

    效果图: 1.首先,在工具箱找到chart控件,拖到窗体中. 2.关于chart控件的细节设计: series集合设计: chartType可以选择折线图.柱状图.圆饼图等等. isValueShow ...

  9. 基于APR模式的Tomcat8环境部署

    1.版本信息 组件名 版本号 jdk 1.8.111 tomcat 8.5.9 apr 1.6.3 apr-iconv 1.2.2 apr-util 1.6.2 tomcat-native 1.2.1 ...

  10. git的详细安装

    git的详细安装 Git 是时候动手尝试下 Git 了,不过得先安装好它.有许多种安装方式,主要分为两种,一种是通过编译源代码来安装:另一种是使用为特定平台预编译好的安装包. 从源代码安装 若是条件允 ...