Android IOS WebRTC 音视频开发总结(八十七)-- WebRTC中丢包重传NACK实现分析

Android IOS WebRTC 音视频开发总结(八十七)-- WebRTC中丢包重传NACK实现分析

文主要介绍WebRTC中丢包重传NACK的实现,作者:weizhenwei ,文章最早发表在编风网,微信ID:befoio

 

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

 

在WebRTC中,前向纠错(FEC)和丢包重传(NACK)是抵抗网络错误的重要手段。FEC在发送端将数据包添加冗余纠错码,纠错码连同数据包一起发送到接收端;接收端根据纠错码对数据进行检查和纠正。RFC5109[1]定义FEC数据包的格式。NACK则在接收端检测到数据丢包后,发送NACK报文到发送端;发送端根据NACK报文中的序列号,在发送缓冲区找到对应的数据包,重新发送到接收端。NACK需要发送端发送缓冲区的支持,RFC5104[2]定义NACK数据包的格式。

 

本文在研究WebRTC源代码的基础上,以Video数据包的发送和接收为例,深入分析ANCK丢包重传机制的实现。主要内容包括:SDP协商NACK,接收端丢包判定,NACK报文构造、发送、接收和解析,RTP数据包重传。下面分别详细论述之。

 

一、SDP协商NACK

 

NACK作为RTP层反馈参数,和Video Codec联系在一起。WebRTC在初始化阶段,创建PeerConnectionFactory对象,在该对象中创建MediaEngine,其中的VideoEngine为WebRtcVideoEngine2。该对象在构造时,会收集本端支持的所有Video Codec,NACK作为Codec的属性被一起收集。在接下来的SDP协商过程中,NACK属性被协商到Offer/Answer中,如图1所示。

 

图1 SDP协商NACK及作用于Video JitterBuffer

 

PeerConnection在CreateOffer时,收集本端的会话控制信息、音视频Codec信息和网络信息等内容。视频Codec信息从WebRtcVideoEngine2中获取。最后本端Offer形成SDP报文,经过PeerConnection对象发送到网络。

 

接收端在收到Offer之后,首先调用SetRemoteDescription,根据本地配置信息向下创建VideoReceiveStream对象,本地NACK配置信息会最终到达VCMJitterBuffer。接着PeerConnection调用CreateAnswer,生成Answer;根据Offer中的Codec信息和本端支持的Codec信息,最终选定双方都支持的Codec集合。最后用生成的Answer作为参数调用SetLocalDescription,根据Answer中的Video Codec信息向下重新创建VideoReceiveStream对象。NACK信息向下传递最终到达VCMJitterBuffer,在这里设置NACK相关参数。这些参数在接收RTP数据包过程中发挥作用,比如判断丢包、是否发送NACK报文等。Answer发回发送端时,发送端调用SetRemoteDescription执行同样的设置流程。

 

二、接收端丢包判定

 

Video接收端丢包判定在Worker线程中进行。RTP数据包到达接收端后,经过RTP模块到达VCM模块的JitterBuffer对象,最终调用VCMJitterBuffer的InsertPacket函数对数据包进行缓存和重排。

VCMJitterBuffer把丢失RTP数据包的序列号存储在集合missing_seq_nums中。对于本次从RTP模块到来的数据包,标记其序列号为seq1,而上次到达数据包的序列号为seq2。如果seq1 > seq2,则表示seq1顺序到达,标记(seqnum2, seqnum1)区间内的数据包为丢失状态,将其存储到missing_seq_nums集合中。注意这里的丢失状态是暂时的,如果下个数据包到达时有seq1 < seq2,则表示数据包乱序到达,则把missing_seq_nums中小于seq1的序列号都删除掉。

 

在更新missing_seq_nums集合时,如果集合中存储的序列号超过预设的容量,则通过调用RecycleFramesUntilKeyFrame()不断丢包来减少集合中的序列号,直到集合中的序列号总数低于预设容量值。

 

三、NACK报文发送和接收

 

接收端的NACK报文构造和发送工作在ModuleProcessThread线程中周期性完成。过程如图2所示。

 

图2 NACK报文构造和发送

 

ModuleProcessThread线程周期性调用VideoReceiver::process函数,该函数通过VCMReceiver调用VCMJitterBuffer::GetNackList,从missing_seq_nums集合中得到过去一段时间内丢失RTP数据包的序列号。然后调用RtpStreamReceiver::ResendPackets函数。调用流程最终会到达RTCPSender::SendRTCP,发送类型为NACK的RTCP报文。

 

NACK报文是类型为205的RTCP 扩展反馈报文,如图3所示:

 

图3 NACK报文格式

 

其中PT = 205,FMT = 1,Packet identifier(PID)即为丢失RTP数据包的序列号,Bitmao of Lost Packets(BLP)指示从PID开始接下来16个RTP数据包的丢失情况。一个NACK报文可以携带多个RTP序列号,NACK接收端对这些序列号逐个处理。

