IBC+Palette 实现屏幕内容编码优化

Stella981
• 阅读 1086

在屏幕内容编码中采用IBC+Palette编码技术可显著提升其压缩效率。本文主要介绍了腾讯屏幕内容编码优化技术探索与实践:加入IBC+Palette编码工具集,并针对屏幕内容优化ME模块等。本文由腾讯音视频实验室视频编码技术负责人,王诗涛在LiveVideoStack线上分享中的演讲内容整理而成。

文 / 王诗涛

整理 / LiveVideoStack

直播回放:

https://www2.tutormeetplus.com/v2/render/playback?mode=playback&token=e632113e78b14a2eb10ee64a0f16bd07

大家好,我是来自腾讯音视频实验室的王诗涛。接下来将与大家分享我们在屏幕内容编码优化与技术落地的探索之路。

1. 屏幕内容编码

IBC+Palette 实现屏幕内容编码优化

在开始正式分享之前,首先简单介绍一下屏幕内容编码:屏幕内容图像与传统摄像头采集到的图像存在很大不同,屏幕内容图像是电子设备生成的图像,其直接从各类设备(包括但不限于计算机、移动终端)的图像显示单元捕获;一般情况下屏幕内容图像包括以下几个类型:计算机图形文本、自然图像与图形文本结合的混合图像以及计算机所生成的动画。

IBC+Palette 实现屏幕内容编码优化

随着移动设备与智能终端不断渗透人们的生活,屏幕内容图像在我们的生活中也越来越普遍,无论是桌面协作、云游戏,还是第二屏幕、桌面共享、在线教育等领域都有其十分广泛的应用,那么屏幕内容图像与传统的摄像头所采集的图像究竟有什么区别?

IBC+Palette 实现屏幕内容编码优化

摄像头采集到的图像在通常情况下都包含传感器的噪声,且色调一般连续并具有十分复杂的纹理;而对于屏幕图像,其通常并不包含噪声。这是因为其中很多都是计算机生成的图像,色调离散而颜色数更少;除此之外,屏幕图像的线条更为细腻,边缘也较为锐利;同时大部分屏幕图像的均匀平坦区域较多,重复图案与相同块也较多。传统视频编码方案更多为摄像头采集的自然视频图像设计,多采用预测+变换的混合编码结构。此混合编码结构对于屏幕内容编码的编码效果欠佳。如上图右侧所示,图中的Word文档为计算机生成的屏幕图像,我们可以从图中清晰看到一些区域的文字变得非常模糊,许多细节信息被丢失,同时表格边缘有非常明显振铃效应。由于屏幕图像相对于自然采集而来的摄像头图像有很大的不同。我们希望利用好屏幕图像的这些特有特征从而大幅度提高其编码效率和图像质量。

2. HEVC-SCC技术

IBC+Palette 实现屏幕内容编码优化

HEVC针对屏幕图像编码的做了很多编码工具集的优化,首先简单介绍一下HEVC关于屏幕内容编码的一些主要技术。在HEVC的几个版本中都有一些针对屏幕内容编码的优化技术:例如v1版的HEVC就推出了变换跳过的编码技术,其原理是在编码时自主选择是否跳过频域变换;而HEVC-RExt除了变换跳过,还增加了残差旋转、残差DPCM与交叉分量预测等SCC工具;2016年,HEVC推出第四版HEVC-SCC,该版在之前基础上增加了很多专门针对屏幕内容编码的工具集,包括帧内块拷贝、调色板模式、自适应色彩转换与自适应运动矢量精度等。

IBC+Palette 实现屏幕内容编码优化

接下来简要介绍下这几个工具集:

  • 帧内块拷贝:采用当前帧已重建的块作为预测块,IBC在当前编码图像内做运动补偿;

  • 调色版模式:调色板模式会枚举每个编码块的颜色值生成一个颜色表,并为每个样本传递一个索引以指示它属于颜色表中的哪个颜色;解码端根据规则生成一个颜色表并通过颜色表索引完成样本的重建工作。

  • 自适应颜色转换:将残差自适应转换到不同的颜色空间,一个RGB颜色空间的图像块可以直接编码,也可以在编码时自适应地转换到YCoCg颜色空间以进行编码;

  • 自适应运动矢量分辨率:由于编码过程中屏幕内容图像的运动通常是像素级的,因此我们可以在Slice级控制运动矢量MV的精度。

3. IBC编码与调色版模式

SCC编码工具集能显著提升屏幕内容编码压缩效率,这其中以IBC和调色板对压缩效率的提升最为明显。根据相关资料,对于屏幕内容,IBC可提升30%以上的压缩效率,如果加入调色版模式则可在IBC的基础上再提升15%。接下来我将对IBC和调色板进行详细介绍。

