腾讯V265编码器:给用户以完备的265体验

在超高清视频画质需求与网络带宽桎梏的博弈中,视频编码无疑是全部公司关注的重点,短短两年时间,腾讯自研服务端编码器V265从最初的原始框架,到现现在的大幅完善落地使用,期间经历了大大小小无数次的迭代、优化。如经过自适应码率分配提高压缩效率,采用三级码率控制模型精准调控码率。本文由腾讯云专家工程师张贤国在LiveVideoStackCon 2019北京大会的分享内容整理而成。算法

文 / 张贤国
整理 / LiveVideoStack缓存

你们好,我是张贤国,毕业后长期从事于视频编码标准制定(HEVC、VVC),以及视频编码器(H.265)研发工做,2017年加入腾讯,主要负责视频编码研发相关工做。本次分享将重点介绍V265编码器的业务体验优化,包括码率控制优化以及业务适配相关的优化。主要内容能够分为三个部分,首先简单介绍V265的最新状况,而后重点讲解V265在码率控制方面所作的一些优化,最后会介绍V265编码器在业务落地过程当中遇到的一些问题与解决方案。网络

  1. V265最新状况介绍

目前,V265编码器可配置的编码速度级别已经达到11个以上,而且可以支持多个服务端的转码平台,以及直播,点播,零延迟,云游戏等多种业务下的延迟环境。在码率控制方面,V265支持包括ABR,CBR,VFR, 多PASS,CRF等在内的多种码率控制方法。多线程

除此之外,V265编码器支持分布式的码率控制、自适应码率编码、场景的自适应以及设备的兼容性优化。另外还支持自适应ROI编码而且将要支持编码器内的视频处理,而且在今年上半年咱们还完成了对4K 10bitHDR和杜比画质的编码和播放支持。框架

2017年11月份,V265编码器有了第一个原始框架,到如今已经发展了两年左右的时间。在2018年初,也就是研发过程进行了一年左右的时候,咱们参与了MSU比赛,V265编码器得到了主观质量评价第一名的好成绩。而且在后续的4K比赛中,迭代后的1.2版本的PSNR/SSIM综合效果也是最佳的。以后的时间,咱们开始面向业务逻辑对编码器进行优化,例如在接下来的版本中,咱们分别作了压缩率的概率提高、4K实时编码以及解决设备兼容问题。在2019年的最新1.4.0版本中V265编码器全面支持10bit编码,而且成功将压缩率优点扩大至20%。机器学习

上图是V265,X265,X264三种编码器的基本压缩率状况对比,横轴表示压缩率(从左到右,压缩率由高到低),纵轴表示压缩速度。分布式

从图中能够看出,在140个8bit 视频与20个10bit 视频,ABR算法的相同测试条件下,与X265相比V265无论是压缩率仍是压缩速度,都是最高的。好比最低的两个点:placebo和veryslow。在单Pass placebo上,相比于X265的veryslow档能够节省超20%的码率,编码速度也高出80%。V265编码器的最高速度能够达到X265placebo下的200多倍,同时,最差的压缩率也要高于X265medium档的压缩率。ide

总的来讲在单pass下,相比于X265的veryslow档V265能够节省20%码率,相比X264最慢档,节省码率则超过60%。在相同速度下,若是编码速度要求越快,V265相比X265的优点就越大。工具

V265编码器的测试集总共包含140个8bit 视频,包含多种分辨率,覆盖15个场景。除去JCTVC的部分Video以外,大可能是业务侧的Video,例如小分辨率的视频,短视频,电影,游戏,演唱会以及一些复杂的混合场景和超高清。学习

在测试中得出的平均结果,基本上V265 fast档的BD-Rate与X265的veryslow档,X264的veryslow档相近,但编码速度是X265的34倍左右。

上图左侧展现的是MSU比赛的主观对比结果,从图中不难看出,V265在主客观评价方面都是最优的。另外,右侧展现的是4K的客观对比结果,其中SSIM评价结果与竞品相比差距不到1%,而PSNR评价结果远高于竞品。

  1. 码率控制优化策略

接下来将介绍具体技术实现过程当中所遇到的问题与解决方案,内容主要分为三个部分。第一部分,自适应的码率分配,主要是为了在码率控制环境下提高压缩效率;第二部分,精准码率控制,提高了码率波动的平稳度;最后是多遍编码以及其余优化。

