无损压缩DCT变换
#9:6:0:5:e:0:4:b:f:c:b:b:2:6:e:9:2:5:7:2:e:8:c:f:d:1:f:5:2:5:4:b#
经过有损压缩后的数据是分散在二维图标中的各个节点上,数据比较分散时不利于压缩,通过DCT变换,所有的分散数据都被集中在一块,左上角右下角等等。
DCT可以将数据由分散变为集中,利于压缩处理数据。
#1:8:0:b:6:9:5:4:f:3:3:4:2:7:e:4:a:2:d:4:3:5:6:8:4:3:0:e:d:c:4:0#
在DCT处理前是第一幅图中一个个凸出的小方块,可以看出数据量非常分散,而且处理后将所有数据都放到了一个角落,显得集聚,这样十分有益于有损压缩的数据处理。
VLC压缩
#c:6:5:8:a:6:d:6:7:a:1:4:3:2:f:b:5:7:2:0:6:3:4:8:8:2:1:e:6:5:e:0#
当所有的数据通过DCT变换以后,就可以进行具体的无损压缩了。
所谓VLC就是可变长的编码,原理就是将26个字母,常出现的字符使用短码进行表示,将不时常出现的用长码进行表示,比如图中所示,字母A使用二补码11表示,字母Z借助二补码00000001011进行表示,这样一来可以将数据压缩的十分小。
当整个数据中的高频字符越多时,压缩疗效就越好,这儿的字符A只是一个反例,实际上可以是任何一个数据块。
CABAC压缩
#c:e:0:3:d:1:8:6:5:c:c:7:8:b:0:a:0:b:4:0:7:b:d:d:a:4:4:b:a:7:8:3#
所谓CABAC压缩就是上下文适配的二补码编码。
通过图中对比,输入大量的视频数据时,VLC的始终生成的数据量都很小,且平均,由于对他来说前后并没有关系。
然而CABAC可以看出,一开始略大一些,而且前面渐渐越来越小,由于它是有山下文记录的。
H264编码流程
#f:2:d:d:c:1:8:5:b:b:1:c:6:b:9:7:c:6:d:d:6:1:d:9:8:d:2:9:c:a:9:d#
图中蓝颜色的Fn是当前待压缩的视频帧,是一个IDR帧,即gop中的第一帧,由于是第一帧,是关键帧,所以肯定是要使用帧内压缩,所以第一步是选择帧内预测模式即如右图所示。
#f:f:b:8:c:6:9:8:a:d:5:d:7:6:4:c:e:7:d:1:c:0:a:9:7:7:4:7:a:3:6:e#
当选择好帧内预测模式时,就可以进行帧内预测,把每一个宏块都估算下来。
如右图所示:
#2:e:5:2:1:0:4:a:5:d:0:3:6:6:5:8:4:7:e:5:c:a:5:a:5:2:8:4:4:d:5:2#
之后将预测得到的全部图象数据与当前帧原数据进行对比,得到方差值,如右图所示:
#8:f:8:3:8:e:f:8:8:5:0:6:e:6:9:0:d:1:7:5:7:0:8:3:3:9:7:2:4:b:5:4#
得到方差值后进行转换,如右图所示:
#2:8:2:8:4:3:8:1:4:7:7:0:0:1:1:1:f:f:2:7:6:c:a:e:4:c:a:c:f:c:e:6#
经过转换后进行量化,也就是无损编码,如右图所示:
#8:a:d:c:8:b:c:c:e:8:d:7:6:0:b:a:1:1:4:1:8:7:d:4:3:2:8:a:9:2:7:e#
最后就是前面的拆包打成NAL头,之后数据分发,也就是数据吐出去了。
做帧间压缩时,就是以Fn-1为例,即须要参考前一帧(非b帧),首先要经过运动评估,如右图所示:
#d:2:3:4:6:0:6:4:b:8:a:3:b:0:5:e:8:e:f:d:5:2:1:a:c:a:1:3:c:7:e:5#
运动评估就是对所有的宏块进行匹配查找,找到后领到的就是运动矢量,如右图所示:
#8:3:2:2:9:8:a:1:9:2:a:4:3:e:6:1:3:1:1:5:e:a:1:0:2:e:4:9:c:1:d:3#
得到运动矢量后,在与当前帧进行对比得到方差值,如右图所示:
#b:6:a:6:0:b:5:5:6:7:c:5:1:7:1:3:3:e:b:8:7:4:4:5:d:b:f:3:0:5:5:0#
得到方差值以后的流程与上面说的帧内压缩的得到方差值后的流程一样。
H264解码流程
#2:6:3:7:c:d:4:5:8:2:3:d:f:e:5:0:a:b:0:b:a:3:a:8:e:0:e:6:6:a:3:d#
H264的解码流程实际就是前面编码流程的逆向操作,。可以对比下解码流程图和上面编码流程图的蓝色部份(解码流程)。
H264参考资料
第一个是蓝皮书,有H264整个变解码的流程
第二个网址介绍了整个H264不同编码级别,其区别是哪些,以及现有的一些H264的具体实现,那种功能更强等。
#e:5:f:3:1:a:3:b:3:c:5:1:5:3:a:b:6:a:4:8:9:5:9:f:4:4:c:c:3:1:2:7#
#a:4:7:e:e:9:2:f:0:f:c:2:c:0:0:9:d:3:0:1:3:7:d:d:5:5:d:0:3:1:0:2#