本文整理自RTC大会,陈悦的演讲《下一代开放视频编码标准AV1》。
陈悦
谷歌 Chrome Media 视频编码软件工程师
负责开发新一代开源视频压缩算法AV1。清华电子本科,加州大学圣塔芭芭拉分校电子与计算机工程博士。研究方向为视频编码和通信。
在讲AV细节之前,我先讲一讲为什么google要去做开源的视频编码器。历史上来讲,二十年前,视频业务很局限,基本只存在于电视广播、DVD等,所以视频压缩标准比较单一化。但是现在大家知道在互联网时代,带宽、各种网络条件的一直变好,所以视频方面应用变得越来越多。随着视频业务在互联网上面的多元化,近几年各种应用都呈现井喷的趋势,所以提供视频应用的公司或者提供者,他们的背景、需求变得越来越不一样。有的人希望编码器就是要稳定、单一、标准化。有的人希望编码器可以很快的适应他们应用的需求。也有人希望编码器免费。这就是为什么google觉得在单一的国际化标准之外,市场还需要一些多元化产品。
第二,google一直以来有一个信念,互联网应用的基础技术应该是免费的、开放的。举个例子,除了编码器以外,Chrome是免费的,Android系统是免费的,Google一直在做这样开源的事,不想从基础应用上赚钱。具体到编码器,因为是免费的,我们不需要花费时间去讨论关于授权费、使用费以及收益分割的时间等问题,所以这个产品的迭代更新会非常快。
在2013年6月,我们发布了一个编码器——VP9。首先,VP9是免费的。其次,将最好的H.264和最好的VP9比,VP9的性能有40%到50%的提升,性能是指码率的减少。VP9在更快的适应市场,VP9支持除了8比特以外更高的像素精度,比如10比特和12比特的视频内容。除了支持最基础的YUV420格式以外,还支持其他的YUV格式,比如YUV 444,它经常被应用在电视上。
接下来讲一讲市场,现在有数十亿的终端支持VP9的解码。具体到产品上,浏览器方面,Chrome、Firefox、Edge、Opera都支持VP9,手机方Android4.4(Kk)以上的版本也是支持VP9解码。另外,在一些家庭娱乐设施上,比如电视,尤其是超高清的4K电视,以及电视盒子、电视棒、游戏机上,VP9也有广泛的支持。
VP9现在在美国市场上的第一个用户,也是现在最大的用户就是youtube,google的视频分享网站。在VP9被投入使用的第一年,youtube上用VP9编码的视频总共播放时长是25亿个小时。到现在为止,每天youtube的用户会看20亿次的基于VP9编码的视频。所以除了给youtube每年省下很大数额的带宽费用之外,它给youtube业务也带来很多好处,比如说延迟的问题,引入了VP9后延迟减少了15%。缓冲的性能,在发达国家提高了25%,在发展中国家提高了100%。在高清内容播放上,发展中的市场,高清内容的播放时间也被提高了25%。
上面这张图,颜色越深,代表在Youtube上,VP9的播放时间比H.264越多。
另外除了youtube之外的应用,除了视频点播这块,youtube大部分的直播、Google Play的电视和直播,Netflix的直播也基于VP9。但是,在实时通信领域,VP9做的还不够,与Youtube的点播业务占主导有关。
接下来,开始讲AV1。先讲一下AV1的背景,做AV1的组织叫Alliance for Open Media,开放视频联盟。大概是从2015年9月份开始做AV1。AV1从字面上来说,就是AOMedia联盟做的第一代视频编码器。AV1董事会对AV1的定义和期待是,AV1是一个开放的、协同开发的编码器。另外它是适应互联网和不同的设备,经过带宽优化的编码器,并且在解码的时候复杂度需要比较低。还有就是因为需要产业化,所以AV1必须很快成为稳定、高效的、实时解码的编码器。
这是AOMedia联盟的主要成员,一共有32家,上图没有全部列出。分两个阵营,第一个阵营是有视频服务的IT公司,比如google、Netflix,另外一个阵营是传统做半导体、芯片的公司,比如一直在跟进我们的有NVIDIA、ARM、Intel等等。
AV1具体的目标是,与VP9和HEVE相比,码率需要大幅度降低,目标是减少30%左右。解码是比较低的复杂度,目标大概是VP9的两倍。另外AV1也做了很多对屏幕图象内容的优化,比如说我们做了调色板。在开发的时候,各个公司会提出不同的新的算法加到这里面,新的算法必须可以跟其他的算法能够协同一起兼容的。
AV1最开始做的时候是把好几个开源视频编码器里面的优秀算法给整合到了一起,算法主要取自于VP9和VP9的优化版本,另外也有Mozilla和Cisco的一些算法。每次我们提交一个新的算法,首先我们会与AV1的硬件工作组沟通,看硬件商可不可以实现。接下来,算法会交到主要的工作组去审核,由这个组决定要不要采纳这个新算法。另外也有测试组去测性能提升情况。所有新算法都会经过知识产权组的审核。现在,好几十个新的算法已经被加到AV1里面,较VP9性能也是的高了很大的提升。
在市场方面,youtube会在第一时间使用AV1,它会是第一个用户。Netflix也表示会尽早使用AV1。AV1工作组近期也一直在开发测试工具以及软件的优化,这样可以更快的推进AV1的产业化。
现在是技术细节。我大概简略讲一讲AV1的新算法,包括:预测算法、变换算法、后处理图象修复算法等。
先讲一讲AV1的预测块是怎么分的。VP9和HEVC的分块方法都是从64x64的块开始分,在每个节点上,有4种分法,最小的分到到4x4。因为想对超高清视频有更好的支持,所以AV1是从128x128开始分,每个节点的分块方法增加到十种,除了原来四种,加了四个T字型和两个细分的窄条分法。做视频硬件特别讨厌小块的东西,所以在VP9的时候,硬件厂商觉得如果分的太小的,在缓存相邻块的信息时,以及做小的变换的时候,硬件会很累,所以VP9其实对小于8x8的块是做了很多模式选择的限制,比如一个8x8如果分成4个4x4,这些4x4的块必须用同一个参考帧,同时要用帧内预测或者帧间预测。AV1现在小于8乘8的块可以灵活的选择变换模式和预测模式,这个带来的好处是大幅度的性能提升,代码库变得非常简单,维护起来也变得非常简单。因为这个变化我们删掉了十万行代码。
接着,讲一讲参考帧的结构。VP9编解码器可以缓存8个参考帧,对当前帧,可以从8个参考帧里选3个出来,具体到每个小块可以从三个帧当中选择一帧或者两帧做参考。选完帧之后,可以对每一个帧去指定一个运动向量,如果它是选择两帧,最后的预测块会是两个普通预测块的平均值。
帧内预测, VP9支持基于8个方向的外插值。AV1是基于原来的8个方向,中间加了一些delta,现在有56个方向。
除了基于一定方向的插值之外,AV1也支持从参考象素的相对位置处,选一个最精确的象素直接copy过来。
调色板模式是专门针对屏幕图像内容做的。会先传一个调色板过去,调色板里面大概有7、8个颜色,在帧内预测时所有的象素都从这7、8个颜色里选。我们在传调色板的时候基于相邻块和之前的颜色做的差分编码。与之前标准不同的是,AV1的调色板模式是附加在帧内预测,它不受编码器的参数控制的。
这是Mozilla的提案,中心思想是AV1可以从量度的块直接预测出色度的块,预测模型是参数化的,所以在编码器会把参数搜索出来直接传给解码器。
这是帧间预测,讲一下参考帧的变化。AV1还是缓存8个参考帧,但是当前帧可以用到里面的7帧。
参考帧之外说一下运动向量。VP9在做运动向量预测时,当前的块之外,会在上面和左右在扫一层,也就是它的邻居,把它邻居的运动向量也会加到参考列表里面,两个参考向量。扫的方法是固定的,谁先扫到谁先进去。
AV1做的时候是这样,首先是参考列表可以支持4个参考向量,编码的时候会根据列表长度自适应。在建立参考列表时,扫完之后会根据概率模型,把概率比较高的往前面放。这是AV1的运动向量的预测算法。
如果是做双帧预测,并不会简单的把两个列表给拼起来。现在就讲一讲我们怎么去做双帧预测。VP9就是拿两个预测块做一下平均。AV1不会再做平均了,另外它支持做传统的双帧预测,两个都是帧间预测;也可以支持联合帧间和帧内预测。
这就是大概的流程,左边是根据传过来的两个预测模式生成两个预测块,P1、P2。我们加一个根据位置设的滤波器,在每个位置上P1、P2会有两个不同的权重。双帧帧间预测和联合帧间帧内预测都会用到。
首先说一下双帧帧间预测。它更适合图形分割不同的物体在一个块里面的情况。如果P1和P2在某个位置上差值比较大,我们在做权重的时候,会倾向于有一个P1或P2占比较多的权重,值会比较接近其中某一个值,如果它们差不多我们就做比较平滑的滤波。这样就整个块不会被平滑的太厉害。
这是基于几何分割的双帧预测。基于矩形分割的编码器,一般都没有办法很好的去处理物体的边缘。AV1支持把普通的矩形预测块分成两个先行块,每个块去应用一个预测方法。把边缘做了平滑滤波,把两个边缘的部分两个预测块给平滑的结合在一起。
这是我们给几何分割做半平滑滤波时,会用到的lookup table。这些都是64x64的块,根据图象大小以及分割在哪里,AV1可以很快的找到权重二维矩阵。
基本上来讲,对基本不同块的大小,我们支持大概32个分割的方法。
联合的帧内帧间预测,做它的目的是离上面的块和左边的块比较近的象素,它其实可以从上面块和左边的块得到很好的预测,不是非得用帧间预测。这就是为什么联合的预测方法结合了比较普通的帧间预测块和四种比较常见的高频帧内预测方法。
除了普通的一块一块的预测之外,还会做块间交叠的运动补偿。普通做法是每块传1-2个向量,这个块的预测就基于这1-2个向量。AV1除了基于这1-2个向量,还会基于周围块的运动向量,生成各种不同版本的预测,在离块比较近的地方做平滑滤波,这样就能更大限度的很好利用整个帧的运动向量场。
再讲一下基于仿射变换的运动补偿。现状视频质量越来越高,如果直接用二维表示运动向量很困难,也不准,最后的结果是中间块化效应会非常强。在AV1里面,我们提出了两种解决方案,一种是算全局的仿射变换的模型,直接传给解码器。另一种是自适应的去预测仿射变换模型,用于局部。
在我们知道这个模型之后,AV1是怎么去做这个变换呢。传统的仿射变换是一个3x3、自由度为8的矩阵。这样的结果就是,由于编码器是由一个块一个块做,所以,面向一个自由度特别高的矩阵,每一个像素最后被投射到的地方分布会很不规则,做向量化、硬件优化很困难。
AV1的方案是限制自由度变为 4,只支持平移、旋转、zoom in、zoom out,并且旋转、zoom in、zoom out也做了一些限制。AV1所有仿射变化都会被分解成两步,很容易向量化。第一步是水平拉伸,第二步是垂直拉伸,通过这两步可以很容易的把一个正方形变成一个璇转过的平行四边形。
现在讲一讲变换。首先是VP9支持的是离散余弦变换,在划分变换块的时是网格型的。AV1是自由划分,有比较好的适应特性。
DCD显然对于视频编码不够,所以我们还加入了ADST,非对称的离散正弦变换。它一开始是用在帧内预测上面,因为帧内预测是头上小后面大,AV1支持16种二维变换,每个维度是DCT、ADST、反过来的ADST和IDTX(不做变换)。IDTX是对屏幕图像内容效果特别好。VP9只支持正方形的变换,AV1支持了一些长方形的变换。
再讲一下图象恢复。在传统的编码器里面就是去块化效应的滤波器。上图就是整个流程。VP9中,整个帧都能用同一个块化滤波器的level,level是指要更平滑还是多保留一些高频向量。AV1的话,每个颜色的空间的level都是不一样的。另外,每个128x128的块的level也是不一样的。
最后就是一些小东西,熵编码, AV1开发复杂低,是基于CDF的熵编码。在做量化的时候,AV1也支持帧内可变的量化矩阵,以及帧内可变的量化极数。我们也做并行的功能,把整个frame分成很多块。在VR、AR中,用户往往只对其中一个块感兴趣,那我们可以很快找到对应的块进行解码。
最后,我们的测试平台是www.arewecompressedyet.com。对AV1感兴趣的同学,可以自己去测试。
http://www.itdks.com/dakashuo/playback/1191,查看大会视频回放。