IBC+Palette 实现屏幕内容编码优化

IBC编码是由当前编码图像帧的重建块预测得到的,以上图中的PDF截图为例,由于英文仅由26种英文字符组合而成,我们在编码的时候,很容易在当前I帧画面的已完成编码块中找到同一个英文字符;如果在编码时能够参考这些当前编码图像中已经完成重建的编码块,就能大大提升编码效率。比如,图中最后一行的IB两个字符就可以用它左上角的IB两个字符来做预测,这样预测精度非常高。还有一点,IBC是在PU级进行,我们可以将其视为一个帧间PU,帧间模式的设计让IBC和普通的帧间预测模式能够更灵活的连接起来,比如,一个帧间编码的CU可以有两个PU,一个使用传统的帧间预测,另一个使用IBC。

IBC+Palette 实现屏幕内容编码优化

当然,IBC相对于传统帧间预测也存在许多不同:

  • IBC参考块都是滤波之前的重建像素。

  • 当前图像如果被用于参考,其会被标记为长期参考帧;当整张图像解码完成之后,IBC会对其进行环路滤波然后将当前图像加入到DPB中作为短期参考帧。

  • IBC的预测块不能和当前CU重叠,以防止未重建好的样本被用于预测。

  • 预测块和当前CU应当位于同一个Slice和同一个Tile。

  • IBC的块矢量必须是整像素精度。

IBC+Palette 实现屏幕内容编码优化

除了IBC编码,SCC还有另一个重要工具集,也就是调色板模式(Palette mode)。调色板模式对于颜色数比较少的编码块会有比较好的效果,通常情况下,屏幕内容的颜色数量是有限的,这些颜色就可组成一个颜色集合,也就是一个调色板;随后在解码重建每个像素时,解码器可通过颜色表与索引,从调色板中寻找与对应像素点匹配的颜色从而完成像素重建。如上图右侧所示,图中CU有四种颜色,对每个像素点,编码器在进行编码时会直接从颜色表中寻找此对应的颜色值并直接完成像素重建;当颜色数较少时,绝大部分像素都可通过颜色表实现重建;由于采用颜色索引+颜色表的方式,不需要经过变化量化即可实现像素重建,调色板在显著提升编码效率的同时也降低了复杂度。

虽然一个编码块中的绝大多数颜色都可在颜色表中找到与其最为接近的颜色值,但是有时也会出现颜色表中找不到与编码像素点颜色很匹配的颜色的情况。针对这种情况,调色板模式增加了一种被称为“escape”的模式,此模式会对找不到匹配颜色的编码像素点专门进行反量化操作以完成像素重建,从而解决部分颜色点无法找到匹配颜色值继而导致颜色失真的问题。

IBC+Palette 实现屏幕内容编码优化

上图展示了调色板编码的整体流程图,其中包括以下几大模块:颜色表生成模块、模式判决模块以及直方图计算模块。在进行模式选择时,如果最终编码器选定采用调色板模式,那么颜色表以及编码索引参数会被写入码流并传输到解码端。

4. 腾讯屏幕编码技术解决方案(TSE)

IBC+Palette 实现屏幕内容编码优化

之前我们简单介绍了屏幕内容编码技术与HEVC中关于屏幕内容编码的一些工具集。这些工具集中,帧内块拷贝与调色板编码给屏幕内容编码压缩效率带来的提升最为明显。大部分情况下的屏幕内容编码序列如果采用IBC+Palette模式,其压缩效率相对于H265可实现50%以上的提升。对腾讯而言,腾讯无线投屏、腾讯会议等协同办公产品存在大量的桌面共享类的应用场景,共享的内容以PPT、Word等为主,这些都是非常适合屏幕内容编码的。。如果我们能够采用屏幕内容编码技术,无疑会大幅提升编码压缩效率,提升产品竞争力,所以我们启动了屏幕内容编码的研究与实现。接下来和大家分享一下腾讯屏幕编码技术解决方案的研究成果,我们推出了一个专门针对屏幕内容进行优化的编码器——腾讯屏幕内容编码器(TSE)。

IBC+Palette 实现屏幕内容编码优化

TSE编码器主要是在原有编码器的基础上增加了IBC与Palette两个工具集,并且针对性的做了大量性能优化,其中的几项代表性优化有:

