H.264标准中的基本概念
版权声明:本文为卫伟学习总结文章,转载请注明出处!
1.H264基础概念
在H.264/AVC视频编码标准中,整个系统框架划分如下两个层面:
- 视频编码层(VCL): VCL数据即被压缩编码后的视频数据序列,负责有效表示视频数据的内容;
- 网络抽象层(NAL):负责将VCL数据封装到NAL单元中,并提供头信息,以保证数据适合各种信道和存储介质上的传输。
每个 NAL 单元都是由 1 字节 NAL header 和 若干整数字节的负荷数据 EBSP 构成。
2. I帧、B帧和 P帧
视频压缩中,每一帧代表一副静止的图像。而在实际压缩时,会采取各种算法减少数据的容量,其中IPB就是最常见的。
简单地说,I帧就是关键帧。可以理解为帧内压缩。P是向前搜索的意思。B是双向搜索。他们都是基于I帧来压缩数据。
- I帧:表示关键帧,可以理解为这一帧画面的完整保留,解码时只需要本帧数据就可以完成(因为包含完整画面)。
- P帧:表示的是这一帧跟之前的一个关键帧(或P帧)的差别,解码时需要用之前缓存的画面叠加上本帧定义的差别,生成最终画面。(也就是差别帧,P帧没有完整画面数据,只有与前一帧的画面差别的数据)。
- B帧:是双向差别的帧,也就是 B帧 记录的是本帧与前后帧的差别(具体比较复杂,有四种情况)。换言之,要解码 B帧,不仅要取得之前的缓存画面,还要本帧之后的画面,通过前后画面与本帧数据的叠加取得最终的画面。B帧 压缩率高,但是解码时 CPU 会比较累。
采用的压缩方法:分组,将几帧图像分为一组(GOP),为防止运动变化,帧数不宜取多。
- 定义帧:将每组内各帧图像定义为三种类型,即 I帧,P帧,B帧;
- 预测帧:以 I帧 为基础帧,以 I帧 预测 P帧,再由 I帧 和 P帧 预测 B帧;
- 3 数据传输:最后将I帧数据与预测的差值信息进行存储和传输。
3. GOF
GOF:一组帧。如果一秒钟之内有三十帧,这三十帧可以划为一组。如果摄像头一分钟内捕获的图片都没有什么大变化,这样也可把这一分钟内的所有帧成为一组帧。
所谓一组帧,就是在一个I帧与另一个I帧之间这一组包括了B和P帧。这一组称为GOF。3.1 SPS与PPS
SPS与PPS实际是对存GOF的参数。
SPS:Sequence Parameter Set, 序列参数数集,存放帧数、参考帧数目、解码图像尺寸、帧场编码模式选择标识等。
PPS:Picture Parameter Set,图像参数集,存放熵编码模式选择标识、片组数目、初始量化参数和去方块滤波系数调整标识等。
在一组帧之前,首先会收到SPS和PPS,如果没有这两个参数就不能进行解码和编码处理。SPS和PPS规划为I帧,这两个帧数据是不能丢失的。
4. 视频花屏/卡顿原因
如果GOF分组中的P帧丢失会造成解码端的图像发生错误。本身一组帧形成图像的连贯动作,当某一个帧没有到达或者损失了,这时更新的那一块数据就没有。后面帧更新了,但前面那一块没有更新,就出现了花屏现象。
为了避免花屏问题的发生,一般如果发现P帧或者I帧丢失,就不显示本GOP内的所有帧,直到下一个I帧来后重新刷新图像。这时会出现卡顿现象。
总结花屏是因为丢失了数据,卡顿是为了防止花屏主动丢掉一组GOF数据。
5.视频编码器
x264/x265:x264是目前最广泛的H.264的视频编码器。软编基本用x264。x265也逐渐成熟。因为它的压缩比更高,占用CPU的性能也高,在直播系统里不适合用。在点播系统里可以尝试使用。
openH264:比x264性能更低些,但支持SVC视频技术。SVC将视频进行分层传输,一帧数据分为小中大三个部分。如果网络差的情况下,只发最小内核的帧,网络稍微好点,发中间内核帧。网络非常好,全部发出去。发出去后,将这三层叠加在一起,恢复原来的视频。
6.宏块的划分与帧分组
左上角是一个8*8的宏块,横着是8个像素,竖着也是8个像素。将整张图片用宏块来划分,划分的效果如下: 其中的一个宏块可以再进行细化,在大的宏块里面左边下边都有一小块黑色。右边也有块黑色。为了更好的压缩,把这个宏块划分为多个子块。 MPEG2是将一个宏块进行平等的划分,压缩后的数据还是比较大。H.264进行更加多的子块划分。帧分组:一组帧内,一个物体运动是变化很小的。比如台球的运动轨迹,可以将它的轨迹运动的帧划分为一组。因为它们的变化特别小,整个背景都是绿色,只有台球是白色。可以通过算法推算出台球在某一帧它应该会滚动到哪一个位置。
7.H264压缩技术
帧内预测压缩:解决的是空域数据冗余问题。空域数据就是一幅图中其中颜色、色彩和光亮等人眼不是很敏感的部分,这部分称之为冗余数据,可以将它直接删除掉的。
帧间预测压缩:解决的是时域数据冗余问题。因为一组帧的数据相关型非常高,这些帧数据基本重复的,把这些重复的数据全部删除。
整数离散余弦变换(DCT):将空间上的相关性变为频域上无关的数据然后进行量化。
CABAC压缩:无损压缩。
7.1.组内宏块查找 (帧间压缩技术)
一组运动台球的帧,从一个角滚动到另一个角。将这一组帧的相邻的两帧做为组内的宏块查找。当扫描到一个台球时,发现台球之后就会在台球周围去找,周围是否有类似的宏块。它们之间有一个运动的方向和一个运动的距离,这就是运动矢量。将所有的这些帧都进行两两比较,最好就形成了右边这张图。每一个红色的标注就是运动矢量。 因为所有帧的背景都时一样的,变化的就是它的运动矢量。还有它的台球的数据。这样通过运算压缩之后,留下来的数据:运动矢量数据+残差的数据。这过这样帧间压缩,只需要存一点点数据。解决时间数据的冗余。7.2 帧内预测
帧内压缩主要针对的时I帧的,解决的时空间的数据冗余。先通过一种计算,选择想用的那种模式。对每个宏块采用不同的模式运算,将产生每一个宏块产生帧内预测的模式。帧内预测有九种模式。 挑选出后,每一个宏块使用的块预测模式,预测完了之后,如左那个图。将预测来的帧图与原图进行差计算。得到差数据就是残差值。帧内压缩:残差数据+选择每个宏块的模式信息数据。解码的时候,首先通过预测的模拟信息恢复出预测的图,再将预测的图与残差值进行累加。就能还原出原始的图像。
7.3 DCT压缩
通过数字对宏块进行量化,量化之后通过DCT数据方法进行压缩。 DCT压缩后的效果如下:7.4 VLC压缩
上下文适应无损压缩技术。具体详解