一、屏幕分享场景编码技术优化实践
在视频会议中,视频的应用场景分两部分:屏幕分享和摄像头视频。屏幕内容是由电子设备生成的图像,摄像头内容是由摄像头采集的视频,两种视频内容的特征差异巨大。
传统的视频编码采用的是预测加变换的混合编码结构,这种方式适合摄像头采集的视频。但是对于屏幕内容,它的编码效率不太好。为了提升压缩效率, 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 下发层数。
头图:Unsplash
作者:王诗涛 - 腾讯多媒体实验室视频技术专家
原文:腾讯技术开放日 | 保障视频连线画质清晰且流畅,腾讯会议有这些优化实践
来源:腾讯多媒体实验室 - 微信公众号 [ID:TencentAVLab]
转载:著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
评论