NACK报文构造完成以后,发送到网络层。NACK报文是RTCP报文的一种,因此其发送、接收和分析遵循RTCP报文处理的一般流程。这部分内容可参考文档[3]。

 

四、RTP数据包重传

 

接收端在接收和解析NACK报文后,通过回调机制处理各种类型的RTCP报文,对于NACK报文,会调用RTPSender重新发送RTP数据包,如图4所示:

 

图4 发送端数据包重传

 

RTCPReceiver在解析RTCP之后,得到RTCP报文的描述结构,然后通过回调进行报文语义处理。NACK报文会被发送到RTPSender进行处理。RTPSender根据NACK报文中包含的序列号,到RTPPacketHistory缓存中查找对应的RTP数据包。如果找到,则把数据包发送到网络。

 

至此,一个完整的NACK报文回路完成,丢失的RTP数据包会重新发送到接收端。

 

五、总结

 

本文深入分析了WebRTC内部关于丢包重传(NACK)的实现细节,对NACK的SDP协商、丢包判定和重传进行深入研究,为继续学习掌握WebRTC的QoS机制奠定基础。

 

参考文献

 

[1] RFC5109 - RTP Payload Format for Generic Forward Error Correction.

[2] RFC5104 - RFC 5104 - Codec Control Messages in the RTP Audio-Visual  Profile with Feedback (AVPF) .

[3] WebRTC中RTP/RTCP协议实现分-http://www.jianshu.com/p/c84be6f3ddf3.

 

posted on 2016-12-09 11:02 RTC.Blacker 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/lingyunhu/p/rtc87.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/259980.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

为网格布局图片打造的超炫 CSS 加载动画

今天&#xff0c;我想与大家分享一些专门为网格布局的图像制作的很酷的 CSS 加载动画效果。您可以把这些效果用在你的作品集&#xff0c;博客或任何你想要的网页中。设置很简单。我们使用了下面这些工具库来实现这个效果&#xff1a; Normalize.css 来替代传统的 CSS 复位&…

一个YII社区学习网站

2019独角兽企业重金招聘Python工程师标准>>> https://getyii.com/ 转载于:https://my.oschina.net/u/2552765/blog/803311

MapReduce实现手机上网日志分析(分区)

一、问题背景 实际业务的需要&#xff0c;比如以移动为例&#xff0c;河南的用户去了北京上网&#xff0c;那么他的上网信息默认保存在了北京的基站&#xff0c;那么我们想要查询北京地区的上网日志信息默认也包含了其他地区用户的在本区的上网信息&#xff0c;否则只能扫描日志…

计算机专业四次评估,教育部第四次“计算机专业”学科评估,四所高校获A+评级...

随着2017年权威的第四次学科评估结果出炉后&#xff0c;相信很多高校学科上实力的争议应该可以平息了。这也是国内官方的学科排名&#xff0c;一共分为12等。入围学科的最高等级为A&#xff0c;最低评级为C-&#xff0c;如果在同一评级内&#xff0c;按学校代码先后依次排序。本…

正则领悟

入门 学习正则表达式的最好方法是从例子开始&#xff0c;理解例子之后再自己对例子进行修改&#xff0c;实验。下面给出了不少简单的例子&#xff0c;并对它们作了详细的说明。 假设你在一篇英文小说里查找hi&#xff0c;你可以使用正则表达式hi。 这几乎是最简单的正则表达式了…

html css精灵,谈谈CSS Sprites(css精灵)

CSS Sprites在国内很多人叫css精灵&#xff0c;其实这个技术不新鲜&#xff0c;这个技术老到什么程度呢&#xff0c;我不敢确定&#xff0c;但是我看到最早的关于CSS Sprites是在Dave Shea的《CSS Sprites: Image Slicing’s Kiss of Death》&#xff0c;时间是March 05, 2004 …

分布式搜索 Elasticsearch —— 节点实例化

为什么80%的码农都做不了架构师&#xff1f;>>> 要连接到集群&#xff0c;首先要告诉集群&#xff1a;你是谁&#xff0c;你有什么特征。在 ES 中体现为实例化节点。 ES 通过 org.elasticsearch.node.NodeBuilder 的 build() 或者 node() 方法实例化节点&#xff0…

(转)在ios android设备上使用 Protobuf (使用dll方式)

自&#xff1a;http://game.ceeger.com/forum/read.php?tid13479 如果你的工程可以以.Net 2.0 subset模式运行&#xff0c;请看这个帖子中的方法。 地址&#xff1a;http://game.ceeger.com/forum/read.php?tid14359&fid27 如果只能以.Net 2.0下运行&#xff0c;就可以继…

