最近本人在学习视频压缩编码方面的知识,虽然还不能完全掌握各种细节,但学到精妙处仍不仅感叹大佬真是太聪明了。本文是基于费曼学习法思想做的粗浅记录,因才疏学浅,难免有纰漏,待后续学成再来修正吧。
一、视频中的冗余
1、空间冗余
一帧图像内部相邻的像素点变化往往较小,有相关性
2、时间冗余
以每秒25帧为例,前后2帧图像内容变化往往较小,有相关性
3、视觉冗余
图像中纹理细节对应高频信息,平坦区域对应低频信息。人眼对高频信息不敏感,可以去除一些。
4、信息熵冗余
个人理解是数据上的冗余,比如ABBCCCDDDD,可以用A1B2C3D4这样表示,减小数据量。
二、视频压缩原理
对应视频中的冗余类型,视频压缩方法一般包含预测(帧内预测、帧间预测)、变换和量化、熵编码等。
1、帧内预测(空间冗余)
这里有一些基本的概念,如片、宏块、子块等,很容易理解,不再赘述。
(1)基本想法:由于空间冗余的存在,同一帧图像中的相邻像素有相关性,那么可以按照一定的预测方法,由图像中的1个块的数据大胆预测相邻块的数据。然后用编码块减去预测块得到残差块,减少冗余。举个例子,一帧图像是全白的,残差块数据就全是0,数据量是不是就小了?
(2)预测方法
预测时根据块大小可分为不同的预测模式,简单说就是按照千奇百怪的方式去猜测。其中,亮度块和色度块是分开的。
-
4*4亮度块预测模式:9种
-
16*16亮度块预测模式:4种
-
8*8色度块预测模式:有4种
(3)最优预测模式
上述这么多方法,编码时具体要采用哪一个呢?答案是每个都试一下,看哪一个预测的更准确!大佬也提供了一些算法(如绝对值和最小等)来作为准确与否的标准。
2、帧间预测(时间冗余)
想象视频中有一辆运动的车,按照每秒25帧来看,相邻2帧间隔40ms,2帧相比除了车辆的位置有微小变化其它背景都一样。
(1)基本想法:运动估计,从已经编码图像中找到预测块,计算反映物体位置变化的运动矢量,把运动矢量编码到码流中,数据量是不是也小了?
(2)运动搜索算法
怎么在前面图像中找到运动物体的位置?这里大佬提供了很精妙的算法,如菱形搜索、六边形搜索等,试图在搜索的准确度和速度上取得平衡,只想说请收下我的膝盖。
3、变换量化(视觉冗余)
(1)基本想法:由于人眼对高频信息不敏感,我们可以把图像变换到频域,然后通过量化尽量把高频信息变成0,达到减少数据的目的。
(2)变换
通过DCT变换和Hadamard变换将残差块从空域变换到频域。
(3)量化
通过选择合适的QP(量化步长),将大部分高频信息置为0。这里涉及压缩程度和图像失真程度的平衡。量化步长越大,压缩程度越大,图像就容易失真。反之亦然。
4、熵编码(信息熵冗余)
利用统计特性对数据进行压缩,如变长编码(Huffman编码)、算法编码。在学习基础算法是基本上有所耳闻,这里不再赘述。
三、视频编码实验
1、H264编码
使用ffmpeg对YUV序列foreman_qcif.yuv进行编码,得到编码文件foreman_qcif.h264
ffmpeg -i foreman_qcif.yuv -c:v libx264 foreman_qcif.h264
2、压缩率
原文件:foreman_qcif.yuv,11140KB
新文件:foreman_qcif.h264,155KB
可见编码后文件大小仅为原来的155/11140=1.4%
四、参考文献
1、新一代视频压缩编码标准 -- H.264/AVC,毕厚杰,人民邮电出版社