写点什么

文档 06-H264 解码流程,android 实战开发项目阅读器

用户头像
Android架构
关注
发布于: 1 小时前

? H264 采用的核心算法是帧内压缩和帧间压缩,帧内压缩是生成 I 帧的算法,帧间压缩是生成 B 帧和 P 帧的算法。


----------------------


序列的说明


----------------------


? 在 H264 中图像以序列为单位进行组织,一个序列是一段图像编码后的数据流,以 I 帧开始,到下一个 I 帧结束。


? ***一个序列的第一个图像叫做 IDR 图像(立即刷新图像),IDR 图像都是 I 帧图像。***H.264 引入 IDR 图像是为了解码的重同步,当解码器解码到 IDR 图像时,立即将参考帧队列清空,将已解码的数据全部输出或抛弃,重新查找参数集,开始一个新的序列。****这样,如果前一个序列出现重大错误,在这里可以获得重新同步的机会。IDR 图像之后的图像永远不会使用 IDR 之前的图像的数据来解码。


? 一个序列就是一段内容差异不太大的图像编码后生成的一串数据流。当运动变化比较少时,一个序列可以很长,因为运动变化少就代表图像画面的内容变动很小,所以就可以编一个 I 帧,然后一直 P 帧、B 帧了。当运动变化多时,可能一个序列就比较短了,比如就包含一个 I 帧和 3、4 个 P 帧。


-----------------------


三种帧的说明


-----------------------


I 帧:帧内编码帧,I 帧表示关键帧,你可以理解为这一帧画面的完整保留;解码时只需要本帧数据就可以完成(因为包含完整画面)


I 帧特点:1.它是一个全帧压缩编码帧。它将全帧图像信息进行 JPEG 压缩编码及传输;2.解码时仅用 I 帧的数据就可重构完整图


《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
浏览器打开:qq.cn.hn/FTe 免费领取
复制代码


像;3.I 帧描述了图像背景和运动主体的详情;4.I 帧不需要参考其他画面而生成;5.I 帧是 P 帧和 B 帧的参考帧(其质量直接影响到同组中以后各帧的质量);6.I 帧是帧组 GOP 的基础帧(第一帧),在一组中只有一个 I 帧;7.I 帧不需要考虑运动矢量;8.I 帧所占数据的信息量比较大。


P 帧:前向预测编码帧。P 帧表示的是这一帧跟之前的一个关键帧(或 P 帧)的差别,解码时需要用之前缓存的画面叠加上本帧定义的差别,生成最终画面。(也就是差别帧,P 帧没有完整画面数据,只有与前一帧的画面差别的数据)


P 帧的预测与重构:P 帧是以 I 帧为参考帧,在 I 帧中找出 P 帧“某点”的预测值和运动矢量,取预测差值和运动矢量一起传送。在接收端根据运动矢量从 I 帧中找出 P 帧“某点”的预测值并与差值相加以得到 P 帧“某点”样值,从而可得到完整的 P 帧。P 帧特点:1.P 帧是 I 帧后面相隔 1~2 帧的编码帧;2.P 帧采用运动补偿的方法传送它与前面的 I 或 P 帧的差值及运动矢量(预测误差);3.解码时必须将 I 帧中的预测值与预测误差求和后才能重构完整的 P 帧图像;4.P 帧属于前向预测的帧间编码。它只参考前面最靠近它的 I 帧或 P 帧;5.P 帧可以是其后面 P 帧的参考帧,也可以是其前后的 B 帧的参考帧;6.由于 P 帧是参考帧,它可能造成解码错误的扩散;7.由于是差值传送,P 帧的压缩比较高。


B 帧:双向预测内插编码帧。B 帧是双向差别帧,也就是 B 帧记录的是本帧与前后帧的差别(具体比较复杂,有 4 种情况,但我这样说简单些),换言之,要解码 B 帧,不仅要取得之前的缓存画面,还要解码之后的画面,通过前后画面的与本帧数据的叠加取得最终的画面。B 帧压缩率高,但是解码时 CPU 会比较累。