2.1 自适应码率分配

V265编码器的码率控制流程主要分为如下几个环节,首先经过预分析,分析出块与块之间的量化关系;接下来就是帧级别的编码控制以及CTU级的编码,最后则须要对码率,控制参数进行更新。

码率控制流程中最重要的优化就在于如何结合预分析与VBV缓存的结果来从新估计码率,并根据估计码率来调整每一个图像或者CUTREE的QP偏移。

接下来介绍CRF算法下QP预测模型优化的一个例子。在开源软件中存在一个问题,CRF的取值与QP都是严格一对一的,例如CRF等于23,QP必定严格等于几。咱们所进行的优化就是要根据当前帧的复杂度,优化CRF与QP之间的映射关系。这个在纯CRF下能够节省3%的码率。基本想法就是让更多的码率用于人眼敏感的平坦区域,举个例子:

如图中展现的连续3帧图像,帧内的复杂度是从复杂到简单的。第一幅图复杂程度较高的树的部分会更多,纹理会比较细节。而最后的图像则更侧重于人眼敏感区域,人的部分会更多。咱们能够在CRF到QP的映射结果中看到,虽然每帧的CRF都等于23,但BaseQP(帧级的基础QP)都是不同的,这就实现一种相似于帧级的内容自适应。

定码率模式

接下来重点讲解定码率的模式,不管是CRF仍是ABR算法,都存在一个VBV的控制。图中展现的是ABR算法下的码率控制基本流程。

首先咱们要进行的是码率预测模型的初始化。假设当前出现一帧M,接下来咱们就需根据复杂程度估计M帧的量化参数,若是存在cbr溢出,就须要进行一些限制。第三步,判断VBV缓冲区给当前帧分配码率的上下限,而后预测M~M+8帧图像的码率,判断总码率是否位于上下区间内,如不在上下区间内,则须要相应调整其量化参数。最后就能够编码当前图像,并对初始模型进行更新。

对于码率控制的过程,咱们进行了一系列的优化。针对码率预测模型初始化过程,咱们设计了多场景的帧级码率预测模型包括:I/GPB/B0/B1/B2模型;简单帧,复杂帧,静态帧的码率预测模型而且经过机器学习的方法来估计I帧的码率。在量化参数预测方面,传统参考软件主要是码率,累计复杂度两位相关,而咱们在其中则加入了当前帧复杂度的考量,实现了三相关的码率初始QP计算过程。

除此以外,还有包括VBV缓冲区上下限自适应计算、VBV内QP的调整优化、在输出QP时进行约束以及码率预测模型提早更新等优化。

自适应量化

为何咱们要在码率控制这部份内容中讲到自适应量化?这是由于自适应量化会影响每一帧的Cost,也就会影响到码率的控制。

自适应量化包含时域自适应量化以及空域自适应量化。所谓时域自适应量化,如图所示,从后往前,从后面任何一个块找到其在参考帧中的传播代价,传播代价越高,就认为这个块被参考的几率越大,量化参数QP也就会越小。空域自适应量化就是根据当前帧内的不一样区域的复杂度,选择不一样的量化策略。例如人眼不敏感的复杂区域,量化参数就会偏大一些。

在时域自适应量化中,会为每一帧计算一个QPoffset,而offset相比baseQP可能会过大,影响码率控制以及压缩率。所以,咱们根据这个问题进行了部分优化创新,在预分析过程当中创建帧间baseQP估计模型,引入码率控制,达到offset最大值与baseQP相关联的效果。

另外,在时域空域的联合优化中咱们也进行了一系列的优化,例如:时域自适应量化强度与空域自适应量化强度怎么调整、对高码率点的空域自适应量化进行特殊处理以及下降打开空域自适应量化后的PSNR损失。

2.2 精准码率控制

V265的帧级码率控制特色是包含多种码率控制模型,简单帧,复杂帧,静态帧以及不一样的预测帧,准确率会更高。对于行级码率控制,V265编码器自己并无进行过多的优化。不过V265新设计加入了CTU级别的码率控制模型,可精准调整QP。

(X265行级码率控制示意图)

如图所示,X265只能在每行的对角线X位置处调整一次QP,其它点的QP均是由X位置继承而来。所以,就会产生一个问题:若是编码图像为竖直结构,最下方的三角形区域就没法完成有效的QP调整。而V265编码器存在编码单元(CTU)级的码率控制模型,全部区域均有QP调整能力。所以,码率控制的精准度就会获得提高。

