关键点:
1.划分宏块
2.对所有图片进行分组
3.帧内预测压缩
4.帧间预测压缩
5.DCT 数据离散余弦变换
6.CABAC(无损压缩)
一:帧间压缩(解决的是时间上的数据冗余)
通过摄像头获取到视频帧(按每秒30帧),将视频帧传递到H264编码器的缓存区,然后将帧划分宏块,H264一般是将16*16的区域划分为一个宏。划分好宏后,计算宏块的像素值,(为提高效率,宏块继续可以划分为几个子块),再经过帧内压缩可以得到更高效的数据。
对于视频数据主要有两类数据冗余。一类是时间上的数据冗余,一类是空间上的数据冗余;(时间上的数据冗余是最大的)
宏划分好之后,可以对H264编码器缓冲中的所有图片进行分组了。
对于关系特别密切的帧,其实只要保存第一帧的数据,其他帧的数据可以根据某种规律预测出来;为了预测需要将视频帧分组;
算法:在相邻的几幅图像中,一般有差别的像素在10%以内,亮度差值在2%之内,色度差值在1%以内的,可以划分为一组。
只保留第一帧数据(第一帧为IDR/I帧,其他为P/B帧,这样编码后的数据帧称为GoP)
经过压缩后的帧分为:I帧,B帧,P帧 (两个I帧之间是一个GOP,每个GOP只包含一个I帧 如:I/B/B/B/P/B/B/B/P/B/B/B/ = GOP )
分组后计算帧组内物体的运动矢量了
运动矢量(方向/数值),计算出运动矢量得到补偿数据;将补偿数据进行压缩保存,以后解码时就能恢复原图了
二:帧内压缩
人眼对低频的亮度比较敏感,对高频的亮度不敏感,所以可将一副图中的人眼不敏感的数据进去除掉
H264帧内压缩与JPEG压缩很相似,一幅图划分好宏后,对每个宏进行9种预测,找到与原图最接近的一种预测模式。将原图与预测图进行相减,得到残差值。将预测图与残差值保存起来。以后解码的时候就能恢复原图了
三:对残差值进行DCT
对残差值进行数据离散余玹转化,去除数据相关性,进一步压缩数据
四:CABAC
给高频的数据短码,给低频的数据长码。同时还会根据数据的相关性进行压缩