本文主要介绍WebRTC视频通信中的错误恢复机制(我们翻译和整理的,译者:jiangpeng),最早发表在【这里

支持原创,转载必须注明出处,欢迎关注我的微信公众号blacker(微信ID:blackerteam)。

道路交通与网络交通有很相似之处。就像道路上的车辆一样,网络分包也可能转错了弯,或者因为堵塞导致延迟。但是,网络分包经常会发生丢失,而道路上的车辆很少会出现这张状况。在这篇文章中,我们将讨论媒体流是如何被压缩、通过网络进行传输以及各种错误恢复机制。

1、视频传输、编码与解码

在开始讨论视频压缩和错误恢复机制前,我们先快速回顾一下视频和音频是如何从发送者的摄像头和麦克风传送到接收者的屏幕和音频输出的。

原始码流在发送端捕获,使用选择好的编码方式对帧进行编码后,以包的形式通过网络发送。数据包在接收端被拼装成帧。然后解码器将这些帧解码为原始码流,并进行播放。

如果部分数据包在传输过程中丢失,接收端的解码器会请求发送端重传,同时等待这些包的到来。这对于低延迟的网络很有效,接收端的去抖动缓冲小,足以保持交互性。当延迟较大时,重传的包可能需要比较久的时间才能到达,这时就需要依赖更加复杂的错误恢复机制,如:向前纠错,全内请求等等。

2、视频压缩方法

为了视频尽可能的保持高效,视频数据通过不同的编码进行压缩。以帧为单位进行压缩,按照压缩中的不同作用可分类为:内帧(Intra-frames,I帧),预测帧(Predictive-frames,P帧),和双向预测帧(Bipredictive-frames,B帧)。B帧利用过去的和将来的包进行编码,在实时交互的视频中不会使用。

一个I帧包含一个完整的图片(经过空间压缩),像传统的静态图片文件。因此,I帧是独立的帧,解码时不依赖其他的帧。

P帧则是依赖性的帧,仅包含与之前一帧相比在图像上有所变化的部分(即,时序压缩)。所以,与I帧相比,P帧的压缩率更高,至于高多少,得取决于帧之间的变化量。因此,这减少了视频流传输的比特数。举个例子,下面的剪辑来自于一场下坡赛车比赛。视频中的绝大部分保持不变,除了移动部分,即汽车和观众,需要被编码为P帧的视频不变。

I帧以作为P帧的新参考点而被生成。通常在图像变化很大的时候创建一个I帧,如:平移、场景切换、大量动作、突然消失等场景发生时。

3、错误恢复机制

IETF已经定义了可用于帮助解决丢失媒体数据的错误恢复机制。接下来,我们依次过一遍在rtcweb-RTP-usage中定义的各种机制:否定确认(NACK)、全内要求(FIR)、照片丢失提示(PLI)、切片丢失提示(SLI)。

接收端在丢失单个包或者突发性丢包时向发起端发出信号。发起端收到这些信号时,做出适当的反应。对这类请求的一个典型响应是:

1.发起端重新发送一个RTP包:

·在丢失单个包的情况下,发送端重新发送所请求的包。

·在发生突发性丢包,或者有新的参与方加入时,接收端此时不能继续解码,这时发送方会选择发送一个I帧。发送一个I帧会产生大量的包,因此通常作为最后一招使用。

2.通过发送其中包含了源RTP分组集合的前向修复(FEC)包进行修复。

下图显示了部分运用于实时交互视频流的错误恢复方案:

其适用于各种丢包数量和链路延迟的错误恢复机制。

否定确认(NACK)

NACK在一多媒体数据流的分组丢失(这是一个通用的机制可以适用于音频和视频流)时由接收端产生。发送者以重发所请求的(如果仍然在其发送缓存中的)包的方式响应NACK ,并基于观察到的往返时间确认该数据包能在解码时及时到达接收端。

全内请求(FIR)

视频在WebRTC的会话中总是以一个I帧开始,然后发送P帧。但是,当有新的参与者中途加入会议会话时,很有可能接收到一系列P帧,但因缺少相应的I帧,它并不能解码。这种情况下,该接收端会发送一个FIR以请求一个I帧。

因此,在大的会议平台中,例如与会方达到100人时,在很短的时间间隔内加入或重新加入会议,每个参与者都会请求I帧以开始解码,取决于重新加入的频率,可能会导致发送方创建大量的I帧。

图片丢失提示(PLI)

图片丢失提示消息表明突发性的丢包影响到了一个或多个帧中的多个包。发送方可以通过重传这些包或者生成一个新的I帧以作出回应。但一般来说,PLI同时表现得像一个NACK和一个FIR,因此,通过使用PLI,接收端为发送端如何对该请求作出响应提供了更大的灵活度。

切片丢失提示(SLI)

切片丢失提示消息表明该包丢失影响到单个帧的部分(即,多个macroblock)。因此,当发送端接收到SLI消息时,它可以通过重新编码的方式纠正切片,停止部分帧解码错误的传播。

4、仪表盘上的新图

为了帮助我们的客户看到他们的应用程序如何发送和接收实时视频,我们增加了图表显示如下:

1.发送端从所有media track接收NACK的频率;

2.发送端从视频track接收到FIR/PLI/SLI请求的频率。

部分指标目前只在所报告的断点在Chrome浏览器中的情况下适用。

原文:http://www.callstats.io/2015/10/30/error-resilience-mechanisms-webrtc-video/

