Video Compression

Video Compression Tech in Teams

讲视频压缩技术

视频压缩的必要性

一个视频一秒钟不压缩的内存是 710 MB,相当于带宽需要 710 Mbps,编码之后的带宽是 2-10 Mbps,视频压缩的目的就是可以用尽量少的带宽,传送更高质量的图像

YUV420: 表示有 YUV 三个分量,每个像素有一个亮度分量,有 1/4 个 U 分量和 1/4 个 V 分量

image.png

视频压缩技术

image.png

  1. 带宽有限的情况下,对运动的图像 (high motion, people video) 分辨率降低,对静态的图像 (low motion, vbss share ppt) 帧率降低,最低 1.75
  2. 给调整过后的图像编码,编成更少的带宽,在接收端再解码
  3. Encoder 都是基于块的
    1. Devide, 把一个图像分为一些大小相等的块,比如说 H264 里面宏块的大小就是 16x16,但是 H265 里面就变成了 64x64,就可以适用于更大的图像比如 4K 之类的
    2. Prediction, 把块拿出来之后就会进行一个预测,分为帧内预测,也有可能是帧间预测,把预测块和当前的块一减就会得到一个差值,这个差就会更小
    3. Transform/Quantization, 把这个差经过变换和量化的技术,起到了压缩的目的
  4. Decoder 这边是相反的,先解码,然后反量化,反变换,再根据编码传过来的预测信息重建预测块,就把这个图像复原了。复原以后,因为他在量化或者预测的过程中可能会失真,引起一些块效应。所以再最后解码的部分他又加上了 deblocking 这个滤波,然后 H265 里面他又加上了 SAO 这种算法,为了这个图像主观看上去更好一些

image.png

H264或者H265 他们都有 I/B/P 帧,把图像分为 GOP ( group of pictures),在一个 GOP 里面会有一些头信息,然后再加上 IDR 帧,P 帧只能向前参考,只能参考它前面的帧,B 帧前后的帧都可以参考。因为我们 Teams 是实时的,所以一般不用 B 帧,只用 P 帧,都是 I P P P P 这样的

  • 帧内预测:IDR 只能用帧内预测,去除了本帧的一些冗余,靠的是帧里边自己的这些像素来计算的,跟其他的帧没有关系,自己就能解。比如说云朵这一块的图像,就是把挨它最近的这些像素块都拿出来,通过水平预测等方式(跟水平的像素块相减得到残差),只需要编码这个残差就好
  • 帧间预测:对于一个运动的图像,汽车就是往前平行移动的,如果要编码第二个块,可以去第一个块里找比较接近的,找到了把位置信息和他俩相减的一个差,把这个差值传过去编码就可以了

帧内预测和帧间预测都是在时域上的,然后把得到的残差块,继续去做频域上的压缩

image.png

通过 DCT(离散余弦变化)就可以把时域的信息转化到频域上来,因为转化了之后重要的信息都会分布在低频分量上。比如图一图二图三,就是把64个绿色方块,变成9个低频分量和1个低频分量的绿色方块,虽然有失真明显,但还是能得到一个跟原图差不多的图像,通过反变换就能还原回去。但是如果像图四只保留了高频分量,而把最重要的低频分量丢掉了,图像就会变得面无全非。我们把预测之后的残差,经过 DCT 变换之后,能量也是集中在低频分量区域,再去编码的话就更节省码流了

量化就是把更大的数,变化成一些更小的数,就是图上的 QP=1 到 QP=4,简单理解为除,就可以得到更多为零的值了。带来的就是会有些失真,一个图像的失真主要就是量化这部分引入的。带宽也和 QP 有直接的关系。比如如果你带宽低的情况下,想要编码器输出一个匹配画质的图像,那你就直接告诉编码器给一个大一点的 QP,来实现控制图像质量失真情况。QP 越大,视频主观质量就没那么好

image.png

变换和量化之后,并不是就这样直接发出去,还要经过一个变长的编码。原理是给一些概率更高的值,给他们一些更短的 code,用一个更短的数来表示它,给概率更低的值,给一个更长的值。比如说有熵编码,霍夫曼编码,算术编码,在 264 里对于分辨率高一点的都用算术编码(arithmetic coding)来实现,因为复杂性比较高,压缩率比较高,用硬件实现的话收益就比较大。编码带来的压缩率就是 1/2 或者 1/4,也不会引入失真,因为这个过程是可逆的

image.png

如果在量化过程中失真比较大,QP 值比较大,就会引入失真,产生左图的块效应。通过 deblocking 去块效应的滤波器,来判断是不是图像的边界,如果不是图像的边界,仅仅是量化引起的话,就给周围的像素取个平均,能让图像看起来柔和一些

Teams 当中的运用

image.png

目前 H264 占 90%,AV1 压缩率要更高,但复杂性也更高,在 mobile 上用不太合适,一般不用做 encoder,而是用来解编码 vbss 的时候用。我们 team 在做的就是看怎么样用更多的 hardware codec 来做编解码,这样就可以省电,让续航变长。接下来会继续做 H265,AV1,ML codec