1)基于hash搜索的运动估计:对于IBC的运动估计,采用了基于hash表搜索的优化技术。传统的块匹配方法是基于SAD的,该方法耗时过大,无法满足无线投屏产品对于延时的高要求。我们通过使用基于hash搜索的运动估计方法来代替传统运动估计,采用hash表搜索的方式能够大大减少运动估计所需要搜索点的个数,从而降低运动估计的耗时。根据我们之前的统计,此方法在提升速度的同时,带来的压缩效率的损失基本可以忽略不计。

2)快速高效的颜色表生成算法:调色板编码整体流程中耗时最大的就是颜色表生成模块,SCM参考软件中的颜色表生成算法具有很高的复杂度,编码一帧耗时非常大。我们对颜色表的生成算法进行了大量的简化以达到提速的目的。在提速的同时,我们还需提高调色板效率,因为在进行调色板编码时,编码效率高低主要取决于颜色表生成质量,所以优化颜色表生成算法是其中的一项关键技术点。如何复用前面已生成的颜色表也是调色板编码的一个核心技术点。为了提升编码效率,我们最好复用之前已经生成的颜色表,也就是通过前面已经生成的颜色表来预测当前此颜色表,这样就可大幅度节省颜色表传输所消耗的码字,同时显著提升了调色板编码的效果。

3)高效的查找表算法:当颜色表生成之后,编码器需要去查找颜色表以找到每一个像素点的最接近的颜色,如何快速找到最匹配的颜色也是影响调色板编码性能的关键点之一。如果采用YUV三个变量进行搜索,那么我们需要构建一个2的24次方规模的查找表,这在实际应用中显然是不现实的。所以我们也对查找表算法进行了大幅度优化以降低其对于内存的占用。

4)大量的提前退出算法:我们在编码模式选择上加入了大量的快速算法,比如进行帧内、帧间判决后,根据判决结果以及cost值,决定是否要进行调色板编码+IBC编码的cost计算,这样可以节省大量时间。

5)汇编优化:除了以上优化,我们还对其中许多关键模块进行SIMD优化从而显著提升编码速度。

5. 成果与展望

IBC+Palette 实现屏幕内容编码优化

经过上述一系列优化之后,腾讯TSE编码器的性能相较于X265有了显著提升:上图是二者的压缩效率对比数据,右侧为摄像头采集序列,左侧为LDP模式下的屏幕内容序列。对于屏幕内容序列,TSE编码器的编码效率相较于x265-ultrafast模式有70%的性能提升,相对于x265-medium也有将近55%的压缩性能提升;而观察右侧摄像头采集序列的对比数据,TSE编码器的编码效率相较于x265-ultrafast模式有也有20%左右的压缩性能提升。

IBC+Palette 实现屏幕内容编码优化

上图是二者的压缩效率对比数据:对于屏幕内容序列,不打开IBC和PLT,TSE的平均编码耗时仅为x265-ultrafast的33%左右,而打开IBC和PLT,TSE的平均编码耗时是x265-ultrafast的50%左右。无论是编码速度还是编码效率,TSE的优势都十分明显。

TSE不仅在压缩效率和编码速度方面有优势,同时对主观质量的改善也是非常明显的。下图展示了TSE与x265的主观质量对比:

IBC+Palette 实现屏幕内容编码优化

可以看到在相同码率的条件下,x265编码编码得到的图像中文字周边存在明显的振铃效应,给人眼的直观感受就是图像脏且比较模糊;但采用TSE编码所得图像中文字清晰而锐利,人眼的观看体验明显更加舒适,主观体验明显要好。综上所述,TSE编码器能为编码带来码率节省、速度提升与主观体验优化。

IBC+Palette 实现屏幕内容编码优化

TSE技术现已在腾讯无线投屏与腾讯会议上实现了商用化,但提升用户体验的探索对我们来说是永无止境的。我们期望在未来能研发出更加出色的编码器,在尽可能快的情况下实现更好的压缩质量与效率,从而进一步提升用户体验。

LiveVideoStack  招募

LiveVideoStack正在招募编辑/记者/运营,与全球顶尖多媒及技术专家和LiveVideoStack年轻的伙伴一起,推动多媒体技术生态发展。了解岗位信息请在BOSS直聘上搜索“LiveVideoStack”,或通过微信“Tony_Bao_”与主编包研交流。

IBC+Palette 实现屏幕内容编码优化

LiveVideoStackCon 2019北京正在招募讲师,无论你是技术派还是学术派,亦或是行业专家,无论你的团队有多小、有多新,都可以来申请成为LiveVideoStackCon的讲师。点击【阅读原文】了解更多大会相关信息。

本文分享自微信公众号 - LiveVideoStack(livevideostack)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这