带宽估计(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. JAVA各种框架插件常用端口:redis、MySQL、rabbitmq、elasticsearch、tomcat等等

    默认端口号 应用 21 FTP(文件传输) 22 SSH(安全登录).SCP(文件传输).端口重定向 23 Telnet(远程登录) 80 HTTP服务器 1433 SQL Server数据库serv ...

  2. 【VS开发】【DSP开发】WinDriver简介(或介绍)

    WinDriver for Windows简化并自动化了用户模式Windows设备驱动程序的开发,支持设备包括PCI / CardBus / ISA/ PCI-104 / PCMCIA * / PMC ...

  3. 【VS开发】VS2010中导入ActiveX控件

    方法1: 1.首先在在项目上面右击添加类,如下图所示: 2.点击添加ActiveX控件中的MFC类 3.找到需要添加的ActiveX类. 4.点击完成即可. 5.此时转到资源视图,打开如下视图.可能工 ...

  4. linux用户和组 之 用户管理

    一. linux 用户和组的基本介绍 1.linux下 有三种用户: 1. root: 权限最大的. 2. 系统用户: UID小于1000的.系统服务管理用户,一般是不允许登录系统的.(比如mysql ...

  5. Netty源码之解码中两种数据积累器(Cumulator)的区别

    上一篇随笔中已经介绍了解码核心工作流程,里面有个数据积累器的存在(Cumulator),其实解码中有两种Cumulator,那他们的区别是什么呢? 还是先打开ByteToMessageDecoder的 ...

  6. PAT A1020 Tree Traversals(25)

    题目描述 Suppose that all the keys in a binary tree are distinct positive integers. Given the postorder ...

  7. 【操作记录】搭建虚拟机下 java 开发环境

    第一步,配置虚拟机 virtualBox 官网下载最新版,安装,选择简体中文. CentOS 官网下载 最小版iso. 新建虚拟机并配置,挂载iso光盘,然后启动. 因为是最小版,安装时可能不支持使用 ...

  8. ci框架读取上传的excel文件数据

    原文链接: https://blog.csdn.net/qq_38148394/article/details/87921373 此功能实现使用到PHPExcel类库,PHPExcel是一个PHP类库 ...

  9. vimdiff、rev命令

    一.vimdiff:可视化比较工具 语法:       vimdiff [选项] file1 file2 [file3 [file4]] gvimdiff 描述       Vimdiff在两个(或三 ...

  10. Bootstrap3基础教程 03 导航栏

    Bootstrap导航栏 创建一个默认的导航栏的步骤如下: 1.向 <nav> 标签添加 class .navbar..navbar-default. 2.向上面的元素添加 role=&q ...