揭秘腾讯会议背后的视频编码“神器”.docx
揭秘腾讯会议背后的视频编码“神器”张清腾讯多媒体实验室高级研究员。作为一款实时音视频通信产品腾讯会议里面有海量的音视频数据需要进展实时传输比方我们的摄像头画面屏幕共享的数据等。这些数据量非常庞大通常需要经过编码压缩再进展传输那么腾讯会议里有哪些视频编码方面的神器呢本文将一一为大众揭晓。一、时域SVC在视频编码中有三种帧类型I帧只能进展帧内预测可以独立解码P帧单假设参考帧也就是通常讲的前向预测帧只能使用它之前的帧进展预测B帧双假设参考帧,一般为双向预测帧。由于B帧会带来不可防止的延迟因此在实时通信中通常只使用I帧以及P帧这两种帧类型。I帧只使用了本帧的信息进展预测也就是讲I帧的解码不依赖于其他帧因此可以独立解码但I帧的编码效率偏低数据量较大。P帧使用了帧间预测方法可以参考之前的一些解码帧信息能到达较高的压缩效率帧大小比I帧小很多但是解码时必须依赖于其他帧。在实际的应用场景中为了提升压缩效率往往会使用IPPP的帧构造即I帧之后编码N个P帧。但当网络情况不好时如抖动丢包限速等这种帧构造就会造成长时间的卡顿。如下列图所示第0帧为I帧后续7个帧均为P帧且每个P帧只有一个参考帧为其前一帧。当网络发生丢包时第3帧丧失由于第4帧参考第3帧进展压缩因此不能正确解码57帧那么类似。这种情况下即使丢包只造成个别帧的丧失但由于接收端很多帧不能正确解码会造成长时间的卡顿只能通过申请I帧的机制进展恢复。IPPP帧构造参考关系为解析决这一问题我们参加了时域SVC技术对参考帧构造进展了调整。时域SVC帧构造参考关系我们可以将视频帧分为假设干层上图以3层为例Layer0的帧只能参考同样为Layer0的帧不能参考Layer1以及Layer2的帧Layer1的帧可以参考Layer0以及Layer1的帧不能参考Layer2的帧Layer2的帧可以参考Layer02的帧。越低层级的帧被参考的可能性越大因此重要性也越大。在网络发生丢包时只要所丢的帧不是Layer0层就不需要重新申请I帧解码端就可以持续成功解码。如上图中第1帧丧失仅会影响23帧其他帧不会受到影响。此外还可以结合网络层的策略对低层级的帧多加一些保护如FEC降低其丧失的概率能有效地解决卡死的问题。在参会的下行人数很多时可能会有小局部下行网络较差假如采用传统的IPPP构造那么当某个下行损伤时就需要不断的申请I帧来恢复这样就会影响到其他接收端的视频体验假如采用时域SVC的构造在可以保证少数的下行网络存在问题时其他的下行端不会受到影响。讲了这么多我们来看一下实际的效果吧第一个视频例如是IPPP构造在网络损伤时的表现卡顿感很明显接下来是采用时域SVC的版本帧率会有所影响但整体还算流畅。IPPP帧构造网络损伤效果时域SVC帧构造网络损伤效果ROI检测和基于ROI的编码摄像头内容是腾讯会议中的一个主要视频场景。在此场景中人眼往往比拟关注人脸区域对背景区域的关注度较低。因此我们参加了人脸检测算法以及基于感兴趣区域RegionofInterest,简称ROI的编码算法。这类算法的主要思路是实时地检测出当前视频中的ROI区域将其传入到编码器内部编码器进展单帧的码率重分配。对ROI区域增大其码率能使该区域编码的更好提升主观质量对于非ROI区域降低其码率那么总的码率不会超出目的码率。在ROI检测方面因为腾讯会议是一个实时性要求很高的场景对算法复杂度很敏感我们使用一些传统的算法结合编码器的一些预分析结果确定最终的ROI-map对于1080p的视频单帧检测耗时在0.3ms以内完全知足了实时性的要求。基于ROI的检测以及码率调整算法的优点在于在低码率的情况下能极大地提升主观质量在高码率的场景下可以保持主观质量根本不变码率节省20%30%以下是一些比照效果低码率效果比照(左)关闭ROI(右)开启ROI高码率效果比照(左)300kbps,关闭ROI(右)210kbps,开启ROI屏幕内容编码技术屏幕共享/白板等屏幕类内容是腾讯会议中另一类视频场景。屏幕生成的视频与摄像头收集的视频存在很大的不同屏幕视频通常没有噪声色彩离散线条细腻边缘锐利相反的摄像机拍摄的视频通常存在噪声色彩连续且丰富纹理比拟复杂。传统的H.264以及H.265编码器采用的是基于块的混合编码框架包含预测变换量化和熵编码。其中变换模块主要的目的是将残差信号从空域变换到频域使信号能量更集中也方便基于不同的频率分量做不同的处理减小编码所需的比特数。但是对屏幕共享的内容采用基于变换的编码方法会损失其高频细节导致用户观看的视频变得不明晰。基于上述原因我们在H.265编码器中参加了一些有效的屏幕内容编码技术ScreenContentCoding简称SCC包括帧内块拷贝以及调色板编码。我们在前面的介绍中也提到过一般情况下I帧编码效率要比P帧差主要原因是P帧可以利用时域上的信息进展预测预测准确度往往很高这样编码的信息量就变少了。如下列图所示第N帧与第N-1帧之间只有很少量的运动所以用第N-1帧的信息来预测第N帧相对来讲会很准确。帧间预测例如图所谓的帧内块拷贝是指借鉴了帧间预测的方法在I帧中引入基于运动矢量MotionVector,简称MV的预测提升其预测准确度极大地提升了I帧的压缩效率。该方法之所以在屏幕类场景效果显著是由于屏幕序列相比于摄像头收集序列有很多重复性的图案用这个方法效果更好。屏幕序列重复图案例如在屏幕内容中像素点的选择通常集中在某一些色彩上所以我们引入了调色板形式。该形式彻底抛弃了传统的变换编码的方法直接根据像素点的“颜色值生成调色板。对每个像素点传输其在调色板中的“索引“index即可。该算法可以到达很高的编码效率提升同时这种方法由于不使用变换且大多数的点可以在颜色表中找到对应的项主观质量也有明显的提升。YUV444编码在视频编码中根本的数据格式为YUV根据采样格式的不同可以分为YUV444,YUV422和YUV420这三种格式的区别见下列图O表示Y分量X表示U/V分量YUV采样格式(左)YUV444(中)YUV422(右)YUV420YUV444采样格式中Y、U、V三个分量的比例一样每个像素的三个分量信息完好都是一个字节。YUV422采样格式中Y分量以及UV分量那么按照2:1的比例采样。如下图程度方向有4个像素点那么就采样4个Y分量2个UV分量。YUV420采样格式中每一行扫描时只扫描一种色度分量U或V且该色度分量与Y分量按照2:1的方式采样。如下图为了直观的理解我们认为4个Y分量对应1个UV分量因此将X放在了四个O中间。一般来讲大多数的视频类应用都采样YUV420的格式进展编码一方面这种格式数据量较少另一方面色度分量的重要程度明显低于亮度分量对色度降采样后人眼主观感受降低不明显。然而在屏幕共享场景中相比于摄像头收集序列U/V分量信息更丰富下采样会严重的丧失这局部信息且在后续的后处理等环节无法补回所以我们参加了YUV444编码的支持。大众可以看下下面这两张图我们人为生成了一张U/V分量信息很丰富的图片在发送端可以看到是有色彩的但是经过YUV420收集编码传输后到接收端看到的却是一幅灰度图像失真非常严重。测试图片YUV420传输效果(U/V分量严重失真)在屏幕共享场景下有些时候可能会对色彩的保真度/复原度要求较高如一些设计图像等那么参加YUV444的支持就是为了在这些场景下到达不错的用户体验。下面是我们实际测试到的YUV420/YUV444编码下的比照图原图YUV420编码图像YUV444编码图像五、业界领先的编码器我们对H.264以及H.265编码器进展了深度优化一方面参加了很多快速算法提升其编码速度另一方面参加了一些新的编码工具集提升其压缩效率。与业界最著名的x264开源编码器相比我们的H.264编码器针对屏幕共享内容做了大量的优化到达了40%以上压缩效率的提升编码速度仅损失11%左右。我们的H.265编码器无论在屏幕共享场景还是摄像头场景都远远优于开源的x265编码器。与x265相比在屏幕共享场景下压缩效率提升多达83.7%速度提升210%在摄像头场景下压缩效率提升24.7%的同时速度可以提升140%左右。结语本文较为详细的介绍了一些腾讯会议中的视频编码“神器为了不断地提升产品体验我们会根据不同的场景持续优化我们的编码器增加合适的编码技术欢送大众咨询体验腾讯技术工程