ps 毛发 边缘_Adobe Photoshop抠图技巧/抠图后头发边缘的颜色处理方法教程!

PS教学第1&#xff11;期抠图技巧和抠图后的头发边缘的颜色处理的解释本篇抠图技巧教程除了跟大家分享了抠头发的方法外&#xff0c;还分享如何解决抠头发后头发周围的异色&#xff0c;如白边紫边等问题。教程作者没有提供素材&#xff0c;大家可以找其他图片来练习。有些时候想…

Hyper-v 2016 VHD Set

Hyper-v 2016 VHD Set微软在Windows Server 2016 Hyper-v中新增了一种磁盘类型--“VHD集”&#xff0c;和以前版本的共享VHD类似&#xff0c;这种类型的磁盘能够在多个服务器之间共享来实现来宾群集。看到这里相信有很多熟悉Hyper-v的朋友会问&#xff1a;这和以前的 Share VHD…

面试总结之html+css

最近面试了一些公司&#xff0c;和技术总监聊了一些前端技术方面的内容。回来之后我总结了一下&#xff0c;大致可以分为三个模块&#xff1a;第一、Html与css 方面&#xff1b;第二、浏览器解析方面&#xff1b;第三、js方面。打算&#xff0c;分为三篇博文&#xff0c;根据自…

计算机的发展经历阶段应用领域,计算机的发展阶段

计算机的发展阶段以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;计算机经历了四个发展阶段。1、电子管数字机(1946—1958年)硬件方面&#xff0c;逻辑元件采用的是真空电子管&#xff0c;外…

全球都对HTTPS抛出了橄榄枝,为什么?你又该怎么办?

2019独角兽企业重金招聘Python工程师标准>>> 互联网发展20多年&#xff0c;大家都习惯了在浏览器地址里输入HTTP格式的网址。但前两年&#xff0c;HTTPS逐渐取代HTTP&#xff0c;成为传输协议界的“新宠”。 早在2014年&#xff0c;由网际网路安全研究组织Internet …

大一大学计算机考试难吗,新生必看!大一期间必考的3个证书,不考后悔,越拖越难考!...

原标题&#xff1a;新生必看!大一期间必考的3个证书&#xff0c;不考后悔&#xff0c;越拖越难考!9月开学季&#xff0c;大学新生也陆陆续续来到了学校报到&#xff0c;开启自己美好的大学生活!但是!小编要提醒大家的是千万不要相信高中老师说的那句&#xff1a;“上了大学你们…

我是如何实用:before :after

本文地址http://www.cnblogs.com/Bond/p/3972854.html 最近一直做移动端&#xff0c;没和IE6打交道了&#xff0c;瞬间感觉世界变美好了。移动端虽然还是各种坑&#xff0c;但是比起修复IE6那还是轻松多了&#xff0c;移动端很多效果可以用CSS3来做&#xff0c;感觉一切都和谐…

lua 从一串数字中取出偶数位的数字_为什么JavaScript中 0.1 0.2 不等于0.3?

在 js 中进行数学的运算时&#xff0c;会出现0.10.20.300000000000000004的结果&#xff0c;一开始认为是浮点数的二进制存储导致的精度问题&#xff0c;但这似乎不能很好的解释为什么在同样的存储方式下0.30.40.7可以得到正确的结果。本文主要通过浮点数的二进制存储及运算&am…

zookeeper启动后没有相关进程

查看状态报错&#xff0c;报错&#xff0c;百度硕士nc问题&#xff0c;让看.out文件&#xff0c;但是这哥文件是空的&#xff0c;那就看log 016-12-15 14:08:19,355 [myid:] - INFO [main:QuorumPeer$QuorumServer149] - Resolved hostname: StandByNameNode to address: Stan…

计算机发展与应用,网络计算机的发展与应用

网络计算机(Network Computer)&#xff0c;简称NC&#xff0c;是专用于高速网络环境下的一种计算机终端设备。它一般不需要硬盘、软驱及光驱等外部存储器&#xff0c;而是通过网络获取大部分资源&#xff0c;其所需要的应用程序和数据都存储在服务器上。NC与PC的比较随着网络技…

ASP.NET 缓存技术分析

缓存功能是大型网站设计一个很重要的部分。由数据库驱动的Web应用程序&#xff0c;如果需要改善其性能&#xff0c;最好的方法是使用缓存功能。可能的情况下尽量使用缓 存&#xff0c;从内存中返回数据的速度始终比去数据库查的速度快&#xff0c;因而可以大大提供应用程序的性…

分布式搜索 Elasticsearch —— 删除索引

为什么80%的码农都做不了架构师&#xff1f;>>> 删除索引的方式很多&#xff0c;这里列举三种。 指定 index 、type、id 执行删除 package com.gsoft.gsearch.util;import org.elasticsearch.action.get.GetResponse; import org.junit.Test;import com.gsoft.gsea…