Video Compression Tech in Teams
讲视频压缩技术
视频压缩的必要性
一个视频一秒钟不压缩的内存是 710 MB,相当于带宽需要 710 Mbps,编码之后的带宽是 2-10 Mbps,视频压缩的目的就是可以用尽量少的带宽,传送更高质量的图像
YUV420: 表示有 YUV 三个分量,每个像素有一个亮度分量,有 1/4 个 U 分量和 1/4 个 V 分量
视频压缩技术
- 带宽有限的情况下,对运动的图像 (high motion, people video) 分辨率降低,对静态的图像 (low motion, vbss share ppt) 帧率降低,最低 1.75
- 给调整过后的图像编码,编成更少的带宽,在接收端再解码
- Encoder 都是基于块的
- Devide, 把一个图像分为一些大小相等的块,比如说 H264 里面宏块的大小就是 16x16,但是 H265 里面就变成了 64x64,就可以适用于更大的图像比如 4K 之类的
- Prediction, 把块拿出来之后就会进行一个预测,分为帧内预测,也有可能是帧间预测,把预测块和当前的块一减就会得到一个差值,这个差就会更小
- Transform/Quantization, 把这个差经过变换和量化的技术,起到了压缩的目的
- Decoder 这边是相反的,先解码,然后反量化,反变换,再根据编码传过来的预测信息重建预测块,就把这个图像复原了。复原以后,因为他在量化或者预测的过程中可能会失真,引起一些块效应。所以再最后解码的部分他又加上了 deblocking 这个滤波,然后 H265 里面他又加上了 SAO 这种算法,为了这个图像主观看上去更好一些
H264或者H265 他们都有 I/B/P 帧,把图像分为 GOP ( group of pictures),在一个 GOP 里面会有一些头信息,然后再加上 IDR 帧,P 帧只能向前参考,只能参考它前面的帧,B 帧前后的帧都可以参考。因为我们 Teams 是实时的,所以一般不用 B 帧,只用 P 帧,都是 I P P P P 这样的
- 帧内预测:IDR 只能用帧内预测,去除了本帧的一些冗余,靠的是帧里边自己的这些像素来计算的,跟其他的帧没有关系,自己就能解。比如说云朵这一块的图像,就是把挨它最近的这些像素块都拿出来,通过水平预测等方式(跟水平的像素块相减得到残差),只需要编码这个残差就好
- 帧间预测:对于一个运动的图像,汽车就是往前平行移动的,如果要编码第二个块,可以去第一个块里找比较接近的,找到了把位置信息和他俩相减的一个差,把这个差值传过去编码就可以了
帧内预测和帧间预测都是在时域上的,然后把得到的残差块,继续去做频域上的压缩
通过 DCT(离散余弦变化)就可以把时域的信息转化到频域上来,因为转化了之后重要的信息都会分布在低频分量上。比如图一图二图三,就是把64个绿色方块,变成9个低频分量和1个低频分量的绿色方块,虽然有失真明显,但还是能得到一个跟原图差不多的图像,通过反变换就能还原回去。但是如果像图四只保留了高频分量,而把最重要的低频分量丢掉了,图像就会变得面无全非。我们把预测之后的残差,经过 DCT 变换之后,能量也是集中在低频分量区域,再去编码的话就更节省码流了
量化就是把更大的数,变化成一些更小的数,就是图上的 QP=1 到 QP=4,简单理解为除,就可以得到更多为零的值了。带来的就是会有些失真,一个图像的失真主要就是量化这部分引入的。带宽也和 QP 有直接的关系。比如如果你带宽低的情况下,想要编码器输出一个匹配画质的图像,那你就直接告诉编码器给一个大一点的 QP,来实现控制图像质量失真情况。QP 越大,视频主观质量就没那么好
变换和量化之后,并不是就这样直接发出去,还要经过一个变长的编码。原理是给一些概率更高的值,给他们一些更短的 code,用一个更短的数来表示它,给概率更低的值,给一个更长的值。比如说有熵编码,霍夫曼编码,算术编码,在 264 里对于分辨率高一点的都用算术编码(arithmetic coding)来实现,因为复杂性比较高,压缩率比较高,用硬件实现的话收益就比较大。编码带来的压缩率就是 1/2 或者 1/4,也不会引入失真,因为这个过程是可逆的
如果在量化过程中失真比较大,QP 值比较大,就会引入失真,产生左图的块效应。通过 deblocking 去块效应的滤波器,来判断是不是图像的边界,如果不是图像的边界,仅仅是量化引起的话,就给周围的像素取个平均,能让图像看起来柔和一些
Teams 当中的运用
目前 H264 占 90%,AV1 压缩率要更高,但复杂性也更高,在 mobile 上用不太合适,一般不用做 encoder,而是用来解编码 vbss 的时候用。我们 team 在做的就是看怎么样用更多的 hardware codec 来做编解码,这样就可以省电,让续航变长。接下来会继续做 H265,AV1,ML codec