(X26五、V265码率波动曲线)

图为X265编码器、V265编码器以一帧为单位计算出的每一秒的码率波动。当取值为0.95时,V265码率波动与X265相近。当取值为0.2的时候,V265的码率波动会远小于X265。所以,对于那些对码率波动要求比较高的直播业务来讲,V265编码器会更加适合。

ABR条件下V265与X265对比(点播)

相同速度下V265与X265对比(直播)

如图所示,在ABR条件下(点播),V265的平均码率偏差与X265的平均码率偏差相比要低1%,而在相同速度下(直播),V265的平均码率偏差是X265的平均码率偏差的1/3,能够节省30%左右的带宽。

2.3 多遍编码及其余优化

当某视频源须要进行转码操做,在执行多遍编码时,第一遍可能只采用一种编码,第二遍则可能编码多种分辨率。而目前的开源软件,并不支持第一遍编码时的分辨率与第二遍编码时的分辨率不一样。而且普通二遍编码的压缩率也并非很好,提高有限。针对这两个问题,V265编码器添加了针对两遍编码分辨率不一样的支持,720p的一遍结果可给二遍360p/1080p使用。此外,V265编码器还增长了一些列针对二遍编码压缩率的优化,使得二遍编码的客观质量进一步提高。

对于其它码率控制,V265还提供了丰富的ROI接口,不只仅是用户可灵活控制的ROI区域QP量化接口,还提供了总体的CRF偏移接口。

此外,在上半年的工做中,由于部分客户有云游戏的服务需求,而云游戏的场景对于延迟的要求为0,所以除帧内多线程之外的全部线程均不能启用。此时,咱们须要保证编码器环路不存在delay,而且编码器还须要对预测参考策略进行部分优化。也就是说低延迟下的VBV缓冲区须要调整,低延迟对分层GOP结构的支持须要进行扩展。

VFR(variableframe rate) 码率控制在游戏直播场景中,有时须要根据输入时间戳来控制码率分配。也就是说相邻两帧的时间戳并非固定的。如图,输入源时间戳由0,1直接到四、5,也就是说编码器在码流采集的过程当中丢掉了2,3两帧。此时,X265只能定帧率编码,按固定帧率从新计算时间戳,会重复编码3次绿色图像,绿色各分配一帧码率。而V265则可支持可变帧率编码,给绿色图像分配3帧码率,而且保留原始时间戳编码,使得绿色图像画质更高,整体码率控制精度大大提高。

  1. V265业务落地优化

3.1 极速高清-内容自适应转码

当前已有的传统转码服务还存在一些问题。第一,传统方案采用固定的编码工具,但实际上不一样视频的最优参数是不一样的;第二,传统方案采用固定的转码切分粒度,但因为不一样视频的最优参数不一样,将不一样场景切在一块儿,没法找最优参数;第三,传统方案采用固定码率或质量转码参数,不能合理分配码率,简单视频码率浪费、复杂视频质量不足。仍不能保证画质。

极速高清的内容自适应转码能够对场景切换进行监测,以镜头切片为基础进行分布式转码;并对视频内容进行分类,在离线参数调优平台中对每类视频进行离线调优编码参数。最后经过视频内容分析,即视频特征(视频复杂度特征,编码特征)计算与深度学习预测,有效防止码率浪费问题。

3.2 主客观问题的发现和解决

客观问题的发现与解决

V265编码器提升客观质量最重要的一个方法就是不断丰富测试集和测试条件:即测试更多的视频,增长码率控制条件,同时收集业务问题视频,经过对比分析各类质量评价指标,不断进行优化。

在调优的过程当中,咱们发现某个版本的编码器存在这样一个问题:算法的部分阈值在某些场景下只作skip,跳过merge模式,因而就会产生部分损失,致使部分简单Video的指标骤降。

此外,还有一个问题就是2pass比1pass编码的PSNR指标变差不少。之因此出现这种状况,主要是因为2pass原理上倾向于均衡每帧的QP编码,在码率足够的状况下,针对简单,复杂场景的编码压缩程度控制太高。所以若是码率足够,在对VBV进行优化时,第一遍编码对简单、复杂场景作了自适应的码率分配,那么第二编码就要尽可能保持这一特征。