B 帧的预测与重构 B 帧以前面的 I 或 P 帧和后面的 P 帧为参考帧,“找出”B 帧“某点”的预测值和两个运动矢量,并取预测差值和运动矢量传送。接收端根据运动矢量在两个参考帧中“找出(算出)”预测值并与差值求和,得到 B 帧“某点”样值,从而可得到完整的 B 帧。B 帧特点 1.B 帧是由前面的 I 或 P 帧和后面的 P 帧来进行预测的;2.B 帧传送的是它与前面的 I 或 P 帧和后面的 P 帧之间的预测误差及运动矢量;3.B 帧是双向预测编码帧;4.B 帧压缩比最高,因为它只反映丙参考帧间运动主体的变化情况,预测比较准确;5.B 帧不是参考帧,不会造成解码错误的扩散。


注:I、B、P 各帧是根据压缩算法的需要,是人为定义的,它们都是实实在在的物理帧。一般来说,I 帧的压缩率是 7(跟 JPG 差不多),P 帧是 20,B 帧可以达到 50。可见使用 B 帧能节省大量空间,节省出来的空间可以用来保存多一些 I 帧,这样在相同码率下,可以提供更好的画质。


--------------------------------


压缩算法的说明


--------------------------------


h264 的压缩方法:


1.分组:把几帧图像分为一组(GOP,也就是一个序列),为防止运动变化,帧数不宜取多。2.定义帧:将每组内各帧图像定义为三种类型,即 I 帧、B 帧和 P 帧;3.预测帧:以 I 帧做为基础帧,以 I 帧预测 P 帧,再由 I 帧和 P 帧预测 B 帧;4.数据传输:最后将 I 帧数据与预测的差值信息进行存储和传输。


? 帧内(Intraframe)压缩也称为空间压缩(Spatialcompression)。当压缩一帧图像时,仅考虑本帧的数据而不考虑相邻帧之间的冗余信息,这实际上与静态图像压缩类似。帧内一般采用有损压缩算法,由于帧内压缩是编码一个完整的图像,所以可以独立的解码、显示。帧内压缩一般达不到很高的压缩,跟编码 jpeg 差不多。


? 帧间(Interframe)压缩的原理是:相邻几帧的数据有很大的相关性,或者说前后两帧信息变化很小的特点。也即连续的视频其相邻帧之间具有冗余信息,根据这一特性,压缩相邻帧之间的冗余量就可以进一步提高压缩量,减小压缩比。帧间压缩也称为时间压缩(Temporalcompression),它通过比较时间轴上不同帧之间的数据进行压缩。帧间压缩一般是无损的。帧差值(Framedifferencing)算法是一种典型的时间压缩法,它通过比较本帧与相邻帧之间的差异,仅记录本帧与其相邻帧的差值,这样可以大大减少数据量。


顺便说下有损(Lossy )压缩和无损(Lossyless)压缩。无损压缩也即压缩前和解压缩后的数据完全一致。多数的无损压缩都采用 RLE 行程编码算法。有损压缩意味着解压缩后的数据与压缩前的数据不一致。在压缩的过程中要丢失一些人眼和人耳所不敏感的图像或音频信息,而且丢失的信息不可恢复。几乎所有高压缩的算法都采用有损压缩,这样才能达到低数据率的目标。丢失的数据率与压缩比有关,压缩比越小,丢失的数据越多,解压缩后的效果一般越差。此外,某些有损压缩算法采用多次重复压缩的方式,这样还会引起额外的数据丢失。


H264 层次构成


H264 标准是由 JVT(Joint Video Team,视频联合工作组)组织提出的新一代数字视频编码标准。JVT 于 2001 年 12 月在泰国 Pattaya 成立。它由 ITU-T 的 VCEG(视频编码专家组)和 ISO/IEC 的 MPEG(活动图像编码专家组)两个国际标准化组织的专家联合组成。JVT 的工作目标是制定一个新的视频编码标准,以实现视频的高压缩比、高图像质量、良好的网络适应性等目标 H264 标准。H264 标准将作为 MPEG-4 标准的一个新的部分(MPEG-4 part.10)而获得批准,是一个面向未来 IP 和无线环境下的新数字视频压缩编码标准。


