带宽估计(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. 安装与编译Dlib(以Ubuntu16.04+Python3.6+pip为例)

    安装与编译Dlib(以Ubuntu16.04+Python3.6+pip为例) Step1:下载Ubuntu (or Linux)系统支持库=>Install OS libraries -dev ...

  2. 《ThinkPHP 5.0快速入门》 数据库、查询语言

    1.数据库配置 return [ 'type' => 'mysql',// 数据库类型 'hostname' => '127.0.0.1',// 服务器地址 'database' => ...

  3. JS 自定义字典对象

    <script type="text/javascript" language="javascript"> //自定义字典对象 function D ...

  4. Stream系列(十)Count方法使用

    计数器 视频讲解: https://www.bilibili.com/video/av77905733/ EmployeeTestCase.java package com.example.demo; ...

  5. PYTHON 100days学习笔记007-1:python数据类型补充(1)

    目录 day007:python数据类型补充(1) 1.数字Number 1.1 Python 数字类型转换 1.2 Python 数字运算 1.3 数学函数 1.4 随机数函数 1.5 三角函数 1 ...

  6. idea的spring整合基于xml文件配置的mybatis报Invalid bound statement (not found): com.music.dao.MusicDao.findAll的问题

    一. 题主当时就是自己尝试整合spring和mybatis的时候遇到了这个问题,当时题主只看到了用注解的方式配置的dao层,题主用的是xml文件配置的形式, 而且坑爹的是题主的两个文件的路径写的也不一 ...

  7. Design Linked List

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

  8. 设置gridView 行号 行号宽

    gridView1.IndicatorWidth=30; //设置行号宽度 //对gridView1的CustomDrawRowIndicator事件进行操作 进行行号显示 private stati ...

  9. MySQL优化心得

    一打开科技类论坛,最常看到的文章主题就是MySQL性能优化了,为什么要优化呢? 因为: 数据库出现瓶颈,系统的吞吐量出现访问速度慢 随着应用程序的运行,数据库的中的数据会越来越多,处理时间变长 数据读 ...

  10. Java时间处理

    java.sql.PreparedStatement接口的setDate(int parameterIndex, java.sql.Date x)方法中的Date为java.sql包下的Date,而不 ...