腾讯V265编码器
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档的压缩率。
在单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评价结果远高于竞品。
2. 码率控制优化策略
介绍具体技术实现过程中所遇到的问题与解决方案,内容主要分为三个部分。
自适应的码率分配,主要是为了在码率控制环境下提升压缩效率;
精准码率控制,提升了码率波动的平稳度;
多遍编码以及其他优化
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调整能力。因此,码率控制的精准度就会得到提升。
(X265、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直接到4、5,编码器在码流采集的过程中丢掉了2,3两帧。X265只能定帧率编码,按固定帧率重新计算时间戳,会重复编码3次绿色图像,绿色各分配一帧码率。V265则可支持可变帧率编码,给绿色图像分配3帧码率,保留原始时间戳编码,使得绿色图像画质更高,总体码率控制精度大大提升。
3. 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的B6、B5、B7帧都只能前向参考,而H.265引入了CRA帧的概念,将B6、B5、B7帧编在CRA帧之后,以实现前向参考与后向参考,提升压缩效率。通常情况下,按照标准规定,解码器在随机访问第8帧时,只需要解码帧号大于8的图像。但部分解码器在解码CRA8之后,继续解码B6、B5、B7帧,导致播放出现花屏。所以在部分业务中会强制使用Close GOP编码。
电视机解码器不支持多分层B帧
在电视机解码器中存在部分解码器认为265码流为标准码流,B帧只有一层,不存在多参考B帧。因此如果有多参考B帧,如B6、B5、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管理问题。
参考链接:
https://cloud.tencent.com/developer/article/1507719