导读 | 腾讯会议自去年12月底推出,在疫情期间极速扩容,日活跃用户超过1000万。面对数量庞大的用户,以及他们背后网络、设备的多样性,该如何针对各个场景进行优化以提升用户体验?在【腾讯技术开放日 · 云视频会议专场】中,腾讯多媒体实验室视频技术专家王诗涛针对视频编码技术优化实践进行了分享,讲述如何利用视频技术达到清晰流畅,低延时的用户体验。
点击视频,查看直播回放
一、屏幕分享场景编码技术优化实践
在视频会议中,视频的应用场景分两部分:屏幕分享和摄像头视频。屏幕内容是由电子设备生成的图像,摄像头内容是由摄像头采集的视频,两种视频内容的特征差异巨大。
传统的视频编码采用的是预测加变换的混合编码结构,这种方式适合摄像头采集的视频。但是对于屏幕内容,它的编码效率不太好。为了提升压缩效率, HEVC (High Efficiency Video Coding)针对屏幕内容专门推出了HEVC-SCC编码标准,可以大大提升屏幕内容的编码效率。
HEVC-SCC在HEVC原有标准的基础上,增加了帧内块拷贝、调色板模式、自适应色彩转换、自适应运动矢量精度几个编码工具集。这几个工具集中,帧内块拷贝(IBC)和调色板模式(Palette Mode)对视频压缩效率的提升最为明显。IBC采用当前帧已重建块作为预测块,可以认为是基于当前编码图像内的运动补偿;Palette Mode枚举颜色值生成颜色表,然后为每个样本传递一个索引以指示它属于颜色表中的哪种颜色,它特别适合颜色数比较少的编码块。根据官方统计,对于屏幕内容,在HEVC的基础上 增加IBC和Palette Mode两个工具集,可以带来50%以上的压缩效率的提升。
1. TSE兼顾压缩效率与编码复杂度
加入SCC(屏幕内容编码技术, Screen Content Coding)虽然可以提升压缩效率,但是同时也带来了编码复杂度的急剧增加。对于腾讯会议这种实时通信场景,编码复杂度过高会影响实时性,无法得到应用。因此,我们在实现了IBC和Palette编码后,也做了大量性能优化,推出了屏幕内容编码器TSE (Tencent Screen Encoder)。
我们在算法实现、模式选择、汇编优化等方面对TSE编码器做了全方位优化:
- 对于IBC编码模式,采用了基于hash表搜索的运动估计代替传统的基于块匹配的运动估计。对于8x8块,我们将其分成4个4x4个小块,计算它的hash值,然后将这个块的坐标存入该hash值对应的链表。另外,对于hash查找的顺序也做了优化,位置较近的点先计算,大大提升hash搜索速度。
- 对于Palette编码,最复杂的模块就是颜色表的生成和查找颜色表,我们在YUV数据生成颜色表数据以及根据YUV数据快速查找到颜色表中最匹配的颜色数据方面做了大量优化,提升调色板编码速度。
- 除了IBC和Palette本身的算法优化,在模式选择、快速算法方面也做了很多优化,比如通过帧内帧间预测结果提前退出Palette模式判决等。
- 此外也加入了SIMD优化,进一步提升速度。
经过优化之后,TSE编码器相比开源的X265编码器在各方面都具有明显优势。首先来看压缩效率,对于摄像头采集的数据,TSE的压缩效率有20%左右的提升。对于屏幕内容,TSE的提升更加明显,相比X265(ultrafast)的压缩效率可以提升70%以上,对它的medium模式也可以提升50%以上。
在编码速度方面,TSE也相比X265有明显优势。对于屏幕内容序列,TSE的编码速度不到X265的一半,对于摄像头序列,也是比它要快10%以上。
除了客观质量数据的提升,TSE在图像主观质量方面的提升也是比较明显的。左边上面是用X265编码的,下面是用TSE编码的。可以看到采用X265编码,文字周边噪点非常多,整体质量较差。用TSE编码之后,文字周边非常清晰干净,图像质量明显优于x265。除了文字,TSE在纹理方面保真度方面也有优势,右边这两个图中,采用TSE编码后,很好的保留了原图的纹理轮廓,线条会更加细腻清晰。
2. YUV444编码解决颜色失真、文字模糊问题
对于屏幕分享场景,除了采用SCC相关编码技术,我们也推出了YUV444编码技术。
我们一般的视频编码都是采用YUV420格式,这种编码模式会对UV色度分量进行下采样,而下采样会导致颜色出现失真。比如下面这张图,上面是发送端,这张图是彩色的,但是经过屏幕分享到接收端后,它变成了一张灰度图。
为了解决色彩失真的问题,我们在TSE里面采用了YUV444编码格式,来解决因为色度降采样导致的颜色失真。而且,根据相关资料,在YUV444编码模式下,SCC更能发挥压缩效率方面的优势。
这里有几个对比图,可以看到YUV444编码的图像,文字会更加清晰,颜色也会更加接近原图。
二、摄像头场景编码技术优化实践
1. SVC编码
前面我们介绍了屏幕分享场景下的优化,接下来我们来介绍在摄像头场景下的编码优化。我们都知道视频编码里有三种帧类型,I帧、P帧、B帧。在实时通讯场景下,一般是IPPP的编码结构,逐帧参考,也就是参考前一帧,一般不会使用B帧。
对于视频会议场景,多人会议中各个用户的网络情况可能各不相同,有的人网络比较好,有的人网络条件差一些。如何适配不同用户的网络状况,在各种网络状态下都能获得一个比较好的视频体验呢?
举个例子,视频会议有三个接收端,下行带宽分别为1M、2M和4M,那么发送端应该编码多大的码率呢?如果只使用1M的码率发送,可以满足接收端1的要求,但是网络比较好的接收端3本来有4M的下行带宽,也只能收到1M的码率,他的视频体验就会被影响。那么如果发送端直接下发4M的话,接收端1可能会卡死,而它卡死之后会申请I帧,发送端发I帧,也会影响其他用户的体验。
为了解决多人视频会议中的这个问题,优化体验,腾讯会议采用了SVC灵活分层编码技术。SVC采用分层参考机制,以上图为例,会把所有的帧分成三层,D0层只能参考D0层的帧,D1层可以参考D0层或者D1层的帧,D2层可以参考所有层的帧。
这样做的好处是,如果用户网络比较差的话,只需要发D0层的帧过去,这样即使只收到0、4、8号帧,也可以正常的解码。同时对于那些网络比较好的用户,可以把所有的帧都发过去。SVC灵活分层编码技术既保证了网络好的用户的视频高清流畅体验,又能保证网络带宽比较差的用户的基本的视频体验,而有效的解决了多终端网络适配的问题。
这里有一个采用SVC编码和普通编码的对比效果。左边这个采用普通的IPPP参考模式,它基本上是卡死的,用户体验非常差。右边这个采用SVC编码,可以看到虽然相对全帧率它的帧率有些损失,但是能够保证基本的视频通讯体验。
2. ROI编码
ROI (Region of Interest) 编码很多人比较了解,是基于感兴趣区域的编码。在摄像头场景下,我们主要关注的一般还是在人脸区域,对背景区域的关注低。腾讯会议加入了人脸检测算法和基于ROI的编码算法,实时检测出人脸区域,然后将它传入编码器,编码器进行帧内的码率重分配,对人脸区域增加码率,提升编码效果,对非ROI区域降低码率,保证总的码率不超出。
视频会议对实时性能要求很高,所以对算法的复杂度也比较敏感,所以我们研发了一套高效的检测算法,可以把一帧1080P的图像检测耗时控制在0.5毫秒以内。基于ROI区域优化码率控制算法,可以在低带宽下提升主观质量,在高带宽下可以保证主观质量基本不变的情况下,降低20%到30%左右的码率。
三、灵活多变的编解码策略
前面我们介绍了一些腾讯会议在视频编解码方面的优化技术。最后我想说的是,视频编解码的优化,不单单是编解码内核的优化,还有与之配套的一系列编解码策略的优化,编解码模块与采集,渲染,网络等模块是深度耦合的,只有系统级的优化,才能获得最佳的视频效果。
在视频会议场景下,除了软件编解码,还有硬件编解码。两种编解码各自的优劣非常明显,软件编解码压缩效率高,硬件编解码功耗低,省电。在不同的场景、不同的平台上,需要选用不同的软硬件方案。
另外,编码分辨率,帧率的选择也是影响视频效果的重要方面。比如到底是选择高帧率低分辨率还是高分辨率低帧率?在固定码率下,如何根据场景运动剧烈程度来动态调整帧率、分辨率,比如PPT场景,屏幕静止的时候,我们可以降帧率。
针对不同的机器性能配置,在编码的时候也需要选用不同的preset档位。对于性能好的机器就会以复杂度优先考虑,以提升编码质量;对于性能比较差的机器,就会以速度优先来牺牲部分的编码质量,保证基本的视频体验。
SVC编码的策略调整也是非常重要的。SVC虽然多人视频场景下,网络适应性好,但是SVC编码相对普通参考帧模式,压缩效率是有损失的。所以什么时候采用SVC,什么时候采用普通参考帧模式也是很有讲究的。我们需要根据用户网络下行带宽动态的开关SVC。而如果用SVC的话,也要根据用户的网络,动态调整SVC下发层数。
四、讲师简介
王诗涛
腾讯多媒体实验室视频技术专家
王诗涛,腾讯多媒体实验室视频技术专家。2013年加入腾讯,主要负责实时音视频SDK的视频编解码、视频引擎的设计开发工作。