H264压缩原理

1、为什么压缩的原始数据一般采用YUV格式

(1)利用人对图片感觉的生理特性,对于亮度信息比较敏感,对于色度信息不太敏感,所以视频编码是将Y分量和UV 分量分开来编码,并且可以减少UV分量.

2、视频压缩原理

(1)空间冗余:图像相邻像素之间的相关性,比如一帧图片被划分成多个16x16的块之后,相邻的块之间有很多明显的相似性。

(2)时间冗余:时间相差较近的两张图片变化较小。

(3)视觉冗余:我们的眼睛对某些细节不太敏感,对图像中的高频信息的敏感度小于低频信息,可以去除一些高频信息。

(4)编码冗余:一幅图片中不同像素出现的概率是不同的,对于出现次数较多的像素,用少的位数来编码,对于出现次数较少的像素,用多的位数来编码,能够减少编码的大小。比如哈夫曼编码。

3、图像帧的类型(I帧,P帧,B帧)

I帧:关键帧

P帧:预测帧

B帧:B帧带来编码延迟

4、GOP(group of pictures)

一个序列的第一个图像叫做IDR图像,IDR都是I帧图像,gop指两个IDR之间的距离

gop长度约大,视频压缩率越高

5、H264主要采用了以下几种方法对视频数据进行压缩,包括:

(1)帧内预测压缩,解决的是空域数据冗余问题。

(2)帧间预测压缩(运动估计与补偿),解决的是时域数据冗余问题。

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

(4)CABAC压缩

划分宏块

H264默认使用16X16大小的区域作为一个宏块,也可以划分为8X8大小

划分好宏块之后,计算宏块的像素值

依次把H264编码器的缓存区中的每一张图片都计算好

划分子块:

在16X16的宏块上还可以划分子块,子块的大小可以为8X16,16X8,8X8等

帧分组:

划分好宏块之后,就可以对所有的图片进行分组了。

其算法为:再相邻的几幅图像画面中,一般有差别的像素只有10%以内的点,亮度差值不超过%2,而色度差值的变化只有1%以内,我们认为这样的图可以分为一组。在这样的一组帧中,经过编码后,我们只保留第一帧的完整数据,其他帧都通过参考上一帧计算出来,我们称第一帧为IDR/I帧,其他帧为P/B帧,这样编码后的数据组称为gop

运动估计与补偿:

在H264编码器中将帧分组后,就要计算组内物体的运动矢量了,运动矢量计算出来后,将相同的部分减去,就得到了补偿数据,我们把运动矢量和补偿称为帧间压缩技术。它解决的是时间上的数据冗余。

帧内预测:

除了上面说的时间上的冗余,还有空间上的冗余,人眼对低频的亮度很敏感,对高频的亮度不太敏感,提出了帧内预测技术

将原始图像与帧内预测后的图像相减得到残差值。

对残差数据做DCT:

经过帧内与帧间的压缩后,还有压缩的空间,

将残差数据经过整数离散余弦变换,去掉数据的相关性,进一步压缩。

CABAC:

上面的帧内压缩属于有损压缩,还可以进行无损压缩,比如哈夫曼编码,给高频的词一个短码,给低频的词一个长码。

猜你喜欢

转载自blog.csdn.net/weixin_43004377/article/details/125668913