音视频学习--弱网对抗技术相关实践
背景介绍
实时音视频通话在当前的生活中是无时不刻存在的,包括社交、安防、交通等等各个方面都需要。用户场景复杂多变、要求严苛、网络环境不一致等给实时音视频通话带来很大条件。我们在这方向稍微做了一些工作,虽然和其他大厂的优化工作相比,我们还处于劣势,还有很多可以优化和改进的,但是目前的一些进展和工作内容和大家分享一下。
0.1 网络传输:
我们知道网络传输目前有TCP和UDP两种,相关优缺点如下脑图;而影响网络传输质量也有很多原因:包括网络拥塞、网络丢包等等。这些因素直接决定当前实时视频通话的质量,也会给用户带来很大的体验影响。这也是我们为什么要进行优化的基本原因了。

0.2 弱网定义:
对于实时音视频通话来说:网络的复杂性、异构性、协议部分不规范性、网络异常,网络错误等各种网络环境被破坏的特性都称之为弱网。弱网环境无法提供高质量的网络传输,对于接收端就是无法收到连续的媒体包,造成声音异常、视频马赛克、花屏、黑屏等现象,对于音视频实时通话来说是非常致命的,直接影响到用户的体验,造成产品质量问题或者客诉问题。

0.3 实时音视频特点

一 FEC

其基本原理是:在发送端,针对媒体包增加一定冗余FEC包,FEC包是通过异或XOR得到的。如果在网络传输过程中丢掉了一部分媒体包,则在接收端通过接收到的媒体包和FEC包进行异或XOR得到丢失的媒体包,这样就不用发送NACK重发包占用网络资源了。
由于这部分在WebRTC中已经实现的比较好,只需要进行兼容性测试即可,这部分没有作为重点优化对象,沿用WebRTC中内容即可。
二 NACK
2.1 NACK介绍:
NACK 代表否定确认。 它是 WebRTC 中的错误恢复机制之一。NACK 是接收端表明它没有收到特定数据包的一种方式。
NACK 消息通过 RTCP 发送给媒体的发送方,后者需要根据其在缓存中的可用性以及对重传有用性的估计(是否可以使用)来决定是否重传丢失的数据包 它曾经收到。发送端维护一个缓冲队列,如果重发包在缓冲队列中则从缓冲队列中取出再次发送;如果没有在缓冲队列中,则不再发送,这样解码端就无法收到重发包了。

2.2 优化和改进:
RTP模块解封包后,将数据包按照到达顺序依次传送到JitterBuffer模块中; 每个数据包在插入JitterBuffer模块时都需要进行序列号的比较和排序,如果序列号比较新的数据包,则进行NACK构建,以上次保存的序列号+1为起始值,以新收到的序列号为结束,将之间的序列号先缓存到missing_sequence_numbers中; WebRTC在JitterBuffer中采用线程查询的方式,每个一定时间进行一次遍历,确认当前nack List中是否存在当前时间节点没有按照顺序收到的数据包,如果存在就会组装并发送NACK RTCP包到发送端,请求发送对应的为接收到的数据包。

还有一个NACK无法回避的问题时:如果网络丢包率比较高,或者网络抖动,网络异构导致网络各种乱序到达情况比较严重,比如抖动超过200ms时,某些丢失的数据包迟迟不到达,则该包会重复发送多次,这样会导致网络拥塞的现象,特别是分辨率比较高时,极容易造成视频帧无法完整解码,出现马赛克或者黑屏现象。
因此我们再次基础上增加和修改了一些判断条件,进行缓存队列和清空队列判断条件优化,以及获取完整视频帧流程部分调整和优化,尽量减缓以上情况的影响,提升用户体验。
三 带宽自适应
3.1 带宽自适应:
3.2 框架图

3.3 发送端
发送端的带宽估计算法基本原理:是读取 RTCP 中的丢包率信息,进而通过算法来动态计算当前网络中基本情况,并判断是否增加或减少带宽资源。如果判断需要减少带宽时,则采用TFRC 算法来平滑处理,减弱突然增加或者减少的风险。

3.4 接收端
接收端的带宽估计算法基本原理:读取收到RTP数据统计进而估算当前网络带宽;WebRTC中采用卡尔曼滤波帧对当前帧的接收时间戳和发送时间戳完成基本统计和计算,从而估算当前网络带宽拥塞情况和利用率,评估和修正带宽大小,进而影响网络带宽。

四 优化和改进:
4.1 优化和改进
4.2 优化结果

整体方案进行了部分实验室场景的测试和验收:包括IP和SIP通话,720P和VGA分辨率验证,相比之前的版本,在一定程度上提高的用户体验。特别是有线网络条件下IP直播时提升明显,总体主观的分有了明显提升。同时对抗延迟也从无到有,能够覆盖300ms一下环境。该方案得到用到实际环境中,得到用户认可,并在和竞争对手PK过程中,全面领先。
五 问题和措施:
5.1 拥塞检测:
需要更加快速准确定位到当前网络状态,一旦出现拥塞可以快速调整当前发送策略。已经有视频专项开始预研。
5.2 最新WebRTC中弱网控制
WebRTC中NACK模块作为独立的module集成到VIE模块中,和Jitterbuffer模块解耦,实现实时监控网络丢包,并独立发送。
优点:可以实时获取到NACK列表; 和JitterBuffer解耦,获取更便捷、更迅速。已经有视频专项开始预研。
5.3 弱网前沿



这些是我们之后要去调研学习的地方,也期待有相关经验的童鞋可以一起探讨学习。