译者:jiangpeng,具体详见:http://befo.io/1340.html

Android IOS WebRTC 音视频开发总结(七五)-- WebRTC视频通信中的错误恢复机制的更多相关文章

  1. Android IOS WebRTC 音视频开发总结(五七)-- 网络传输上的一种QoS方案

    本文主要介绍一种QoS的解决方案,文章来自博客园RTC.Blacker,欢迎关注微信公众号blacker,更多详见www.rtc.help QoS出现的背景: 而当网络发生拥塞的时候,所有的数据流都有 ...

  2. Android WebRTC 音视频开发总结(五)-- webrtc开发原型

    这些天基于WebRTC做了个 手机视频监控 的程序,分享出来,供想了解这方面内容的朋友参考. 这个程序最早是广州一家智能穿戴设备公司请我们做的(他们不需要底层源码,也不需要ios版本),之后我们在这个 ...

  3. Android/iOS内嵌Unity开发示例

    Unity 与 Android/iOS 交叉开发主要有两种方式,以 Android 为例,一是 Android 生成 jar 或者 aar 包,导入到 unity3d plugin/bin/ 目录下: ...

  4. moviepy音视频开发:使用credits1给视频加片头片尾字幕

    ☞ ░ 前往老猿Python博文目录 ░ 一.概述 在<moviepy音视频剪辑:视频基类VideoClip子类DataVideoClip.UpdatedVideoClip.ImageClip. ...

  5. Android IOS WebRTC 音视频开发总结(五九)-- webrtc这蛋糕都怎么吃?

    本文主要介绍webrtc应用状况,文章最早发表在我们的微信公众号上,详见这里,欢迎关注微信公众号blackerteam,更多详见www.blackerteam.com WebRTC是个好东东,就好比是 ...

  6. Android IOS WebRTC 音视频开发总结(五三)-- 国内IM & RTC SDK列表

    本文主要总结国内提供RTC SDK的产品,转载必须说明出处,文章来自博客园RTC.Blacker,欢迎关注微信公众号blacker,更多详见www.rtc.help 自从开通邮件和微信公众号以来,很多 ...

  7. Android IOS WebRTC 音视频开发总结(五六)-- 如何测试网络性能?

    本文主要介绍如何测试网络性能,文章来自博客园RTC.Blacker,欢迎关注微信公众号blacker,更多详见www.rtc.help 网络性能直接决定了视频通话效果,比如qq,很多时候我们我们觉得通 ...

  8. Android IOS WebRTC 音视频开发总结(五八)-- 图文解说视频直播原理

    本文主要介绍rtmp&hls视频直播原理,文章最早发表在我们的微信公众号上,详见这里,欢迎关注微信公众号blackerteam,更多详见www.blackerteam.com 现在视频直播很火 ...

  9. Android IOS WebRTC 音视频开发总结(五二)-- 亲,咱一起采访webrtc大会的各路专家

    本文最早发自我的微信公众号,咱一起采访webrtc大会的各路专家,文章来自博客园RTC.Blacker,支持原创,转载必须说明出处. 亲,作为webrtc大会的推动者之一,大会期间不管是公共场合还是私 ...

随机推荐

  1. mysql表分区(摘自 MySQL表的四种分区类型)

    一.什么是表分区通俗地讲表分区是将一大表,根据条件分割成若干个小表.mysql5.1开始支持数据表分区了. 如:某用户表的记录超过了600万条,那么就可以根据入库日期将表分区,也可以根据所在地将表分区 ...

  2. MVC 3.0 Tree

    页面分左右两部分,左边是一个导航树,右边是局部页,点击树节点,异步刷新右边的内容.加颜色部分是知识点. @using VideoWeb.Models@model VideoWeb.Models.Cat ...

  3. Git工作流指南:Pull Request工作流

    参考地址:http://blog.jobbole.com/76854/ Pull Requests是Bitbucket上方便开发者之间协作的功能.提供了一个用户友好的Web界面,在集成提交的变更到正式 ...

  4. 浅谈SEO-提交(一)

    前段时间,花了点时间研究了下SEO,Search Engine Optimization,百度百科这样描述: 中文意译为“搜索引擎优化”.SEO是指通过对网站内部调整优化及站外优化,使网站满足搜索引擎 ...

  5. Python12期培训班-day1-三级菜单代码分享

    #!/usr/bin/env python3 import sys import os zonecode = { '广东省': {'广州市':['越秀区','海珠区','荔湾区','天河区'], '深 ...

  6. 纯js轮播效果(减速效果)待改进

    HTML代码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www. ...

  7. Linux简介

    一.Linux发展史 Linux出现之前,还有一个叫Minix的家伙(Andrew S. Tanenbaum教授为了教学买了Unix系统,参考其代码,但没有任何的代码抄袭,自己写了Minix系统,并开 ...

  8. AndroidStudio 中的坑Error:(1, 0) Plugin is too old, please update to a more recent version, or set ANDROID_DAILY_OVERRID

    将 build.gradle 中 的 classpath改为2.0.+ dependencies { classpath 'com.android.tools.build:gradle:2.0.+'然 ...

  9. java common-io jar API

    import org.apache.commons.beanutils.BeanUtils;public class Person { private String name; public Stri ...

  10. SQL Server中常用的SQL语句(转):

    SQL Server中常用的SQL语句 转自:http://www.cnblogs.com/rainman/archive/2013/05/04/3060428.html 1.概述 名词 笛卡尔积.主 ...