音视频学习从零到整--H264编码原理

原文链接: https://www.jianshu.com/p/7a38378a7a1c

音视频学习从零到整(1)
音视频学习从零到整(2)
音视频学习从零到整(3)
音视频学习从零到整(4)
音视频学习从零到整(5)
音视频学习从零到整(6)

一.H264压缩技术.

  • 帧内预测压缩,解决的是空域数据冗余问题.

    什么是空域数据,就是这幅图里数据在宽高空间内包含了很多颜色,光亮.人的肉眼很难察觉的数据. 对于这些数据,我们可以认作冗余.直接压缩掉的.

  • 帧间预测压缩,解决的是时域数据冗余问题.

    在我们之前举例说明过,摄像头在一段时间内所捕捉的数据没有较大的变化,我们针对这一时间内的相同的数据压缩掉.这叫时域数据压缩.

  • 整数离散余弦变换(DCT),将空间上的相关性变为频域上无关的数据然后进行量化.

    这个比较抽象.这个跟数学是紧密联系在一起的.如果对傅里叶变换理解的比较好的.对这个会理解的比较快.如果对傅里叶变换不了解的.可能有稍许困难.傅里叶变换可以把一个复杂波形图变换成许多的正弦波.只是他们之间的频率不一样.以及振幅也不一样.如果它们在频率上没有一致性那么我们就可以对他进行压缩处理.

  • CABAC压缩:无损压缩.

二.宏块划分与分组.

H264宏块划分.可以参考下图.

15501248746157.jpg

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

15501250480521.jpg

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

子块划分:

15501251503252.jpg

在这个大的宏块里,可以再细化. 我们可以看到在这个大的宏块里,我们更加细化了. 比如我们中间这个全部都是蓝色的这个宏块,就可以用一个色块,更加简单描述就行了.

我们对比旁边的MPEG2和H.264.就会发现MPEG2存储时还说比较完整.占用的空间相对于比较多.而H.264还是减少了很多空间.像重复的颜色他们就用非常简单的色块描述了.

帧分组:
例如,一个台球从一个位置移动到另外一个组. 可以发现它的桌面背景是一样的.只是球体位置发生了变换.这个我们就可以把这一组帧划分为一组.

15501254662436.jpg

三. 组内宏块查找

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

15501257029375.jpg

运动估算:

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

15501258562809.jpg

运动矢量与补偿压缩:

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

15501261591720.jpg

四. 帧内预测

帧内压缩是针对于I帧的.因为它解决的是空间的数据冗余.而帧间压缩是解决的时间数据冗余.我们刚刚说明的是帧间压缩技术.将大量在时间轨迹上相同的数据压缩掉.只留下运算估量和残差值.

而帧内我们采用了其他的压缩原理

如下图,首先要经过计算,选择用那种模式.对每一个宏块采用不同的模式运算.

15501267843190.jpg

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

15501276594691.jpg

15501293880389.jpg

15501275060492.jpg

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

15501302178463.jpg

计算的预测图和原图是有差别的. 原图比较圆润.预测图相对而言比较粗糙. 现在有两幅图.这时就做2张图的差计算.

计算帧内预测残差值:

底下的图就是我们的原图.通过预测与原图的差得出一个结果.这个灰色图就是残差值.

15501303285062.jpg

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

15501304345456.jpg

五.DCT压缩

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

15501306601218.jpg

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

15501307227319.jpg

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

DCT压缩原理(1)
DCT压缩原理维基百科

15501319570583.jpg

六.VLC压缩

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

15501327059357.jpg

经过VLC压缩之后,就变成了无损压缩的方式了.

CABAC压缩(上下文适应无损压缩技术)

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

15501328727268.jpg

对比:
VLC压缩的数据都是大块.无损压缩.
而CABAC压缩,会随着压缩的数据增大,上下文信息全面.压缩比随之增大.数据块从大块降低成小数据块.

文章图片来源于网络,如未能核实来源或转发内容图片有瑕疵,请及时私信本人进行修改或者删除.

猜你喜欢

转载自blog.csdn.net/qq_30513483/article/details/101538580