H.264视频压缩编码标准
- 目的及用途
有损压缩,被广泛用于视频通信领域。
视频是由一帧帧图像组成的,为了使视频播放不卡顿,一秒钟至少要16帧画面,但是图片内容太大,传输不现实。因此需要对视频进行压缩编码。
- 算法概述
- 预备知识
- I帧:帧内编码帧,通常是每个GOP的第一个帧,自身可以通过视频解压算法解压成一张单独的完整的图片;
- P帧:前向预测编码帧,编解码时需要参考其前一个I帧或者B帧来生成一张完整的图片;
- B帧:双向预测帧,编解码时需要参考其前一个I帧或者P帧及其后一个P帧来生成一张完整的图片。
- GOP图像组结构:两个I帧之间构成一个图像组结构,是一组连续的画面,一个图像组结构中只有一个I帧(GOP图像组结构示意图如下所示)。
GOP图像组结构长度越大,视频压缩效率越高,但视频质量和视频流恢复能力也越差,反之亦然。
- IDR帧:每一个图像组结构的第一帧(I帧)。
对于视频数据主要有两类数据冗余:
- 时间冗余(帧间的相似性):一组连续的画面之间存在着关联性;
- 空间冗余(帧内的相似性):同一幅图像的相邻像素点具有连贯性
其中,时间上的数据冗余是最大的。
- 算法的主要思想
根据两类数据冗余实现对视频数据的两种预测/压缩:
- 时间上的预测(帧间预测):由于视频相邻的两帧之间内容相似,使用先前帧的信号做预测,帧间预测的实际值位于当前帧,预测值位于参考帧,即只需要保存参考帧的图像数据,而其它的帧都在参考帧的基础上按规则预测出来;
- 空间上的预测(帧内预测):视频的某一帧内部的相邻像素存在相似性,使用同一帧中相邻像素的信号做预测,帧内预测的预测值与实际值均位于同一帧。
- 算法的主要步骤
- 分组:将一系列变换不大的图像归为一个组,也就是一个GOP图像组结构;
- 定义帧:将每组的图像帧划分为I
帧、P
帧和B
帧三种类型; - 预测帧:将I
帧作为基础帧,先根据I
帧预测P
帧,再根据I
帧和P
帧预测B
帧; - 数据传输:最后将I
帧数据与预测的差值信息进行存储和传输。
- 算法输入、输出
- 输入:YUV视频帧
- 输出:H.264视频帧和是否关键帧数据
- 算法参数
- 宏块的大小。
- 量化步长
- 算法步骤
参考H.264基本原理与编码流程 - Lxk- - 博客园 (cnblogs.com)
H264视频压缩算法,H264编码原理_哔哩哔哩_bilibili
宏块是视频信息的主要承载者,一个编码图像通常由多个宏块组成,宏块中包含着每一个像素的亮度和色度信息。
默认使用16×16大小的区域作为一个宏块。
- 为每个宏块划分子块(可选)
- 帧分组
按照采集的时间顺序,每次取出相邻的两帧进行宏块比较,计算两帧的相似度。
在相邻几幅图像画面中,一般有差别的像素只有10%以内的点,亮度差值变化不超过2%,而色度差值的变化只有1%以内,我们认为这样的图可以分到一组。
- 运动估计与运动补偿
运动估计:寻找最佳匹配宏块的过程。将当前的输入图像分割成若干不相重叠的小图像子块,然后在前一或者后一图像某个搜索窗口的范围内为每一个图像块寻找一个与之最为相似的图像块。
运动补偿:描述前一帧的每个小块如何移动到当前帧中的某个位置。通过计算最相似的图像块与该图像块之间的位置信息,得到了一个运动矢量。在编码过程中就可以将当前图像中的块与参考图像运动矢量所指向的最相似的图像块相减,得到一个残差图像块。
- 帧内预测
①定义:帧内预测就是在当前编码图像内部已经编码完成的宏块中找到与编码块相邻的宏块。一般就是编码块的左边、上边、左上角和右上角的宏块,再用编码块减去每一个预测块得到一个个的残差块,计算每个残差块中所有像素值的绝对值之和,将绝对值之和最小的残差块以及对应的预测块进行存储。
②原理:数字越小越容易用更少的比特表示,通过将宏块内的像素值转化为较小的数字实现对宏块的压缩编码,例如数字0在二进制中只占用一个比特位就可以表示,而数字255在二进制中需要8个比特位来表示。
③帧内预测编码示例:
图1
编码端:原始值-预测值=残差值 即 编码块-预测块=残差块
图2
残差块中的像素值相比于编码块中的像素值更接近于0。
解码端:残差值+预测值=原始值 即 残差块+预测块=编码块
- 帧间预测
预测块所在的已经编码的图像称为参考帧,预测块在参考帧中的坐标值与编码块在编码帧中的坐标值的差值称为运动矢量。
在参考帧中寻找预测块的过程称为运动搜索。
- DCT变换(离散余弦变换)
原理:通过去除人眼视觉不敏感的高频信号,减少图像编码的动态范围,从而降低图像信息的传输码率。
经DCT变换之后得到的变换块中低频信息主要表示的是一张图的总体样貌,一般低频信息的值比较大,编码后尽量保存低频信息;
高频信息主要表示的是图像中人物或物体的轮廓边缘等变化剧烈的地方,高频信息的数量多,但高频信息的值一般比较小。
- 量化步长
将变换块的系数同时除以量化步长,使得大部分高频系数变为0。
- 算法总结
- 根据相邻两帧图像之间宏块的相似性,确定I帧,划分GOP图像组结构;
- 根据I帧内部宏块的相似性,进行帧内预测,获取残差块,将I帧用编码块和残差块表示;
- 根据I帧与P帧、B帧之间宏块的相似性,进行帧间预测,获取运动矢量,将P帧和B帧用I帧和运动矢量表示。
- 算法优缺点
- 优点:
- 低码率:与MPEG-2和MPEG-4等压缩技术相比,采用H.264压缩技术后的数据量只有MPEG-2的八分之一,MPEG-4的三分之一,能够大大节省视频传输的数据量及时间;
- 高质量图像:H.264能够提供连续、流畅的高质量图像;
- 容错能力强:H.264提供了解决在不稳定网络环境下出现丢包等错误的必要工具,能够保证即便在网络环境出现不稳定变化时也能够成功的传输视频数据;
- 网络适应性强:H.264采用了分层结构,其中的网络适应层(Network Adaptation Layer,NAL)使得H.264能够适应不同的网络传输环境。
- 缺点:
- 当GOP图像组结构长度太长时,如果这个图像组结构的I帧出现异常,那么这个图像组结构的所有帧显示都有问题。
- 视频压缩编码的效率依赖于参数的设定。
- 适用场景
视频会议、数字电视广播、视频点播等。
- 改进方向
- GOP图像组结构的长度/相邻帧相似度的度量:GOP图像组结构长度越长时,编码的I帧越少,P帧、B帧的压缩率更高,因此整个视频的编码压缩效率就会越高,但是这也会导致IDR帧之间的距离太大,点播场景时进行视频的seek操作就会不方便;GOP图像组结构长度太短会导致码率增加,压缩率降低。
改进思路:结合场景分析,根据相邻帧之间的相似程度,确定I帧,进而获取完整的GOP图像组结构。
- 量化步长:量化步长越小,画质越好。
- 运动估计时搜索窗口的大小。
- 宏块的大小:为了提高压缩率,可以设置更小的宏块
(参考论文《基于云边协同的多屏幕图像实时优化上传方法》)
主要思想:将与相邻帧异常程度较高的图像帧作为I帧