2012 年 7 月,微信 4.2 版本首次加入了视频通话功能,现在已发展了 5 年,在面对亿级微信用户复杂多变的网络和设备环境,微信多媒体团队在每一个技术细节上不断地深耕细做,为微信用户提供了高质量的视频通话。算法
今年腾讯全球合做伙伴大会上发布的《2017 微信数据报告》显示,到 2017 年 9 月,微信日成功通话次数 2.05 亿次,月人均通话时长 139 分钟,月人均通话次数 19 次。不管是通话次数仍是通话时长都比去年增长了一倍多,这个增加速度远远高于微信用户量的增加,这与微信多媒体团队在音视频技术上的努力是分不开的。性能优化
本文将为你们介绍微信视频通话在不一样发展阶段的各个关键视频技术环节采用的方案,同时分享在视频通话中的视频编码器研发的方法和经验。全文来自微信视频技术负责人谷沉沉在 2017 北京 ArchSummit 全球架构师峰会上的演讲内容。服务器
互联网视频通话的特色互联网视频应用的目标微信
与不少互联网视频应用相似,互联网视频通话的应用目标也是但愿用尽量低的成本使视频更加清晰与流畅。上图右边互联网视频应用的代价成本包含两个维度:一是带宽成本,包括客户端用户的流量成本,以及服务器端带宽成本;二是计算资源开销,表如今服务器端的设备投入量,以及客户端的 CPU 占用、耗电量等,而对于性能较差的客户端设备,控制客户端的计算资源还能够保障这些设备也能支持基础质量的视频通话。网络
视频通话的技术挑战架构
上图中谷沉沉列举了四类互联网视频应用,其中视频通话应用相对于短视频分享、流媒体直播和媒体存储来讲有三个特殊的挑战:并发
第一,因为微信视频通话集中在移动端,这就要求系统的计算复杂度尽量低;app
第二,因为视频通话是高度实时的应用,决定了视频数据通常采用不可靠传输,这就要求视频传输具备必定的鲁棒性,好比抗丢包的特性,另外,因为没有缓冲机制,视频发送码率要尽量平稳;框架
第三,因为不少用户在 3G、4G 等移动网络下使用,对流量比较敏感,因此视频通话带宽占用要尽量低。ide
最左边三点是微信视频通话做为海量级用户产品具备的特殊难点:用户的网络情况和设备性能差别巨大,因此微信视频通话要适应不一样的网络和设备;因为用户版本更新存在必定的周期,这就须要考虑新技术对旧版本的兼容性;另外,海量并发用户对服务器端形成的带宽成本压力也是必需要考虑的。
因此,互联网视频通话是各类互联网视频应用中约束条件最多、最苛刻,也是实现难度较大的一种互联网视频应用。
微信视频通话基本技术框架
据谷沉沉透露,如今微信视频通话是基于微信多媒体团队自研的多媒体应用综合引擎——WAVE (Wechat Audio&Video Engine)。该引擎的底层——内核层是由传输、视频、音频三大类跨平台技术构成的。在此之上,针对不一样应用类型的特色作了一些接口封装和应用逻辑设计,造成应用层,目前支持三类不一样的应用:第一类是实时通话应用,目前用于微信的点对点和多人视频通话。第二类是多格式的图片处理,主要用在微信朋友圈、公众平台以及表情等图片的压缩和处理上。第三类是音视频文件压缩,应用于朋友圈视频、语音和视频消息的压缩和处理等。
通过多年的技术积累,WAVE 引擎支持了天天数亿的视频通话、数十亿的视频播放、数千亿的图片查看,因此整个引擎在压缩效率、计算速度、音视频质量等方面的性能都通过了微信亿万用户的考验,是业界比较领先的多媒体引擎。
谷沉沉表示他们团队如今还在不断提升引擎的处理速度、压缩效率等性能,但愿能用最合理的成本为广大用户提供最好的多媒体体验。
下图是基于 WAVE 引擎的微信视频通话系统,包含视频、音频、传输三大类技术,分布在设备层、引擎层、服务器端三个层面。标红的部分是视频引擎涉及的技术。
下图是 WAVE 微信视频引擎的框图,在发送端,摄像头采集的原始视频数据,一路直接在本地小窗口渲染,另外一路先通过视频前处理,再进行视频编码,以后对编码生成的码流进行容错保护,最后发送到网络上。相应地,在接收端,对收到的码流先进行错误恢复,对正确恢复的数据进行视频解码,然后经过后处理加强提高视频质量,最后通过播放控制流畅地显示在接收端屏幕主窗口上。
其中 QoS 的反馈模块会收集接收视频的质量、网络情况等信息,经过服务器处理反馈到发送端,发送端再根据这些信息选择合适的视频编码的参数,这样就能实时适应不一样的网络情况。目前,不少网络适配算法都是在 QoS 服务器上执行的,这样,若是新算法发布后发现问题,不用等到下一个客户端版本的发布,就能够快速地在服务器端进行修改控制,加快算法的迭代进度。
视频引擎的关键技术
上图列出了视频引擎中最关键的六大模块的技术,其中最核心的是决定整个引擎基础性能的视频编解码模块,与之密切相关的有先后处理、容错保护、网络适配模块,还有设备层的采集与显示,以及对海量用户通话状况的评价和运营体系,这六个模块技术协同配合,任何一个模块的短板都会影响总体视频通话质量。
在微信视频通话版本发展的不一样时期,这些技术模块的发展也是各有侧重,总体上大体经历了三个阶段:
第一阶段是基础框架的搭建和性能优化,2010-2012 年,第一个微信视频通话发布先后的这段时间,当时大部分主流移动设备 CPU 主频只有单核 1GHz,为了在这样的设备上能流畅运行视频通话,微信多媒体团队在视频编解码速度优化上下了很大的功夫,当时优化后的编解码速度在同等压缩效率下已经达到了业界领先水平;在采集显示环节也采用了快速、高质量的方案,并作了大量代码流程优化以提升处理速度,如减小内存的拷贝,优化格式转换流程等;因为当时客户端计算能力是整个视频通话的瓶颈,视频帧率、码率较低,发送数据量对于大部分网络不会形成太大压力,因此第一阶段的容错保护策略很是简单,只对关键帧作保护。通过这些基础性能的优化,第一个微信视频通话版本跟业界同类产品相比,同等带宽下的视频清晰度和流畅度都是很是不错的。
第二阶段是随着移动设备硬件性能的逐渐提高,一些性能较好的移动设备能够支持更高帧率的视频通话,发送码率也随之增大,因而网络适配策略就成为这一阶段的研发重点,因为实验模拟网络环境与海量用户真实的网络环境老是存在差别,因此不少网络适配算法在通过模拟环境下的验证后,还必须进行线上灰度测试,一般会随机抽取大量样本作算法的对照实验,若是在大规模样本上新算法的各项技术指标均优于现网算法,才会逐步放开到全部的通话。在这个灰度测试过程当中,海量用户通话质量的评价运营体系也逐步创建和完善。
第三阶段是在近两年,移动设备性能大幅度地提高,不少 4 核 8 核手机的性能甚至比早些年的 PC 机都要好,设备的计算性能已经能够支撑更高复杂度的计算,所以微信多媒体团队开始研发视频先后处理技术以提升主观质量,同时在视频编解码上也加入了一些高复杂度、高压缩效率的算法,使视频通话在同等带宽下能够达到更高的视频质量。
因为演讲时间所限,谷沉沉对选择其中视频编解码、先后处理和容错保护三个模块进行了重点技术分析:
视频编解码 视频编解码的性能指标
在互联网视频应用中,视频编解码的核心指标归纳起来通常有三个:编码效率、编解码速度和传输适应性,而这些指标之间是相互制约的,编码效率的提高每每是以牺牲编码速度为代价,传输适应性也会影响编码效率,好比容错保护时增长冗余会致使编码效率降低。因此一个好的视频编解码器须要在这些指标之间找到合理的平衡点。
这三个指标在视频通话中具体须要关注哪些方面呢?
首先,在编码效率上:
1)微信视频通话的场景很是多样,除了相似传统视频会议那样总体内容比较静止的场景外,还有不少运动剧烈的场景。可能不少人认为微信视频聊天一般都是手持手机摄像头对着人脸,应该都属于比较静止的视频场景,但在摄像头距离人脸较近时,人脸在视频画面中占据了较大部分,这样人脸的一点轻微运动对于整个视频来讲已是属于运动比较剧烈的内容场景,同时手持设备不稳定时还会形成视频画面的抖动,使运动更加复杂,所以微信视频通话中的编码算法必须适应多种不一样的场景。
2)历史版本互通兼容性,新的编码技术必需要考虑旧版本的解码兼容性,因此一旦编解码格式肯定就不能频繁更新,只有当技术积累到必定程度,压缩效率有突破性的提高,才会考虑升级替换。
3)主观质量是“王道”,对互联网应用来讲,普通用户不会关注 PSNR 等客观质量指标,只会用眼睛来看,因此任何的客观数据都只是技术上一种便捷的衡量方式,最终的衡量标准仍是人眼的主观感觉。
其次,在编解码速度方面,编解码算法复杂度和实现优化程度都是影响编码速度的重要因素。实现优化包括软件的快速算法和代码级优化,也包括硬件加速。随着一代又一代的视频编码标准的发展,编码效率的提高每每伴随着算法复杂度的增长,CPU 难以支撑高复杂度的软件编解码计算,若是硬件视频编解码各方面性能能够知足视频通话的需求,利用硬件来加速视频编解码就能够极大地缓解 CPU 计算资源压力。此外,还要考虑帧级复杂度的均匀性,由于视频通话能支持的最高帧率是由序列中编码最慢的帧的时间消耗决定的。
第三,在传输适应性上,要求视频码流的码率尽量平稳,更严格地,还要控制帧级瞬时数据量冲击,以减小瞬时数据量冲击形成网络拥塞而出现丢包、延时等问题。此外,视频码流还须要具备必定的抗丢包能力。
如何打造一个优秀可靠的视频 Codec?
谷沉沉根据多年的工做经验,总结了打造一个优秀可靠的互联网视频应用软件 Codec 的四个阶段,针对其中第3、第四阶段的优化,谷沉沉还举了两个微信多媒体团队实战优化过程当中的案例进行了具体说明:
第一阶段是格式的确立,主要是根据应用的计算复杂度要求选择合适的编码标准格式,或者开发私有格式,这一阶段主要考虑编码效率,评价方式相似标准组织的通用测试条件。
第二阶段是实现优化,主要是经过代码优化和快速算法优化等提升编解码速度,同时控制编码效率损失,在知足应用要求的条件下,达到编码效率和编解码速度的合理平衡。
第三阶段是应用定制,针对特定的应用场景需求作一些定制的研发,达到合入产品预发布的要求。好比微信视频通话中的码率平稳性要求,以及编码参数切换支持等,都是在这个阶段经过码率控制算法优化来实现的。
案例分享:码率控制优化
码率控制的难点是平衡码率平稳性和压缩效率、质量平稳性。虽然学术上有不少码率控制的研究,但实际工程应用中仍是有不少问题须要考虑,如码率控制的时间单位,极低帧率、极小 I 帧间隔下的码率控制,单帧瞬时冲击等。
上图的第一张设置目标码率 360kbps 的每秒数据量波动图中,紫色线是微信自研视频编解码器的码率波动状况,能够看出每秒的码率基本都稳定在 360kb 左右,而蓝色线表示的同等编码效率下 x264 码率波动状况,在一些运动比较剧烈的场景,码率会上升到 420kb,明显高于目标码率,这对咱们实时视频通话应用就会有很大的冲击。
虽然第一张图中微信自研视频编解码器的每秒数据量波动已经很是平稳了,但第二张图中红色线表示的半秒数据量波动曲线仍是呈锯齿状,这在传输中依然会对网络产生必定的冲击,为了进一步提高码率平稳性,微信多媒体团队又进行了第二轮更加严格的码率控制优化,能够看出绿线所示的现网微信视频通话版本半秒数据量波动明显比第二轮优化前的红线平稳。
第四个阶段是打磨稳定,虽然前面每一个阶段都会对编解码器进行编解码匹配、编解码各项指标性能等编解码器离线测试验证,但在合入产品应用后,尤为是在海量用户实际应用环境中,仍是会出现一些编解码器离线测试时发现不了的问题,如主观质量的缺陷问题,须要逐一分析尽量优化主观质量,以及当解码器接收到不能正常解码的“脏”数据时,须要增强解码器的鲁棒性保护,及时终止解码防止 crash 等。
案例分享:减轻块效应
这里谷沉沉分享了在微信视频通话研发过程当中减轻块效应的两个优化方向:
一个优化方向是码率分配微调。包含帧级和帧内两个方面:帧级码率分配微调是针对码率平稳性优化形成运动剧烈场景下视频质量损伤明显的问题。所以在完成码率控制算法以后须要根据主观质量状况对码率分配作一些微调,适当增长运动剧烈场景下码率分配以提升质量;帧内率分配微调是指,因为人眼对平坦区域更加敏感,因此也会多为平坦区域多分配一些码率。在上面这个视频中,左面是优化以前,右面是优化以后,在运动剧烈场景中,如挥手的时候,手的部位较平坦区域块效应明显减轻。
另外一个优化方向是编码模式的微调。这里谷沉沉又举了两个例子:
一是关于 skip 模式的断定,上图左下角解码视频截图中脸部标红圈的地方出现比较明显的块效应问题,通过分析发现这个视频中相邻的这两帧在这个位置上内容类似,编码过程当中基于率失真最优原则的模式选择结果是采用 skip 模式编码,简单说就是直接拷贝前一帧中相应的像素块,虽然在客观编码效率上是当前块最优的编码模式,但主观质量上块效应比较明显,微信多媒体团队对 skip 模式的判断条件作了一些微调,将这种状况改用 inter 模式编码,多留一些残差信息,虽然这个位置“花费”的比特数比 skip 模式多一点,但失真度也会低一些,图中右面通过调整以后这个位置基本看不出块效应。
另外一种编码模式的微调是 intra 和 inter 模式的选择,当 intra 和 inter 模式编码的率失真代价比较接近,采用哪一种模式编码对客观编码效率影响很小。可是在主观质量上,有时候 inter 模式的残差较小,量化以后一部分小系数的丢失也容易形成块效应,这个时候针对这些场景利用一些辅助的统计信息,将这种场景断定为 intra 模式编码就能解决这类块效应问题。
先后处理
先后处理的加强效果毋庸置疑,但在不少场景下“反作用”也比较大,好比去噪容易形成细节模糊甚至缺失,锐化可能带来锯齿效应……所以研究先后处理算法的关键是要消除“反作用”,微信多媒体团队就是按照“宁缺毋滥”的原则,即每次先后处理算法的更新能够只对部分场景加强,加强的幅度也能够较小,但必须保证不会出现质量变差的场景。在算法研究阶段须要设计好场景自适应策略,对于算法没法彻底解决的状况,再辅以运营策略,好比“白名单、黑名单”机制,对特定型号设备开启或关闭相应的算法等。
案例分享:光照加强
光照加强问题的发现来源于微信多媒体团队的一次视频通话测试体验,在晚上室内日光灯环境下,不一样手机摄像头采集的视频质量差别较大,有些手机的采集视频与真实环境光照基本一致,而有些手机采集的视频就偏暗,甚至连人脸都没法看清。针对这种状况,微信多媒体团队自主研究了一种低照度视频加强方法,先经过对单帧平均亮度和最大、最小亮度等信息的分析和统计,推导出单帧的亮度加强和对比度加强的自适应约束;为避免视频连续播放出现亮度闪烁,算法还考虑了先后帧亮度变化的一致性约束;最后对三个方面的约束作联合优化求解,因为优化项中只包含二次项,再进行快速算法实现优化,求解过程计算复杂度较低,所以整个光照加强技术能够在视频通话中实时处理。
上图左上角子图 (a) 为低光照的输入源视频截图,(f) 为微信自研光照加强算法处理后的视频截图,加强后可见脸部更多细节和背景环境的纹理,而从其他几个现有视频图像加强对照算法处理后的截图中,能够看出存在不一样程度的颜色异常或加强效果不明显等问题。
这项实用的研究成果在应用于微信视频通话有效提高视频质量的同时,也获得了学术界的高度承认。该算法相关的论文已发表在国际视频领域知名会议 ISCAS2017 上,并受邀在大会上宣讲,也是该次会议上仅有 5% 来自工业界的论文之一。感兴趣的读者可参考《Low-Lighting Video Enhancement Using Constrained Spatial-Temporal Model for Real-Time Mobile Communication》, IEEE ISCAS, pp:595-598, 2017
容错保护
容错保护每每经过增长冗余来实现,而视频编码又是经过下降冗余来提升压缩效率,因此容错保护的关键是要作到压缩效率和容错能力的平衡。主要有信源容错和信道容错两类方法:
信源容错能够经过改变参考关系,好比上图里 IPPP 这样依次参考的结构,若是 P4 这帧丢失了,后面从 P5 开始全部帧都没法正常解码,在视频通话中就表现为卡住。但若是改变参考关系,让 P5 参考 P3,这样 P4 虽然丢失了,可是 P5 和后面的帧都还能够正常解码,这就是一种抗丢包能力。因为 P5 的参考帧距离变远了,相关性比 P5 和 P4 之间的相关性弱,P5 的数据量就会增大,压缩效率就会下降,这就是这种容错方式所带来的时域冗余代价。咱们须要在容错能力和冗余代价上取得较好的平衡,在应用中也能够根据网络情况选择合适的冗余能力。
信道容错的方法有信源容错能够经过改变参考关系来提升在丢包环境下的视频解码正确率,如上图中 IPPP 参考帧结构,若 P4 帧丢失了,其后从 P5 开始的全部帧都没法正常解码,在视频通话中就表现为卡住。但若是改变参考关系,使 P5 参考 P3,这样,P4 的丢失就不影响 P5 及其后续帧的正常解码。但因为此时 P5 的参考帧距离变大,可能形成 P5 的帧间预测准确性降低,致使 P5 编码数据量增大,压缩效率下降,这就是这种容错方式所带来的时域冗余代价。所以须要在容错能力和冗余代价上取得较好的平衡,在应用中也能够根据网络情况选择合适的容错能力。
在信道容错方面,有分组异或、RS 编码等 FEC 前向纠错技术。能够根据每一帧的重要性等级增长不一样的冗余保护,上图中红色越深的帧表示重要性越高,它的丢失会形成更多帧解码失败,能够对这些越重要的帧增长越多的冗余保护。另外,对低延时网络,若是遇到丢包致使解码失败,能够向发送端主动请求编码 I 帧,避免长时间的卡顿。
将来之路
谈到将来,谷沉沉表示互联网时代业务和技术突飞猛进,在不太远的将来几年内,视频技术的发展方向大体有三类:
1)基础技术的突破,如 H.26六、AVS三、AV1 等下一代标准,以及最近的热点研究方向——基于深度学习的视频图像压缩,压缩效率将进一步提升。
2)现有视频产品的体验提高,继续向着高质量、低带宽 / 存储空间、低功耗的方向发展。
3)新的产品形态不断出现,好比 3D、VR 甚至光场等沉浸式的视频通话。
将来,微信多媒体团队将继续坚持以专业、专一的精神,研发实用的多媒体技术,也欢迎对视频图像技术感兴趣的优秀人才加入或开展技术研究合做,一块儿来不断提高数亿用户的微信视频通话等各种视频图像相关业务体验!