写点什么

保障视频连线画质清晰且流畅,腾讯会议有这些优化实践

2020 年 12 月 11 日

保障视频连线画质清晰且流畅,腾讯会议有这些优化实践

一、屏幕分享场景编码技术优化实践


在视频会议中,视频的应用场景分两部分:屏幕分享和摄像头视频。屏幕内容是由电子设备生成的图像,摄像头内容是由摄像头采集的视频,两种视频内容的特征差异巨大。



传统的视频编码采用的是预测加变换的混合编码结构,这种方式适合摄像头采集的视频。但是对于屏幕内容,它的编码效率不太好。为了提升压缩效率, 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]

转载:著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


2020 年 12 月 11 日 21:241222
用户头像

发布了 38 篇内容, 共 30999 次阅读, 收获喜欢 18 次。

关注

评论

发布
暂无评论
发现更多内容

你在寻找本地部署的后台测试工具吗?

测试那些事儿

余生很贵,请别浪费

程一初

Python

1. 初识Jackson -- 世界上最好的JSON库

YourBatman

json Jackson Fastjson

ChaosBlade:从零开始的混沌工程(四)

郭旭东

云原生 混沌工程 ChaosBlade

Summary

Kiroro

BIGO技术:全球时钟同步服务建设

InfoQ_3597a20b53cc

互联网

眼见为实,华为鲲鹏架构服务器生态大揭秘

华为云开发者社区

华为 鲲鹏920 服务器 云服务 华为云

第七周总结

晨光

lambda基本使用

Bruce Duan

Lambda

一文吃透时间复杂度和空间复杂度

书旅

数据结构 算法 时间复杂度 数据结构与算法

程序设计的一种思路:DDD

再见小飞侠

方法论 DDD 软件设计

干货分享丨玩转物联网IoTDA服务系列五-智能家居煤气检测联动

华为云开发者社区

人工智能 物联网 IoT 智能设备 华为云

揭秘 vivo 如何打造千万级 DAU 活动中台 - 启航篇

vivo互联网技术

vue.js 中台 Vue 业务中台

SpreadJS 纯前端表格控件应用案例:雷鸟365在线文档系统

Geek_Willie

前端开发 SpreadJS 在线文档

新站上线通知

Damon

List 如何一边遍历一边删除

Bruce Duan

List删除元素

架构师Week7作业1

Nan Jiang

架构师Week7作业2

Nan Jiang

性能优化概述

superman

Python Kafka 报错:ImportError: cannot import name 'KafkaConsumer'

BigYoung

Python kafka importerror 报错

【架构训练 Week07 作业】

Rex

第七周作业

晨光

多云架构下,JAVA微服务技术选型实例解析

华为云开发者社区

Java 开源 微服务 云服务

作业一

Kiroro

云上自动化 vs 云上编排

华为云开发者社区

云计算 云原生 云服务 云主机 华为云

如何优雅的实现一个过滤器

废材姑娘

spring

爱币(LOVE COIN)全球同步耀世上线,掀起币圈追捧热潮

Geek_116789

go defer 的使用和陷阱

曲镇

go

SpringBoot教程:MyBatis多数据源配置

Bruce Duan

mybatis SpringBoot 2 多数据源配置

阿里取消周报,打击低效加班!HR透露6大原因!

程序员生活志

阿里 周报

GitHub宣布已将所有代码永久封存于北极地底1000年!网友炸锅了:我写的bug终于能流传永世了!

程序员生活志

GitHub 程序员

演讲经验交流会|ArchSummit 上海站

演讲经验交流会|ArchSummit 上海站

保障视频连线画质清晰且流畅,腾讯会议有这些优化实践-InfoQ