音视频学习从零到整--H264编码原理
音视频学习从零到整(1)
音视频学习从零到整(2)
音视频学习从零到整(3)
音视频学习从零到整(4)
音视频学习从零到整(5)
音视频学习从零到整(6)
一.H264压缩技术.
-
帧内预测压缩,解决的是空域数据冗余问题.
什么是空域数据,就是这幅图里数据在宽高空间内包含了很多颜色,光亮.人的肉眼很难察觉的数据. 对于这些数据,我们可以认作冗余.直接压缩掉的.
-
帧间预测压缩,解决的是时域数据冗余问题.
在我们之前举例说明过,摄像头在一段时间内所捕捉的数据没有较大的变化,我们针对这一时间内的相同的数据压缩掉.这叫时域数据压缩.
-
整数离散余弦变换(DCT),将空间上的相关性变为频域上无关的数据然后进行量化.
这个比较抽象.这个跟数学是紧密联系在一起的.如果对傅里叶变换理解的比较好的.对这个会理解的比较快.如果对傅里叶变换不了解的.可能有稍许困难.傅里叶变换可以把一个复杂波形图变换成许多的正弦波.只是他们之间的频率不一样.以及振幅也不一样.如果它们在频率上没有一致性那么我们就可以对他进行压缩处理.
-
CABAC压缩:无损压缩.
二.宏块划分与分组.
H264宏块划分.可以参考下图.

将一个图片左上角用宏块描述,就是宏块是8*8的元素.取出的颜色,像右边的去描述.描述颜色.将一个图片全部用宏块描述就如下图.

基本的图片的宏块划分就完成了.那是不是每个宏块都是8*8了?并不是的.还有子块划分.
子块划分:

在这个大的宏块里,可以再细化. 我们可以看到在这个大的宏块里,我们更加细化了. 比如我们中间这个全部都是蓝色的这个宏块,就可以用一个色块,更加简单描述就行了.
我们对比旁边的MPEG2和H.264.就会发现MPEG2存储时还说比较完整.占用的空间相对于比较多.而H.264还是减少了很多空间.像重复的颜色他们就用非常简单的色块描述了.
帧分组:
例如,一个台球从一个位置移动到另外一个组. 可以发现它的桌面背景是一样的.只是球体位置发生了变换.这个我们就可以把这一组帧划分为一组.

三. 组内宏块查找
什么是组内宏块查找?
实际就如下图.台球从一角滚到另外一角.相邻的2幅图做组内的宏块查找.
将图逐行扫描,扫描到第三行.发现了台球. 然后围绕它的周围查找.发现了有类似的图块.

运动估算:
然后就把他们放在同一张图中.也就是说台球刚开始从位置1.到第二张图移动到位置2.这之间有一个运动矢量.矢量会包含运动的方向和距离.将所有的图都两两比较.最后就形成了右边这张图.就是右图中红色部分.每一个红色的箭头标注都是一个运动矢量.很多帧就会形成一个连续的运动估算.那么这个估算之后,我们要达到什么结果了?

运动矢量与补偿压缩:
最终将连续的运动估算 换算成下图所表现的.我们就是对齐进行压缩.所有帧的背景都是一样的.变换在哪里了?变换就是它的运动矢量还有台球的数据. 实际经过我们一运算后.它留下的就只是运动矢量数据+残差值的数据. 经过这样的一个计算.帧间压缩数据我们就可以看到实际我们只需要存储一点点数据.而不像以前要将几十帧的所有图片数据保存下来.这就达到了压缩的效果. 这个过程就叫做帧间压缩技术的原理.

四. 帧内预测
帧内压缩是针对于I帧的.因为它解决的是空间的数据冗余.而帧间压缩是解决的时间数据冗余.我们刚刚说明的是帧间压缩技术.将大量在时间轨迹上相同的数据压缩掉.只留下运算估量和残差值.
而帧内我们采用了其他的压缩原理
如下图,首先要经过计算,选择用那种模式.对每一个宏块采用不同的模式运算.

当每个宏块都选定了模式之后.就形成了下图的这样的效果.每个宏块都选择一个帧内预测的模式.帧内预测一共有9种模式.
帧内预测9种模式原理介绍(1)
帧内预测9种模式原理介绍(2)



让每个宏块挑选好模式之后,我们就可以使用块预测模式.预测完了之后,它就得到一个张"预测图".
左边是预测图,右边是源图.

计算的预测图和原图是有差别的. 原图比较圆润.预测图相对而言比较粗糙. 现在有两幅图.这时就做2张图的差计算.
计算帧内预测残差值:
底下的图就是我们的原图.通过预测与原图的差得出一个结果.这个灰色图就是残差值.

预测模式与残差值压缩:
拿到参差值之后,我们就进行压缩. 压缩时保存,残差数据和每个宏块选择的模式信息数据. 那么有了这2个数据之后.当我们解码时,首先通过宏块的模式信息计算出预测图.然后将预测图与我们的残差值进行累积.就能还原成原图像. 那这个过程就是"帧内压缩技术"的原理过程.

五.DCT压缩
DCT压缩也是整数余弦压缩技术. 那它是如何压缩?
我们划分一个可量化的宏块.

然后将量化的宏块根据DCT数学方法.进行压缩.

压缩后的就成这个样子.
左上角有数据分布,右下角数据为空.从而达到数据量减少的作用.那它是如果做到的了? 这个如果计算是需要非常深的数学功底.如果感兴趣的可以在网络上搜索一下.

六.VLC压缩
VLC 用类似哈夫曼码. 用短码来记录高频数据.用长码记录低频数据.
频率高的就编为短码,频率低的就编为长码.

经过VLC压缩之后,就变成了无损压缩的方式了.
CABAC压缩(上下文适应无损压缩技术)
VLC实际上是MPEG2使用的技术.而H264使用的是CABAC.也就是上下文适应技术.除了使用哈夫曼短码高频,长码高频的方式还加上了上下文适应的技术.根据上下文就可以加大压缩比.

对比:
VLC压缩的数据都是大块.无损压缩.
而CABAC压缩,会随着压缩的数据增大,上下文信息全面.压缩比随之增大.数据块从大块降低成小数据块.
文章图片来源于网络,如未能核实来源或转发内容图片有瑕疵,请及时私信本人进行修改或者删除.