H264编码原理(无损压缩)

无损压缩

DCT变换

H264编码原理(无损压缩)_第1张图片
经过有损压缩后的数据是分散在二维图标中的各个节点上,数据比较分散时不利于压缩,通过DCT变换,所有的分散数据都被集中在一块,左上角右下角等等。
DCT可以将数据由分散变为集中,利于压缩处理数据。
H264编码原理(无损压缩)_第2张图片
在DCT处理前是第一幅图中一个个凸起的方块,可以看出数据量十分分散,但是处理后将所有数据都放在了一个角落,变得聚集,这样非常有益于有损压缩的数据处理。

VLC压缩

H264编码原理(无损压缩)_第3张图片
当所有的数据通过DCT变换之后,就可以进行具体的无损压缩了。
所谓VLC就是可变长的编码,原理就是将26个字母,常出现的字符使用短码进行表示,将不经常出现的用长码进行表示,例如图中所示,字母A使用二进制11表示,字母Z利用二进制00000001011进行表示,这样一来可以将数据压缩的非常小。
当整个数据中的高频字符越多时,压缩效果就越好,这里的字符A只是一个例子,实际上可以是任何一个数据块。

CABAC压缩

H264编码原理(无损压缩)_第4张图片
所谓CABAC压缩就是上下文适配的二进制编码。
通过图中对比,输入大量的视频数据时,VLC的一直生成的数据量都很小,且平均,因为对他来说前后并没有关系。
但是CABAC可以看出,一开始略大一些,但是后面逐渐越来越小,因为它是有山下文记录的。

H264编码流程

H264编码原理(无损压缩)_第5张图片
图中蓝颜色的Fn是当前待压缩的视频帧,是一个IDR帧,即gop中的第一帧,因为是第一帧,是关键帧,所以肯定是要使用帧内压缩,所以第一步是选择帧内预测模式即如下图所示。
H264编码原理(无损压缩)_第6张图片
当选择好帧内预测模式时,就可以进行帧内预测,把每一个宏块都计算出来。
如下图所示:
H264编码原理(无损压缩)_第7张图片
然后将预测得到的全部图像数据与当前帧原数据进行对比,得到残差值,如下图所示:
H264编码原理(无损压缩)_第8张图片
得到残差值后进行转换,如下图所示:
H264编码原理(无损压缩)_第9张图片
经过转换后进行量化,也就是无损编码,如下图所示:

H264编码原理(无损压缩)_第10张图片
最后就是后边的拆包打成NAL头,然后数据分发,也就是数据吐出去了。
做帧间压缩时,就是以Fn-1为例,即需要参考前一帧(非b帧),首先要经过运动评估,如下图所示:

H264编码原理(无损压缩)_第11张图片
运动评估就是对所有的宏块进行匹配查找,找到后拿到的就是运动矢量,如下图所示:

H264编码原理(无损压缩)_第12张图片
得到运动矢量后,在与当前帧进行对比得到残差值,如下图所示:
H264编码原理(无损压缩)_第13张图片
得到残差值之后的流程与前面说的帧内压缩的得到残差值后的流程一样。

H264解码流程

H264编码原理(无损压缩)_第14张图片
H264的解码流程实际就是上面编码流程的逆向操作,。可以对比下解码流程图和上边编码流程图的粉色部分(解码流程)。

H264参考资料

  • H.264_MPEG-4-part-10-White-Paper
  • https://enwikipedia.org/wiki/Advanced_Video_Coding

第一个是白皮书,有H264整个变解码的流程
第二个网址介绍了整个H264不同编码级别,其区别是什么,以及现有的一些H264的具体实现,那个功能更强等。
H264编码原理(无损压缩)_第15张图片
H264编码原理(无损压缩)_第16张图片

你可能感兴趣的:(ffmpeg-mac,ffmpeg笔记,H264编码原理,H264无损压缩,DCT变换,CABAC压缩,VLC压缩)