1. AV1 视频编码标准介绍
AV1是开放媒体联盟(AOM, Alliance for Open Media)开发的第一代开放,免版税的视频编码标准。AV1于 2018 年 3 月定稿,相同画质下,码率比 H.265/HEVC 低 20% 左右。经过 Google、Netflix、Meta、Amazon 等互联网巨头的不断推广,目前 AV1 生态逐步发展成熟:PC 侧显卡供应商 AMD、 Intel 和 Nvidia 均已经发布支持 AV1 硬解的相关产品;移动端 MediaTek、 Qualcomm 和 Apple 的旗舰手机芯片都已经支持 AV1 硬解;软件解码器 dav1d 已经具备主流平台的实时解码能力[1]。2020年底 B 站开始自研 BILIAV1 编码器,2022年初开始在 PC 侧点播业务部署 AV1 编码,目前正在积极筹备 AV1 编码在直播业务上的应用。
2. AV1 标准的主要压缩技术
AV1 整体仍是混合编码技术框架的继续演进和优化,我们先简要介绍 AV1 标准的一些主要技术[2]。
- 块划分
AV1 中最大的块称为 superblock,其大小可以在 sequence header 中设置为128×128 或 64×64。通常只有在小分辨率或为了提升并行能力的情况下才配置为 64×64,否则配置为 128×128 以提升压缩效率。和 H.265/HEVC 一样,AV1 也使用了迭代块划分的设计。每个 2N×2N 块可以继续划分为 4 个 N×N 的小块,直到达到最小的块大小 4×4。以外,AV1 还支持一分为二的 rect 划分,一分为三的 ab 划分和一分为四的 h4 和 v4 划分,不过这些划分不允许被继续划分。
- 预测
帧内预测。除了继续优化传统帧内预测算法,比如更加精细的预测角度,更多的平滑预测模式(smooth intra prediction)等,AV1 还引入了迭代预测(recursive intra prediction)和跨分量预测(chroma from luma prediction,CFL)。此外, 新引入的调色板预测模式(color palette)和 帧内块拷贝(intra block copy)可以显著提升屏幕场景下的压缩性能。
帧间预测。AV1 最多支持 7 个帧间参考帧,每个帧间预测块可以从这 7 个参考帧中选择 1 个或 2 个作为参考帧(并不是所有的组合都是合法组合)以进行单向或双向预测。其中,单向预测模式时最多有三种 motion mode,分别是 translation、 obmc 和 local warp。除了常规的平均加权预测(Average Predictor)和基于参考帧距离的加权预测(Distance Weighted Predictor)外,AV1 还引入了基于两个参考块像素差的加权预测(Difference Weighted Predictor)和楔形模式(Wedge Mode)。
帧内帧间预测。该预测方式通过预设的权重模板把帧内预测值和帧间预测值逐点加权平均得到最后的预测值。其中,帧内预测只允许 DC、垂直、水平、平滑模式。AV1 tool off 测试表明,该模式平均有 0.7% 的码率收益。
- 变换
AV1 采用最大深度为 2 的递归搜索最优 transform size 的方案,标准允许的最大和最小transform size分别是 64×64 和 4×4。4 种 1-D 变换类型——DCT、 ADST(asymmetric discrete sine transform)、FLIPADST(flipped ADST)和IDTX(identity transform,transform skip),可以两两组合成16种 2-D 变换类型。不大于 32×32的块最多可以有 16 种2-D变换类型, 32×32 及以上只允许 DCT 和 IDTX。
- 环路滤波
AV1有三种环内滤波器,按照处理的先后顺序,分别为:
- Deblocking filter: 目标是去除块效应。
- CDEF(Constrained Directional Enhancement Filter): cdef 首先检测边缘方向,然后基于边缘方向做非线性滤波。可以认为 cdef 是一种“保边”滤波器。
- Loop Restoration Filter。该滤波器处理单元是 LRU(loop restoration units), LRU的大小由帧级别语法参数指定,可以是 64×64、 128×128或256×256。每个 LRU 可以有三种选择:Wiener Filter、 Self-Guided Filter 或不滤波。
3. BILIAV1自研之路
B 站早在 2020 年就开始关注 AV1 标准。当时 chrome 浏览器已经支持 AV1,但不支持 H.265/HEVC 。当AMD、 Intel、 Nvidia 纷纷推出支持 AV1 硬解的产品后,我们意识到 AV1 标准有极大概率会在网页端推广开来。
BILIAV1 项目开始于 2020年10 月份。当时开源的软件编码器主要有参考代码 Libaom 和 Intel 的 SVT-AV1。基于已有开源产品的二次开发可以节省大量基础组件的研发时间,是编码器比较稳妥的研发路线,但 B 站编码团队的研究发现,虽然 Libaom 和 SVT-AV1 都有明显的可以优化的空间,但其原始架构设计严重制约了许多优化技术的运用,因此,基于团队已有的技术积累,我们决定从零自研一款 AV1 编码器。
首先看一下我们 BILIAV1 的性能数据。横轴是编码速度(对数刻度),纵轴是 PSNR 维度的 BDRate,SVT-AV1 1.7.0 版本 preset 7 的结果作为 100% 速度和 100% 码率点。B 站视频以 UGC (User-generated Content)为主,对转码速度有较高要求,所以我们选择 SVT-AV1 1.7.0 相对较快的 preset 7 档位作为 anchor。BILIAV1 2.4.0 是我们最新发布的产品版本,目前使用 preset 4 作为点播档位。相同画质下:BILIAV1 2.4.0 preset 4 比 SVT-AV1 1.7.0 preset 7速度慢 36%,码率低 19.6%;BILIAV1 2.4.0 preset 4 比 SVT-AV1 1.7.0 preset 6 速度快 25%,码率低 12.4%。按照图2 的数据趋势,在 B 站点播档位,同画质同速度下, BILIAV1 2.4.0 码率比 SVT-AV1 1.7.0 低 15% 左右。BILIAV1 2.4.0 preset 0 是 B 站还在开发中的直播档位,与 SVT-AV1 1.7.0 preset 8 速度相当,但码率低17.3%。
编码器研发主要包括工程和算法两个方面。工程方面需要考虑的事情较为繁杂,例如:测试和trace 系统、并行设计、数据结构、内存利用、SIMD汇编等;算法方面主要有:码率分配/控制、标准算法实现、快速算法等。算法是编码器研发的核心,但工程是无疑是编码器研发的基础。BILIAV1 编码器从零研发,一开始就面对巨量的基础模块开发工作。以下通过几个例子来分享 BILIAV1 的研发历程。
3.1 TRACE系统
项目一开始,我们就整理了自研编码器研发经常会遇到的一些典型工程调试问题:
- 不一致问题:编解码不一致,debug/release 不一致, 多次测试结果不一致等
- memory 相关:memory leaks, stack buffer overflow, heap buffer overflow 等
某些问题的定位有时是特别困难的。比如自研编码器不可避免经常会遇到熵编码和熵解码不一致的问题,由于熵编码的上下文依赖,有时候并不能很快定位出问题的第一现场。特别是刚参与编解码的新手工程师,遇到这类问题经常觉得十分棘手。
解决问题的前提是发现问题,充分的测试是编码器高质量交付的基础。我们基于已有的测试框架快速搭建了 BILIAV1 的测试框架,具体的测试项有:编解码一致性测试、分辨率测试、tool 开关测试、debug/release 一致性测试、多线程一致性测试、AddressSanitizer 测试等。在研发前期,编码器速度较慢,高效的 case 无疑是可以快速迭代编码器的基础。以分辨率测试为例,遍历分辨率无疑是最充分的方案,但很明显也是最低效的方案。因此,我们只在发布重点版本才使用遍历方案,而对于 patch 测试,我们的测试分辨率只包括
- 非整数个 superblock 行/列和非整数个 LRU行/列: 以步长为 4 遍历 4×4 到 512×512 的分辨率
- 最大分辨率。
BILIAV1 TRACE系统:
- 关键模块的 log 信息,包括预分析cost, 运动搜索,分阶段 RDO cost 和决策结果,熵编码context和码流,码率控制参数更新等
- 线程调度信息
- 重要节点的像素值或 CRC
TRACE 可以帮助研发工程师快速定位问题,特别是对解决项目初期 的bug 帮助极大。
3.2 并行设计
AV1 压缩率的提升无疑需要更大的算力。现在 CPU 单核性能的提升越来越难,新编码器的算力需求往往需要借助多核并行才能满足。
预分析
主要包括 cutree、aq、 mctf。预分析计算基于原始像素进行,主要的计算有 intracost、 intercost、variance 等,均可帧级/slice级并行。
主编码器
帧间并行
参考帧结构:低 temporal layer 的帧要尽量避免使用高或者同 temporal layer 的帧做参考。BILIAV1限制:mini-GOP 内部只允许 temporal layer 小于当前帧 temporal layer 的帧做参考帧;mini-GOP 间,可以使用高 temporal layer 的帧做参考,但是参考帧的 temporal layer 最多不能超过当前帧 temporal layer + 1
帧间参考延迟:无论是行级别等待还是块级别等待,垂直方向的 search range 都直接影响帧并行能力。BILIAV1 借助预分析得到的运动矢量,自适应决策当前块的search range, 以在不影响压缩性能的前提下,最大化帧间并行能力。
需要特别指出的是:
- 对 AV1 的 deblocking filter、cdef、 loop restoration 使用帧级别的参数决策可以有 3% 左右的码率收益,但是编码 fps 下降较多,为了保证整体编码 fps 满足产品部署需求,此时可以通过 mini-GOP 间并行来提高编码速度。
- AV1 支持当前帧的熵编码初始概率来源于已经编码的某个帧。该工具有 1% 左右的码率收益,但需要等待被继承帧的熵编码结束才编码当前帧。因此,对帧并行有一定影响。有两种方法可以部分解决这个问题:1) 继承较远距离帧的熵编码概率,例如使用上个 mini-GOP 中已经编码结束的帧;2) 主编码器模式决策和熵编码使用不同的熵编码概率,这样当前帧模式决策部分就可以和被继承帧并行处理。
Superblock 并行
AV1 标准虽然并没有规定类似HEVC WPP这种并行编码方式,但仍然可以采用 WPP 这种方式来实现 Superblock 级别的并行编码,与 HEVC WPP 不同的是,AV1 Superblock 并行下,模式决策使用的熵编码概率只是实际熵编码概率的估计值,并不是实际的熵编码概率。
环内滤波并行
开启帧级别决策滤波参数时依次决策 deblocking filter、cdef 和loop restoration 的参数。此时,通过把一帧划分为多个 slice 的方式可以实现并行加速;
关闭帧级别决策滤波参数:在某一个 Superblock 行中,第 N 个 Superblock 模式决策结束,就依次启动 第 N 个superblock 的 deblocking filter,第 N – 1 个 Superblock 的 cdef ,第 N – 2 个 Superblock 的 loop restoration filter。
指令并行
BILIAV1 使用 SIMD intrinsics对耗时模块进行加速,对于比较复杂的模块又进一步使用 asm 汇编加速。例如:BILIAV1 使用 asm 汇编重新设计和实现了 transform type 和 transform size 部分的汇编,与 intrinsics 相比,asm 可以整体加速 10% 以上。
3.3 快速算法
快速算法是自研编码器的核心,几乎所有核心模块都需要高效的快速算法才能满足产品部署对编码速度的要求。这里重点介绍一下参考帧剪枝相关的快速算法。AV1 标准规定最多可以有7个帧间参考帧,并最多允许 28 种参考帧组合。与只使用最邻近参考帧相比,多参考帧带来的平均码率收益约为 4%。这里分享几个参考帧剪枝的快速算法:
- 基于已经尝试过的划分的较优参考帧,来剪枝当前划分的参考帧。例如:如果已考察过 SPLIT 划分,那么可以基于子块的较优参考帧剪枝当前块的参考帧;可以基于 NONE 划分的较优参考帧来剪枝非 NONE 划分的参考帧。
- 基于 MVC (motion vector candidate) satd/sad cost做参考帧剪枝。除了标准规定的那些 motion vector predictor 以外,此处的 MVC 还可以包括预分析得到的 motion vector, 已经尝试过的划分的 motion vector, history mv[3] 等。该算法会排除 mvc cost 较大的参考帧。
- 先做单向参考,接着只选用较好的单向参考帧来做双向参考。
- 基于预分析场景检测剪枝参考帧。如果某个参考帧和当前帧之间有场景切换,直接排除该参考帧; 如果没有场景切换,高 temporal layer 的帧只选择最邻近的参考帧和重建质量最高的参考帧。
4. 总结和展望
BILIAV1 是 B 站自研的性能优异的 AV1 编码器,目前已经上线 web侧点播转码。BILIAV1 2.4.0 较开源 SVT-AV1 1.7.0 编码器平均码率节省约 15%。随着 iPhone 开始支持 AV1硬解,可以预见未来几年 AV1 在移动端的部署量会逐步上升,B 站也会继续加大在 BILIAV1 上的投入,这里列出 BILIAV1 未来要进一步优化的点:
- 点播方面:开发更加高效的快速算法,以便在点播档位开启一些性能更好的工具。
- 直播方面:与点播相比,AV1 的直播部署更具有挑战性。随着点播档位的逐渐成熟,BILIAV1也会逐步加大在直播档位的应用。
5. 参考资料
[1] https://en.wikipedia.org/wiki/AV1
[2] J. Han et al., “A Technical Overview of AV1,” in Proceedings of the IEEE, vol. 109, no. 9, pp. 1435-1462, Sept. 2021, doi: 10.1109/JPROC.2021.3058584.
[3] L. Zhang et al., “History-Based Motion Vector Prediction in Versatile Video Coding,” 2019 Data Compression Conference (DCC), Snowbird, UT, USA, 2019, pp. 43-52, doi: 10.1109/DCC.2019.00012.
【作者信息】苏文艺:哔哩哔哩技术专家;梁俊辉:哔哩哔哩资深算法工程师;骆政屹:哔哩哔哩资深算法工程师;叶天晓:哔哩哔哩多媒体实验室负责人
来源:B站多媒体实验室 哔哩哔哩技术
原文:https://mp.weixin.qq.com/s/DQD3QaPZe9UcV1Xdh8rczw
版权声明:本文内容转自互联网,本文观点仅代表作者本人。本站仅提供信息存储空间服务,所有权归原作者所有。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至1393616908@qq.com 举报,一经查实,本站将立刻删除。