H264 标准的主要特点如下:


1.更高的编码效率:同 H.263 等标准的特率效率相比,能够平均节省大于 50%的码率。


2.高质量的视频画面:H.264 能够在低码率情况下提供高质量的视频图像,在较低带宽上提供高质量的图像传输是 H.264 的应用亮点。


3.提高网络适应能力:H.264 可以工作在实时通信应用(如视频会议)低延时模式下,也可以工作在没有延时的视频存储或视频流服务器中。


4.采用混合编码结构:同 H.263 相同,H.264 也使用采用 DCT 变换编码加 DPCM 的差分编码的混合编码结构,还增加了如多模式运动估计、帧内预测、多帧预测、基于内容的变长编码、4x4 二维整数变换等新的编码方式,提高了编码效率。


5.H.264 的编码选项较少:在 H.263 中编码时往往需要设置相当多选项,增加了编码的难度,而 H.264 做到了力求简洁的“回归基本”,降低了编码时复杂度。


6.H.264 可以应用在不同场合:H.264 可以根据不同的环境使用不同的传输和播放速率,并且提供了丰富的错误处理工具,可以很好的控制或消除丢包和误码。


7.错误恢复功能:H.264 提供了解决网络传输包丢失的问题的工具,适用于在高误码率传输的无线网络中传输视频数据。


8.较高的复杂度:264 性能的改进是以增加复杂性为代价而获得的。据估计,H.264 编码的计算复杂度大约相当于 H.263 的 3 倍,解码复杂度大约相当于 H.263 的 2 倍。


H264 标准各主要部分有 Access Unit delimiter(访问单元分割符),SEI(附加增强信息),primary coded picture(基本图像编码),Redundant Coded Picture(冗余图像编码)。还有 Instantaneous Decoding Refresh(IDR,即时解码刷新)、Hypothetical Reference Decoder(HRD,假想码流调度器)、Hypothetical Stream Scheduler(HSS,假想参考解码)。


主要部分结构如图 3.18 所示:



H.264 的目标应用涵盖了目前大部分的视频服务,如有线电视远程监控、交互媒体、数字电视、视频会议、视频点播、流媒体服务等。H.264 为解决不同应用中的网络传输的差异。定义了两层:视频编码层(VCL:Video Coding Layer)负责高效的视频内容表示,网络提取层(NAL:Network Abstraction Layer)负责以网络所要求的恰当的方式对数据进行打包和传送。如图 3.19 所示。



基本层次(Baseline Profile):该层次使用了 H.264 的除了 B-Slices,CABAC 以及交织编码模式外所有的特性。该层次主要使用于低时延的实时应用场合。


主要层次(Main Profile):包含 Baseline profile 的所有特性,并包括了 B-slices,CABAC 以及交织编码模式。它主要针对对时延要求不高,当压缩率和质量要求较高的场合。


扩展层次(Profile X):支持所有 Baseline profile 的特性,但不支持 CABAC 以及基于宏块的自适应帧场编码。该层次主要针对的时各种网络视频流传输方面的应用。


CABAC


CABAC 是基于内容的自适应二进制算术编码,当参数 entropy_coding_mode 设置为 1 时,一个算术系统被用来编码和解码 H.264 的语法元素。


H.264 采用两种方法进行熵编码:CAVLC 编码和 CABAC 编码算法。采用基于上下文的自适应二进制算术编码算法(CABAC),能够充分利用上下文信息和算术编码的优点,使得编码后的平均码长更逼近图像的信息熵,达到最佳的编码效率。采用 CABAC 算法进行编码,可以提高大约 10%的编码率


具体编码步骤:


1 二值化:CABAC 使用二进制算术编码,所以要将数据先转换为二进制数据,这些原始数据包括变换系数和运动矢量等。转换后二进制数据为可变长编码的数据,并且还要将这些数据进行算术编码。


