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,一经查实,立即删除!

相关文章

如何去除TD之间的空隙

table{border-collapse:collapse;}转载于:https://www.cnblogs.com/passer1991/archive/2013/02/27/2935967.html

android切换到上个页面,Android 返回上一个界面刷新数据

有些界面需要返回上一个界面刷刷新数据,再此做个记录.首先startActivityForResult进行Actvity进行跳转,这是跳转前的界面.// 通过 startActivityForResult() 启动 ActivityBIntent intent new Intent(getActivity(), NoticeActivity.class);startActivityForResult(intent, 1)…

composer设置代理_composer 设置代理

Docker registry V2部署私有Docker Registry 搭建 Insecure Registry 修改Registry server上的Docker daemon的配置,为DOCKER_OPTS增加–insecure ...css中的position&colon;relative和absolute 属性语法: position : static | absolute | fixed | relative 取值: static :…

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

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

HTML多选框滚动条,《HTM单选.doc

《HTM单选1. 下面标记中&#xff0c;( )在标记的位置添加一个回车符。【选择一项】A. B. C. D. 2. 要实现以下功能&#xff1a;在网页中插入一个图片joke11.gif,使用者通过单击该图片&#xff0c;连接到joke11.htm上去。下面的HTML代码&#xff0c;( )是正确的。【选择一项】A…

python时间处理模块有哪些_Python模块之时间处理

time 模块>>> import time>>> dir(time)[__doc__, __name__, __package__, accept2dyear, altzone, asctime, clock, ctime, daylight, gmtime, localtime, mktime, sleep, strftime,strptime, struct_time, time, timezone, tzname]包含的变量:timezone -- …

wel

欢迎来到mathant.com 这个网站是什么 这个网站是我搭建在阿里云vps上的个人网站。目前的用途是充当个人博客和云存储&#xff0c;当然它的功能不止如此。我会在以后的日子里完善他&#xff0c;希望他能变得更好。目前我在主机上只搭建了这个个人博客和一个ftp服务器。这个网站采…

php 安装rabbitmq扩展无报错版

需要安装rabbitmq-c&#xff0c;rabbitmq-c是一个用于C语言的&#xff0c;与AMQP server进行交互的client库。下载了v0.5.2版本(https://github.com/alanxz/rabbitmq-c/releases/download/v0.5.2/rabbitmq-c-0.5.2.tar.gztar xvf rabbitmq-c-0.5.2.tarcd rabbitmq-c-0.5.2autor…

ImageMagick 打水印支持透明度设置

convert 35021021120924162418300.jpg DD.png -geometry 60002048 -compose dissolve -define compose:args50 -composite -quality 95 35021021120924162418300_res.jpg转载于:https://www.cnblogs.com/mfryf/archive/2013/03/04/2943209.html

spring mvc使用html页面,使用Spring MVC的纯HTML页面应用程序

在Spring MVC所有的请求经过FrontController - DispatcherServlet的有你需要告诉Spring allowe JSP和HTML都在你的情况例dispatcher-servlet.xml:xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xmlns:p"http://www.springframework.org/schema/p"x…

python win+r时不成功_Win与R(不使用Anaconda的情况下)

配置R的路径信息&#xff1a;Path&#xff1a;添加R.dll的路径 如&#xff1a;E:\software\R\R-3.5.1\bin\x64R_HOME:R的安装路径 如&#xff1a;E:\software\R\R-3.5.1\binR_USER:R的使用路径 如&#xff1a;E:\software\R\R-3.5.1\bin\x64pip install rpy2在win下安装失败&am…

Devexpress VCL Build v2014 vol 14.1.4 发布

虽然这次没加什么新东西&#xff0c;但是及时更新支持xe7&#xff0c;还算可以。 Whats New in 14.1.4 (VCL Product Line) New Major Features in 14.1 Whats New in VCL Products 14.1 Feature Highlights To learn about feature highlights in this version, please refer …

一个YII社区学习网站

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

一站式 Java Web 框架 firefly-2.0_07发布

Firefly是一个高性能一站式Web框架。 涵盖了web开发的主要技术栈。 包含Template engine、IOC、MVC framework、HTTP Server、Common tools、Log、Json parser等模块。 firefly-2.0_07修复了模版压缩对javascript单行注释的影响&#xff0c;并新增了自定义错误页面功能。 更新日…

计算机控制学什么,计算机控制技术专业介绍

专业前景需要早了解&#xff0c;计算机控制技术专业学什么&#xff0c;好不好找工作等是学子和家长朋友们十分关心的问题。以下是个人简历网整理的计算机控制技术专业介绍、主要课程、培养目标、就业前景&#xff0c;供大家参考。1、计算机控制技术专业简介计算机控制技术专业&…

【Python】Python 批量转换PDF到Excel

PDF是面向展示和打印使用的&#xff0c;并未考虑编辑使用&#xff0c;所以缺少了很多编辑属性且非常难修改PDF里面的数据。当您需要分析或修改PDF文档数据时&#xff0c;可以将PDF保存为Excel工作簿&#xff0c;实现轻松编辑数据的需求。PDF转Excel&#xff0c;技术关键就是提取…

js showModalDialog参数的使用详解(转)

js showModalDialog参数的使用详解_javascript技巧_脚本之家 http://www.jb51.net/article/45281.htm 本篇文章主要是对js中showModalDialog参数的使用进行了详细的分析介绍&#xff0c;需要的朋友可以过来参考下&#xff0c;希望对大家有所帮助 基本介绍&#xff1a; showModa…

ad19生成gerber文件_在“AD19”中怎样将PCB文件转换为GERBER

四川自贡是历史悠久的老工业城市&#xff0c;上世纪八、九十年代&#xff0c;自贡的锅炉、泵业、阀门全国闻名&#xff0c;在近年发展中&#xff0c;电子产业也取得可喜的成绩。Altium Designer在设计电子产品中是应用较多的工具&#xff0c;它的版本更新很快&#xff0c;从最早…

让windows 2003启动后直接进入桌面

windows 2003启动后进入桌面需要解决的几个问题 1、如何去除掉 ctrlaltdel的提示界面 2、如何设置自动登录的用户名密码 3、在异常启动时会出现关闭事件跟踪程序 也会导致不能直接进入桌面 往往直接进入桌面是卡在了这个环节 一、去掉ctrlaltdel的提示界面 1、“开始-->运行…

【C】——C项目中的菜单功能(源码)

1 #include<stdio.h>2 #include<stdlib.h>3 4 int menu() //选择菜单5 {6 int result;7 printf("**********请选择&#xff1a;***********\n");8 printf("**********1.插入&#xff1a;***********\n");9 printf(&quo…