另外,咱们还面向各类场景进行优化。编码器在每一个Tunegrain测试时,都会测试三个参数 PSNR、SSIM、VMAF。在测试中咱们发现一个特色,若是PSNR与SSIM指标的测试结果都比较好,那么VMAF指标不会变差。在调优部分,对于一些人工视频,咱们经过对其部分参数进行调整,提高BD-rate。此外,咱们还能够实现对VMAF单一指标进行优化。

为了定位主观问题,咱们每一个测试都会报告平均码率偏差,峰值码率偏差以及最小客观质量。举个例子,红线部分是咱们之前的测试基准,纵轴为PSNR参数的值,从图中能够看到,PSNR存在低峰,这就意味着视频每间隔一段时间就会变糊一次。因此当咱们在引入最小客观质量后,就发现其中某些算法存在问题,以后咱们对算法进行了优化,最终结果如图绿色部分所示。

主观问题的发现与解决

针对主观问题的发现,首先要按期进行主观测试,开发主观比较工具,发现问题,作出总结报告,对出现问题的Video进行细节排查。除此以外,咱们还与业务协同搭建灰度测试沙盒,及时上报问题。

点播主观问题举例

针对部分细节编码丢失的问题,咱们通过排查发现,其主要缘由是在点播场景中若是对于VBV的限制太高,会致使某些帧的QP过大,产生主观问题。

在直播场景中,vfr编码下产生视频在场景切换后,码率极低,主观不好的现象。这主要是由于输入源时间戳连续两帧相同(非正常),引起编码器分配码率的bug。

在视频编辑时,场景切换的I帧与用户指定的I帧不在同一位置,致使码率不够用,产生马赛克。所以咱们限制指定I帧附近不自动插入I帧,避免I0和Ik 之间的码率分配异常。

因为分布式码率控制时,对片间场景切换后作了调整,致使场景切换后的部分细节模糊。针对这个问题,咱们限定分布式码控的QP调整区间不超过场景切换。

3.3 业务侧V265编码播放能力兼容

长期参考帧的软解、芯片解码支持

关于长期参考帧的软解、芯片解码的支持,因为部分电视机芯片驱动层以及部分软解播放器的支持不完善,于是没法识别长期参考帧对其进行解码。此外,在FFmpeg中,因为其解码器能力支持不完善, 当参考帧列表包含poc=X(短时间)和poc=X+256(长期)两帧时,解码器会认为X与X+256两帧帧号等同,引起崩溃。所以咱们应尽可能避免X与X+256做为长期参考帧出现,而且对于部分用户可能会强制关闭长期参考帧。

CRA I 帧的软解、芯片播放支持

H.264 为IDR GOP编码,其中每个Close GOP的B六、B五、B7帧都只能前向参考,而H.265引入了CRA帧的概念,将B六、B五、B7帧编在CRA帧以后,以实现前向参考与后向参考,提高压缩效率。一般状况下,按照标准规定,解码器在随机访问第8帧时,只须要解码帧号大于8的图像。但部分解码器在解码CRA8以后,继续解码B六、B五、B7帧,致使播放出现花屏。因此在部分业务中会强制使用Close GOP编码。

电视机解码器不支持多分层B帧

在电视机解码器中存在部分解码器认为265码流为标准码流,B帧只有一层,不存在多参考B帧。所以若是有多参考B帧,如B六、B五、B7帧出现,就没法完成解码。针对这一状况,咱们能够将V265设置成只包含一层参考B帧的结构,但相对应的压缩率也会有所牺牲。

FFmpeg3.x解码时Seek到片头逻辑Bug

FFmpeg 3.x版本存在一个Bug(在FFmpeg4.x版本已经修复),即在解码过程当中,若是片头同时存在间隔较短的两个I帧,Seek会直接指向第二个I帧,所以须要编码器在编码时尽可能避免在开始处存在间隔较短的I帧。

SPS中dpb配置的手机、电视播放端兼容性问题

SPS中存在一个dpb的语法,其标准规定是很精简的,用了多少就能够写多少,但部分解码器是按照X265标准设计,只支持冗余的解码,不兼容精简标识方法,致使V265码流没法播放。所以,V265编码器使用最大冗余的标识方法,避免出现dpd管理问题。

相关文章
相关标签/搜索