2 内容模式选择:内容模式是针对二进制数据进行统计的概率模型,这个模式根据之前编码的一些数据符号的统计特性从一些可选模式中选出。内容模式存储了每一位“1”或“0”的概率。


3 算术编码:算术编码器根据选择的内容模式对每一位进行编码。


4 概率校正:被选择的内容模式根据实际被编码的值进行校正,例如,如果数据比特流中有数值“1”,就将“1”的概率统计值加 1。


DCT 变换


H.264 仍然采用对残差信号进行变换在量化后进行熵编码的模式来压缩空间冗余信息。使用了类似于 4x4 离散余弦变换 DCT 的整数变换而不是象 MPEG4 那样采用 8x8DCT 的浮点数变换。最终使用那种变换方式还用根据残余数据类型的不同来选择,帧内编码宏块的亮度 DC 系数(仅对 16x16 预测模式有效)采用 4x4 的矩阵,色度 DC 系数采用 2x2 的矩阵,对于其他的都采用 4X4 的块来变换。


使用以整数为基础的空间变换可以提高计算速度(只使用加法和位移运算),但是使用整数变换要以不矢精确度为前提;整数变换的反变换过程中不会出现较大的误差,并且缩放矩阵的乘法集成到了量化中,降低了乘法的总次数。


(1)4×4 亮度分量的直流系数变换


如果宏块被编码为 16×16 帧内模式,则每个 4×4 残差块首先用前面叙述的变换进行变换,然后对于每个 4×4 的变换后的直流(DC)系数进行 4×4 的二次变换,采用 Hadamard 变换。正变换为:




其中 A 是变换核矩阵 a=1/2







(2)2×2 色度块的 DC 系数变换


每个宏块内的 4 个 4×4 色度块经过变换后,每个块的 DC 系数构成了一个 2×2 的块 WD,对其进行 2×2 的 Hadamard 变换。


正变换的公式为:



反变换公式为:



(3)如图 3.18 所示,展示了宏块中的变换块及其传送顺序。编号为-1 的块在采用 Intra16x16 模式编码时 0-15 号 4x4 子块经整数 DCT 变换后的 DC 系数在经 4x4 的哈达变换的结果。块 16、17 是色度块的 DC 系数进行 2x2 哈达码变换的结果。其余的 24 块则进行 4x4 整数变换。



多种运动补偿块


有 7 种形状的运动补偿可供选用,这 7 种块是:INTER16x16,INTER16x8,INTER8x16,INTER8x8,INTER8x4,INTER4x8,INTER4x4。根据运动补偿采用的块尺寸的不同,宏块的编码模式分为四种,前三种模式分别按照一个 16x16 块、两个 16x8 块和两个 8x16 块来进行运动补偿;最后一种模式记作 P8x8,在 P8x8 模式下,一个宏块被分为 4 个 8x8 的子块,而每一个子块又有 4 种可能的子模式,分别按照一个 8x8 块、两个 8x4 块、两个 4x8 块及四个 4x4 块进行运动补偿,如图 3.19 所示,第一行是宏块四种模式,第二行是子块四种模式。




块大小的选择是否合理对于压缩效果的好坏有很大的影响,通常来说,对于变化缓慢的部分采用较大分块效果比较好,对于包含较多细节的部分则应该采用较小的分块方式。


1/4 像素精度运动估计


帧内编码宏块的每一分块都是由参考帧中相同大小的区域预测得到。这两个区域之间的偏移量即运动矢量。由于图像的运动不可能总是整像素的。因此引入了亚像素运动矢量。对亮度分量,运动矢量的分辨率为 1/4 像素。由于参考帧中本身不可能存在亚像素采样点,因此需要利用其临近像素内插产生亚像素采样点。亚像素采样点的内插产生过程,如图 3.20 所示



用户头像

Android架构

关注

还未添加个人签名 2021.10.31 加入

还未添加个人简介

评论

发布
暂无评论
文档06-H264解码流程,android实战开发项目阅读器