9

成本更低、更优观看体验——自研S265编解码器解析

 3 years ago
source link: https://mp.weixin.qq.com/s?__biz=MzAxNDEwNjk5OQ%3D%3D&%3Bmid=2650413901&%3Bidx=1&%3Bsn=e0f542214ed9ed0675e192d8269c862a
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

640?wx_fmt=gif

带宽是直播运营中最大的成本,根据前瞻网估算全行业2020年的CDN费用支出将超过300亿元,在2025年接近1000亿规模 (https://bg.qianzhan.com/trends/detail/506/200715-ec767b9b.html) ,可以说降低带宽是成本控制中至关重要的一环。

与此同时,降低带宽不应以牺牲体验为代价,当我们在观看直播时第一要求是画面清晰没有马赛克,可清楚的看到主播和直播间的各种商品。怎样确保画质高清的同时成本又可控,这里核心技术是视频编解码;

640?wx_fmt=png640?wx_fmt=png

相机采集到的视频数字信号通常是yuv格式,每个像素点需要1.5个Byte来表示,以720p 25fps为例,带宽有263.67Mbps,直播1小时总流量有124.4GB,如有100万人同时观看这场直播,CDN费用会超过1亿元。好在视频图像内部帧与帧之间存在非常高的相关性,采用视频压缩技术去除相关性后,可以将带宽降低到原来的1/100-1/400。

视频压缩标准主要由ISO(国际标准组织)制订的MPEG系列和ITU(国际电信联盟)制订的H.26X系列,从1990年代开始,视频压缩行业经历了三代主要标准,分别是H.262/MPEG-2、H.264/AVC、H.265/HEVC,每隔十年时间,视频压缩标准升级带来的压缩率会提升一倍。HEVC(H.265) 作为比AVC(H.264)更新一代的视频压缩标准,提供了更灵活的编码结构和划分方式,并在运动补偿、运动矢量预测、帧内预测、变换、去块滤波、熵编码等方面进行了大量改进与优化,得益于这些新的编码工具和特色技术,相同画质下最高可以比H.264节省一半码率。

现有的hevc编码器存在诸多问题,不能满足需求。比如手机芯片的硬编码画质较差,开源的软编码器X265速度慢且压缩性能也不理想,在业界闻名的MSU编码器2019比赛中,X265相比X264的码率节省23.4%,PSNR指标排名第一的编码器(腾讯V265)相比X264可以节省52.3%的码率。

S265是淘系技术团队联合阿里云开发的高性能H.265编码器,具有 高压缩,高效率,适应场景广 三大特点,以2019年比赛的100个1080p视频10个码率点为测试基准,S265相比X264可以节省56%的码率,领先腾讯V265 4个百分点。目前S265已在淘宝直播、优酷视频、阿里云MTS、VMate、钉钉会议等业务中上线使用,经过档位调教的S265对比开源X265可实现BDrate 20%以上的增益且编码速度提升100%-600%;淘宝直播相对于去年,在线规模增加超过一倍,年总成本几乎未增加,S265也起到了至关重要的作用。

S265 JCTVC class B~F sequence

Ali265 VS   X265(RC=ABR)

Ali265 VS   X264(RC=ABR)

速度档次

BitSaving@

Same quality

SpeedRatio@

same bitrate

BitSaving@

Same   quality

SpeedRatio@

same bitrate

Veryfast

-20.2%

210%

-40.7%

55%

Medium

-18%

396%

-42.3%

66%

veryslow

-21.5%

620%

-50.4%

62%

目前淘宝直播已全量支持S265,在800kbps下实现720p的高画质压缩。今年双十一,在PC直播中还上线了1080p高清直播。为了满足实时流量调控和低延时直播需求,S265还支持秒级码率调控和极低延时压缩模式。在优酷点播中,S265实现了10bit HDR,并实现非实时极致压缩能力,为优酷双十一节省大量带宽成本;

S265的优化思路,从码率控制、编码工具两个方向优化编码质量,并从快速算法及工程算法两个方向进行速度优化,分别在编码质量、编码速度和编码延时3个方面得到大幅改善。

640?wx_fmt=png

基于感知模型的编码质量优化

码率控制的目标是把码字分配到更有价值的地方, 从而在目标码率下使得编码失真降到最低,或者在失真固定的前提下使码率降到最低。

在帧级别码控中,传统方法统计所有已编码帧的长期复杂度, 根据单一因素算出的QP不能及时响应画面的变化。我们基于cutree理论准确估计预分析长度中IBP帧的码率占比和预期编码大小,从而在编码前获得更准确的量化系数。

ABR是常用一种码率控制方法。但HM中基于 − 模型 的码率控制方法没有考虑图像块之间的参考强度关系,编码质量比较差。X265,X264中采用的MB-tree方法帧的QP定制不合理,码控的准确度比较差,平均只有89%。我们根据“每1个bit被分配到任何一个CU,产生的边际价值都相同”这样一个原则,对MB-tree方法进行了理论创新,使得编码精度提升到了97%,且编码质量提升了0.65db,对应17%的码率节省。

第1个,I帧的QP推导,X265使用了一个经验值,没有考虑到视频本身的特性,这样做很不合理,我们用预分析中低分辨率图像的复杂度和目标码率,经过多次迭代搜索得到准确的QP;

第2个,随着时间的推移,历史帧的复权重越来越高,新产生的帧权重越来越低,导致其不能很快的响应复杂度的变化,我们根据新产生的帧的参考强度计算出一个Qlamda,跟原来的Q做加权得到真正的Q,可以及时的反应新产生帧及其后续帧的复杂度;

第3个,原算法采用基于Viterb的P帧决策算法,每个帧都需要跟历史帧比较,复杂度很高,并在判决P帧时没有考虑QP的影响,准确率也不高。我们的算法只需要计算相邻帧的变化率,并引入QP来作为判决阈值,大幅降低了计算复杂度并提高了准确度。

块级码控分配则受时域cutree和空域AQ影响,s265在时域上越统计噪声能量,运动强度,纹理边缘强度,以及编码配置等参数与信息传递比例之间的关系;  在空域上,则从人眼视觉系统出发,计算不同块在感知模型中的价值,将更多码率分配给人眼更具注意力的区域。

我们有一篇CCFA类论文介绍码率控制方面的优化:

An Exploration of Lookahead in Frame Bit Allocation and Slice Type Decision,

10.1109/TIP. 2018.2887200 , Zhenyu Liu, Member, IEEE, LiboWang, Xiaobo, Li, and Xiangyang Ji, Member, IEEE

640?wx_fmt=png

在编码工具上,S265对传统的场景切换检测,帧类型决策,SAO,DEBLOCK, 两遍编码,RDOQ等编码工具算法做了改进,并实现了长期参考帧等一批编码工具。

智能码控是淘系自研的码率控制算法,普通ABR或CBR码率控制为了追求目标码率,在低复杂度场景浪费了大量码率,根据人眼主观质量模型,当psnr高于一定阈值后,再提高质量,人眼无法察觉,只会消耗过多码字。我们使用机器学习方法,根据17种历史编码信息和待编码帧的复杂度,预估出待编码帧在质量阈值以上的量化系数,并限定在ABR目标码率以下,确保每个帧都能以最合适的码率编码。

640?wx_fmt=png

经过淘宝直播线上验证,可达到15%的省流,在钉钉直播中使用更是节省了52%的带宽并降低了62%的推流侧卡顿。

由于当前淘宝直播种类的丰富性,各种场景下的纹理,光照,背景,运动程度都是不一样的。户外主播经常走动,画面帧变化幅度频率高。美妆主播大多坐在室内,光照基本上比较偏亮。珠宝类主播主要是拍摄物品,画面多静止不动。单一的编码器配置并不能满足当前淘宝直播的需求,如何针对内容选择最佳参数成为业界研究的方向。

640?wx_fmt=png

在此需求下,我们提出了基于不同场景的编码参数配置策略。首先,我们通过多个深度学习与机器学习模型对数万条各种内容的直播视频进行了数据训练分类,使用大规模服务器集进行最佳编码参数搜索,自动化高效地搜索到适合当前视频编码的最佳编码参数组合,在提升画质的同时能尽可能地减少码率消耗。并最终根据编码参数集进行聚类分为多个参数配置项。通过此方法,我们在淘宝直播里面获得了7-10%的BDrate收益,在淘拍生产中获得了大于10%的BDrate收益。

编码速度优化,实现全量H265

在速度方面,s265添加了快速算法与工程两个层次上的优化。

HEVC可以将图像块从64x64划分到4x4,同时块的类型模式激增,备选的编码模式数量是h264的数倍,块划分及模式决策因此成为一个重要的瓶颈。 s265从参考块及画面纹理获取先验信息, 通过层级预判,提前跳出算法以及CNN模型辅助决策三步,减少了很大比例的计算量。

640?wx_fmt=png

我们把CU划分决策模块分成两个步骤,一是纹理强度决策,通过计算CU的纹理梯度来判别平坦块和复杂块,如果是平坦块就直接退出,如果是复杂块就继续向下划分。第一步可以解决大部分划分决策问题,但是对于模棱两可的块,则需要依靠CNN模型来辅助划分。

我们使用了一个5层网络的小模型把决策的准确度从72%提升到了96%;

640?wx_fmt=png

这个成果我们在 DCC会议上有相关介绍:

Enhance the HEVC Fast Intra CU Mode Decision Based on Convolutional Neural Network by Corner Power Estimation

Liangliang Chang†, Zhenyu Liu⋆, Libo Wang ‡, Xiaobo Li ‡ , 2018 Data Compression Conferen ce

我们知道,RDO包含两个变量,一个是失真,另一个是码率;

失真的计算是对原图和重建图像求误差的平方和,也就会SSE。这里首先要得到重建图像,这是一个相对漫长的计算过程,需要经过运动估计,变换,量化,反变换,反量化,重建等步骤,计算量相当大。

我们注意到DCT变换具有能量不变性,可以在变换后的频域中直接计算失真。这样就可以把后面的反变换,反量化,重建,SSE等过程Bypass掉,节省大量计算。通过此方法,可将整个失真估计模块的速度提升1倍,而bd-psnr损失只有0.023db。

640?wx_fmt=png

RDO的另一个部分是码率。

H265在量化后会将残差系数分成4x4的sub-block,每个子块包含16个系数一起编码,编码内容包含两个部分,一是系数分布的描述,包括SCF,GTR1,GTR2,对这个部分,我们建立起统计信息的线性估计模型,根据系数特征估算其大小;另一个部分是非零系数的哥伦布码字,每个码字的阶数k是不一致的,这里我们假设每个码字都采用最佳k阶编码,再根据最大码字的分布,给予一个拖尾系数补偿。

通过这项技术,可将码率估计模块加速35.6%,而bd-psnr损失只有0.057db。

640?wx_fmt=png

AZB (All zero block)是全零块的简称。

通过帧内帧间预测后,失真非常小的块再经过量化残差系数为0,但事先并不知道量化后系数为全0,还是会经过复杂的RDO计算;

有没有办法事先判决它是全零块?答案是可以,根据率失真理论,失真与Q的平方成正比,可以在预测后用SATD估算失真,当其小于一定阈值后就可以判别为全零块。

640?wx_fmt=png

运动搜索是从参考帧寻找最佳匹配块的过程,包含整像素搜索和分像素搜索,分像素需要做7抽头或8抽头插值滤波,计算量大;整像素搜索已经有比较多的快速算法,但分像素搜索一直没有什么好的方法。在图中矩形的整像素周围,分布着60个分像素点,我们建立二元二次误差平面方程,用9个整像素点来的预测误差来求解方程的5个系数,再对方程求偏导,可得到最佳分像素点的位置。只需计算1个1/4像素点,避免其余59个分像素点的计算;

640?wx_fmt=png

讲完运动搜索我们来看一下帧内预测,帧内预测利用当前块相邻的上面一行和左边一列来预测当前块的像素值;

H265有35种帧内预测模式,其中有33种角度预测,如果对这33都做计算的话代价非常大。

我们采用采用基于贝叶斯模型的快速决策方法,先计算10,18,26三个方向的代价,通过这3个方向的代价分布决策出最优角度是横向还是竖向,这里就直接把计算量减少一半,再用常规的快速算法5步法对剩下的17种方向进行计算,得到最佳预测角度。

通过这个方法,我们把33个角度计算减少到9次,提高了该模块300%的计算速度。

640?wx_fmt=png

在rdo之外,我们还改进了slicetype决策算法,动态拉格朗日因子调整算法,快速deblock和sao决策等。

在工程优化方面我们也添加了多项优化, 首先是C函数优化,我们通过优化流程逻辑,拆分特殊路径,合并分支,查表,循环优化等方法给rdoq模块,系数解析,deblock等模块带来了接近一倍的提升;其次针对密集计算的函数我们simd化并优化汇编代码的执行速度。

在移动端设备上,我们还为S265编写了大量armv7和arm64 汇编代码,相比C版本有至少1倍的提速,在低端手机iphone 6S上实现了720P 30帧每秒的实时编码。

低时延编码,画质不降提升互动能力

在直播中,低时延意味着沟通高效率和高体验,降延时意义重大。在直播端到端延迟中,编码延迟占了很大比重。但是编码延时与与压缩效率是一对矛盾体,延时越低压缩效率也随之下降,经过我们对X264,X265的测试,在低延时(300ms)模式下,编码效率比不限定延时降低30%,在零延时模式下,编码效率比不限定延时降低50%以上。

640?wx_fmt=png640?wx_fmt=png

为了提升低延时和零延时模式下的编码效率,我们采取了以下手段来优化:

  1. Cu-tree的前向短距传播技术:s265通过对缓存长度建模,得到缓存长度-时域传递关系模型,可以实现很短的缓存,仍然保留长缓存带来的质量优势。测试结果lookahead4优化后比优化前可以节省13.5%的码率,有效的降低了编码延迟,结果示意图如下。

    640?wx_fmt=png

  2. Cu-tree后向传播技术:在零延时模式下,我们没有前向参考帧可用,但可以借用后向帧来预测传播代价,通过与短距传播类似的技术来提升压缩效率。

  3. GPB技术:在零延时模式下由于没有后向参考帧,传统B帧已不可用,此时可采用GPB来代替,提高压缩效率

    640?wx_fmt=png

  4. WPP并行:帧级并行可以极大提高并行效率但会增加延时,帧内并行的wpp技术,不仅可以充分利用多核cpu的优势,而且可做到零延时。

    640?wx_fmt=png

经过以上多种方法结合,我们S265的低延时(300ms)模式对比不限定延时,压缩效率仅降低4%,零延时模式下压缩效率仅降低15%;

高性能解码器,解决客户端兼容性问题

解码面临的最大问题是兼容性和性能,要解决这里两个问题,首先需要做硬解码适配,我们将android,ios硬解h265的支持率提高到了95%和75%,剩下的5%和25%怎么办?还有web端完全不支持硬解,怎么办?

这就依赖于我们高性能的解码器;

我们开发了极致优化的h.265软解码器,手工编写汇编代码2.5万行,将解码速度提升到ffmpeg的240%,1Mbps 720p h265在小米5手机上解码速度>240fps,CPU占比控制在20%以下。

640?wx_fmt=png

许多人觉得优化只是写写c和汇编这么简单,但实际上需要对计算机的体系结构非常了解。

举一个例子,这是一个block的滤波计算,经过SIMD优化后提高了3倍的速度;

但是我们通过内存对齐加载,计算合并,CacheMiss优化,数据预取,多核并行,分支优化,寄存器优化,延迟槽优化,最终达到63倍的提速;

总结

淘宝直播全面使用S265,实现了画质不降,码率下降超过50%,直接带来带宽成本的下降,同时,卡顿率、秒开数据也因此优化,卡顿vv下降了25%,秒开率绝对值提升了1%。

带宽压缩是编码器一贯追求,S265除了服务淘宝直播之外,还覆盖阿里视频生态中直播、点播、会议各个业务,节省大量带宽成本。

  1. 优酷长视频点播,上线S265带来了大量的码率节省,目前S265生产的视频每日播放vv超过1亿次。S265还为优酷提供10bit HDR功能支持;

  2. 阿里云MTS转码,S265在速度和画质不变的前提下,降低MTS短视频转码码率,并赋能RTC实时通信业务;

  3. 钉钉会议和群直播,S265对比open264 scc模式可以进一步降低一半码率;

下一代压缩标准VVC(H.266)已经公布,我们也已经如火如荼的投入到VVC编码器的建设中。预期在下一年双十一将有基于VVC的自研编码器上线,再次降低40%的带宽成本,届时大家可以欣赏到更低码率,更高质量的直播画质。

✿    拓展阅读

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=png

作者| 淘系音视频技术团队

编辑| 橙子君

出品| 阿里巴巴新零售淘系技术

640?wx_fmt=jpeg

640?wx_fmt=png


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK