编者按:视频转码是视频相关范畴中最重要的业务,需求耗费许多的算力。转码有解码和编码两个阶段,在编码中,运动矢量核算是耗费CPU算力最多的部分,因而要考虑怎么削减许多的核算并进步图画质量。LiveVideoStack邀请到了英特尔的谢义老师,为咱们介绍根据运动矢量重用的转码优化。

文/谢义

整理/LiveVideoStack

咱们好!我是谢义,来自英特尔亚太研制有限公司。咱们团队首要负责根据至强服务器的软件优化工作,而服务器端的视频转码服务是咱们重点重视的范畴。英特尔奉行的原则是“水利万物而不争”,咱们的初衷是协助合作厂商在英特尔服务器上获取最佳的视频转码功能。

根据客户实在需求,定制下一代CPU是咱们的工作之一,咱们挑选做视频转码的另一个原因,是为了规划更好满意音视频范畴需求的下一代硬件。所以今日还会给咱们介绍下一代CPU中关于编解码的特别指令,这些特别指令能够加快编码功率。

基于运动矢量重用的转码优化

今日,我共享的内容分为三个章节。首要,运用英特尔丰厚的东西链对视频转码进行剖析。咱们作为硬件厂商,自身不做音视频转码业务,但俗话说“弄斧要到班门”,所以咱们首要对视频转码的一些典型场景进行了微架构层面的剖析,为后边的优化做好衬托。然后,介绍方案的核心思维,即怎么重用一次编码的信息来进步二次编码的功率。之前说到,核算复杂度在转码里占了很大的本钱,所以要从源头上降低核算复杂度。最终,介绍SIMD指令集。SIMD的全称是Single Instruction Multiple Data,意思是单指令多数据,表明一条指令能够一起操作多个数据。

01 视频转码剖析

首要,咱们对视频转码进行剖析。

基于运动矢量重用的转码优化

咱们从相关市场获取了图中的数据。第一张图表明在2020年,视频数据在互联网数据占比70%。到现在,视频数据在互联网数据占比已超越80%。第二张图是PRC Video Cloud Market Forecast,图中呈添加趋势。尽管目前共有云市场的增速减缓,可是视频云的添加仍有很大潜力。回到转码自身,第三张图和第四张图来自Video Developer report。从第四张图能够看到,在2019年,H.264仍是干流视频编码技能,90%以上仍运用H.264。其次,较多运用的是H.265,然后是VP9和AV1,H.265也在逐渐成为一种趋势。第三张图表明视频编码器开发人员计划在2022年投入的状况。其中,投入最多的是H.265,然后是AV1,再然后是H.266,这三个协议正在成为干流编码器协议,咱们后续将根据这些干流编码器进行开发。

基于运动矢量重用的转码优化

接下来进行直播本钱剖析。这是一张直播的结构图,主播上传内容到上行CDN,然后再发送到转码中心进行内容识别、截屏、录制和转码,接着再分发到下行CDN。这个过程中,本钱最大的是网络带宽和转码服务器。之前说到,网络带宽取决于观看人数和码率。举个比方,观看2M的视频和观看500K的视频所需的网络带宽不同,1000个人一起观看视频和10个人一起观看视频所需的网络带宽也不同。转码服务取决于分辨率、码率和视频编码标准等。

基于运动矢量重用的转码优化

咱们对头部的互联网厂商进行了剖析。如第一张图所示,首要有两个本钱,一个是Traffic price,即带宽本钱,另一个是转码本钱。第二张图表明直播一小时内,转码和带宽的份额,图的横轴是观看人数,纵轴是转码和带宽费用的份额。能够看到,当观众数大于等于50时,带宽成为首要的本钱。举个比方,顶级流量主播的一场直播的带宽本钱要几百万,此刻转码本钱只要几千块,相对带宽本钱几乎能够疏忽。但关于数量众多的小主播来讲,观众数可能只要十几个,此刻的带宽较低,所以转码本钱成为首要的本钱。针对这两种状况,在带宽本钱较大时,咱们以优化带宽为主,在转码本钱较大时,咱们以优化转码速度/转码功能为主。

基于运动矢量重用的转码优化

接下来,介绍几款好用的英特尔的东西。首要是V-Tune,是一个能够快速发现应用程序瓶颈的可视化的东西。左下图展示了一个比方,能够看到,咱们能够知道转码里每个函数占用的CPU时刻,双击就可进入code,准确定位哪行code的占比较高,所以能够清楚地知道热点函数在哪里。咱们支撑CPU、GPU和FPGA,也支撑多语言和多操作体系。V-Tune的优点是直观,缺点是会为体系带来一定的负担。

另一个东西是Emon,其用于low-level层面的数据抓取。Emon的优点是能够直接抓取Performance Monitoring Units(PMUs),即寄存器的值,因而功率耗费较少。调查右上图,能够知道CPU的运用率、AVX指令集的运用份额,也能够知道该函数是Backend_Bound仍是Frontend_Bound。因而,能够清楚知道体系的问题在哪里。

基于运动矢量重用的转码优化

运用刚才介绍的东西,能够估量转码耗费的算力。能够看到,在某一个转码场景里,编码过程中的运动估量(Motion Estimation)占比超越40%,但不同的场景状况有所不同,举个比方,将8K的数据转换成360P的数据时,解码耗费的算力大于转码耗费的算力。在大部分状况下,若考虑帧决策等,运动估量的占比将超越50%,因而这成为了咱们重视的热点。

02重用运动矢量等信息进步转码功率和质量

接下来,介绍方案的核心思维。

基于运动矢量重用的转码优化

咱们现在考虑转码,比方将H.264或H.265转换成H.266或AV1。在一次编码时,咱们能够获得slice type、mb qp和mb partition等信息。在现在的编解码方法中,解码之后这些信息就会被舍弃。而咱们的核心思维是,在二次编码中重用一次编码的信息。通过粗略核算,在大部分场景下,重用一次编码信息能够削减大约67%的运算量。

关于这种思路,咱们可能有许多问题。比方,当帧率或分辨率在转码前后发生变化时,会不会呈现一些新的问题。因而,尽管方案的原理比较直接,但实践应用时需求解决许多“并发症”。特别是,咱们要考虑怎么一方面进步转码速度,另一方面保证转码质量,否则转码质量不好,即便转码速度很快,也不能投入实用。

基于运动矢量重用的转码优化

举个比方阐明怎么重用一次编码的信息来进步视频质量。JND是一种感知编码技能,在左上的图中,四个block中只要左下的block的值为1,其余block的值为0。但关于人眼来说,能够疏忽数值1,即四个block的值能够都为0。这是JND的核心思维:过滤人眼感受不到的信息。对此,经典的方法是运用双方滤波器等进行过滤,但这些方法都是无差别的滤波,简单造成“误伤”。而现在由于把握一次编码信息,咱们知道哪些信息能够被平滑,哪些信息有必要保存,通过设置权重的方法来进行“区别对待”。这样做能够带来两个优点,一是能够进步片面视觉的质量,二是在限定码率的状况下,能够将码率用在刀刃上,大幅度地进步客观质量。比方,将一个原码率是50Mbps的视频转码为2Mbps的视频,采用咱们的方法就能够较大地进步质量。

基于运动矢量重用的转码优化

另一种方法是运用一次编码的残差。在H.264和H.265里,有two-path的算法,但这个算法一般不被运用。这是由于,尽管通过一次编码能够把握大约的信息,而且在此基础上二次编码的成果更精准,编码质量更高且码率更低,可是这会大幅度地添加核算量,推高转码本钱和延迟。为了解决这个问题,咱们直接重用一次编码的信息来实现相似二次编码的效果。

03SIMD指令集加快转码热点函数

最终,介绍怎么用SIMD指令集加快转码热点函数。

至强服务器渠道SIMD指令集经迭代了许多代,咱们比较熟知的比方AVX2,AVX512等。第二代至强可扩展渠道在AVX512的基础上支撑了INT8数据精度,第三代支撑BF16指令集,2023年初量产的第四代渠道的AI功能在BF16和INT8上较上一代进步了8倍,其中加入了AMX 指令集,也能够理解为在CPU内部有一块硬件加快器。比方INT8的算力,一颗CPU的功能挨近200T,许多曾经在CPU上无法完结的运算现在都成为可能。

基于运动矢量重用的转码优化

最终介绍一个比方,阐明怎么运用SIMD指令集优化视频编码。在H.264中有一个巨细为1616的宏块,需求对其求和或平方和,那么怎么用avx512对其进行加快呢?需求履行以下几步。首要,将16个int8的数据载入到mm128寄存器中。然后,将int8数据转换成int32,这是由于有时候运算成果为负数,而int8无法表明负数。接着,将16个int32数据水平相加,这需求耗费0.5个指令周期,而手动核算则需求8次核算,因而极大地进步了功率。最终,将16个int32平方后再水平相加。通过这样的处理,功能可进步16倍或8倍(若为一条指令则进步16倍,若为两条指令则进步8倍)。

我今日的共享到此结束,谢谢咱们!