目录
视频编码主要分为
图像的冗余
熵编码
帧内预测
帧间预测
DCT变换和量化
编码器比较
清晰度和耗时对比
一部电影1080P,帧率25fps,时长2小时,文件大小 1920x1080x1.5x25x2x360 = 521.4G 数据量非常大,对存储和网络传输都有很大压力。因此视频压缩很有必要。
视频编码主要分为
熵编码、预测(帧内、帧间)、DCT变换和量化。
每一帧图像,划分一个个块(宏块)进行编码,大小一般是16x16(h264,vp8),32x32(h265,vp9),64x64(hz65,vp9,av1)
图像的冗余
- 空间冗余:相邻块很多时候有明显的相似性;
- 时间冗余:前后帧变化比较小,相似性高;
- 视觉冗余:人眼对图像的高频信息敏感度小于低频信息,去除高频信息有的时候差别不大;
- 信息熵冗余:压缩算法
熵编码
主要去除信息熵冗余。
如:字符串编码 aaaaabbbbbccccc(15个字节)压缩成5a5b5c(6个字节) 节省9字节空间
图像也是一样,图像出现较多连续相同的字符,扫描出像素值,最好是很小的像素,比如0 像素,因为0在二进制中只占1位即可(指数哥伦布编码)。
如何做到像素值有很多0呢?
先减少图像块的空间冗余和时间冗余,在编码的时候进行帧内预测和帧间预测。
帧内预测
- 在当前编码图像内部已经编码完成的块中找到与将要编码的块相邻的块,一般是即将编码的左边块,上边块左上角块和右上角块。
- 将这些块与编码块相邻的像素经过多种不同的算法得到多个不同的预测块。
- 然后再用编码块减去每个预测块得到一个个残差块。
- 最后取这些算法得到的残差块中像素的绝对值加起来最小的块为预测块,得到的这个预测块的算法称为帧内预测模式。
- 残差块中像素的绝对值之和最小,这个残差块的像素经过扫描之后的“ 像素串”的值比直接扫描编码块的像素串的像素值更接近0
帧间预测
- 在前面已经编码完成的图像中,循环遍历每一个块,将它作为预测块。用当前的编码块与这个块做差值,得到残差块,取残差块中像素值的绝对值加起来最小的块为预测块。
帧间预测的专业术语
- 预测块所在的已经编码的图像称为参考帧
- 预测块在参考帧中的坐标值(X0,Y1)与编码块在编码帧中的坐标值(X1,Y1)的差值(X0-X1,Y0-Y1)称为运动矢量。
- 在参考帧中去寻找预测块的过程称之为运动搜索。
- 编码的过程中真正的运动搜索不是一个个块去遍历寻找的,而是有快速的运动搜索算法。
总之通过预测得到的残差块的像素值比编码块的像素值,去除了大部分空间冗余和时间冗余,这样得到的像素值更小
希望得到出现连续的0像素,如何处理呢?
DCT变换和量化
将残差块变换到频域,分离图像的高频信息和低频信息,需要将图像块变换到频域。常用的是DCT变换,又叫离散余弦变换。
变换的每一个像素值我们称为系数,变换块左上角的系数是图像的低频信息,其余的是图像的高频信息。(低频信息表示图像的轮廓,高频信息表示图像的细节)
DCT后低频与高频信息分开,再做之字扫描,前面的就是低频信息,后面就是高频信息。由于人眼对高频信息不太敏感,用过一种手段去除掉大部分高频信息,将大部分高频信息置为0
将变换块的系数都同时除以一个值QStep(量化步长),得到的结果就是量化后的系数。QStep越大,得到量化后的系数就会越小。高频信息数值相比低频信息系数值更小,量化后更容易变成0。
编码器比较
编码标准 | 块大小 | 帧内编码 | 帧间编码 | 变换 | 熵编码 | 滤波和后处理 |
H264 | 最大16x16 可划分成8x16 16x8 8x8 4x8 8x4 4x4 | 8个方向模式,planar+DC模式 | 中值MVP | DCT 4x4/8x8 | CAVLC,CABAC | 去块滤波 |
H265 | 最大支持64X64,四叉树划分 | 33个方向模式,planar+DC模式 | Merge模式AMVP模式 | DCT 4x4/8x8/16x16/32x32 DST 4X4 | CABAC | 去块滤波 SAO滤波 |
AV1 | 最大支持128x128,四叉树划分 | 56个方向模式+3个平滑模式+递归FilterIntra模式+色度CFL模式+色度板模式+帧内块拷贝模式 | OBMC+扭曲运动补偿+高级复合预测+复合帧内预测 | 4x4 - 64x64正方形+1:2/2:1 + 1:4/4:1矩形DCT/ADST/flipADST/IDTX | 多符号算数编码 | 去块滤波 CDEF LR滤波 Frame超分 |
标准越新,最大编码块越大,划分方式越多,编码模式越多,压缩效率越高,编码耗时越大。
清晰度和耗时对比
编码器 | H264 | H265 | AV1 |
PSNR | 29.3 | 31.2 | 32 |
速度 | 25fps | 8fps | 3fps |
相同码率下,AV1清晰度稍好于H265,而H264最差,但编码耗时则相反。
在机器性能比较差的机器上编码,最好选择H264和VP8。如果在新机器上,可以考虑H265,VP9 AV1。