H.264编码简析

相关概念

  1. H.264MPEG-4 AVC关系:
    可以参考quora的相关回答——h.264ITU-T下的VCEG(Video Coding Experts Group)组织制定的关于视频编码的标准;而类似的标准对应在ISO MPEG-4 Part 10, Advanced Video Coding(即ISO MPEG-4 AVC)也被定义了,并且两个标准基本保持同步。

    由于MPEG-4是一系列音视频编码标准的集合,因此h.264不等同于MPEG-4,而只是对应它的一个子集MPEG-4 AVC

    h.264h.265是标准,而x264x265是具体的实现。

  2. VCLNAL

    VCL:包括核心压缩引擎和块、宏块和切片的语法级别定义,设计目标是尽可能地独立于网络进行高效的编码;
    NAL:负责将 VCL 产生的比特字符串适配到各种各样的网络和多元环境中,覆盖了所有片级以上的语法级别;NAL是 H.264 为适应网络传输应用而制定的一层数据打包操作;

    NALU分为两类:VCLno-VCLnal_unit_type等于1-5的为VCL,其他的均为non-VCL

nal_unit_type content of NAL unit & RBSP synstax structure
1 coded slice of a non-IDR picture
2 coded slice data partition A
3 coded slice data partition B
4 coded slice data partition C
5 coded slice of an IDR picture
  1. 码流格式:
    H.264有两种码流格式Annex-BAVCCH.265有两种码流格式Annex-BHVCC

    Annex-B: ([start code] NALU) | ([start code] NALU)
    AVCC: ([extradata]) | ([length] NALU) | ([length] NALU)
    

    Annex-B中,start code0x0000010x00000001;使用起始码的目的是用于分割不同的NALU;通常用于实时流媒体文件中,该类型通常在每个关键帧之前都有周期性的SPSPPS;典型的格式为TS;该类型不提供音视频的长度,不利于seek定位;
    对于AVCCSPSPPS等解码参数位于extradata中;[length]字节数决定于avcc extradata中的NALULengthSizeMinusOne[length]值取决于NALU的长度;AVCC的优势在于,由于其编解码相关的参数都位于extradata中,可以调到流的中间播放;因此常用于随机访问的多媒体数据;典型的格式有MP4MKV

  2. 输入信号:Progressive FrameInterlaced Frame
    Progressive Video:表示从上至下逐行扫描;通常使用字母p表示,比如目前常见的电影等视频为720p1080p等;

    Interlaced Video:隔行扫描,分为奇数场和偶数场,每帧图像由奇数场和偶数场组成;通常使用字母i表示,出现较早,广泛应用于模拟电视信号中,比如NTSC标准中的模拟电视信号为480i
    这样可以提升帧率,避免闪烁,同时对硬件设备要求不是很高;

  3. 图像分割

    1. slices:一幅图像可以分割为1或多个slices,每个slices是独立自给自足的;slices由一系列的宏块(macroblock)组成;设置slice的目的是其独立性可以避免预测误差的扩散和传输;每个slice内的宏块不会与其他slice中的宏块为参考,并且slice编码后会打包进一个NALU,所以传输时是独立的;

      slice的类型: 0-P slice;1-B slice;2-I slice;3-SP slice;4-SI slice;

    2. macroblock:是基本的语义和处理单元,是视频信息的主要承载者;每个slices中的macroblock是相互依赖的;macroblock可以被进一步分割;
      H.264编码简析_第1张图片
      H.264编码简析_第2张图片

  4. Field CodingFrame Coding:场编码与帧编码
    Field Coding:每一场编码为独立的图片,并且使用场信息进行运动补偿;
    Frame Coding:该类型存在两种方式,类型一为完整的一帧编码为一个独立的图片,类型二为该帧以宏块对的形式扫描,每个宏块对可以使用frame codingfield coding

  5. H.264的压缩方法:

    1. 帧内预测:主要处理空域的数据冗余,为一帧中的每个宏块找出最相近的预测模式,然后将预测模式与对应的残差信号保存用于解码;
    2. 帧间预测:主要处理时域上的数据冗余,主要是运动估计与运动补偿方式;
    3. DCT:主要处理频域的数据冗余,一般对帧内预测和帧间预测后的残差信号进行DCT处理;DCT具有能量聚集的特性,声音、视频等信号的能量大都集中在DCT变换后的低频信号;将视频信号进行DCT变换,然后降低高频分量占比(音视频细节,人眼对高频分量不敏感)然后采用熵编码,可以有效提高压缩率;
    4. CABAC:context-adaptive binary arithmetic coding,内容自适应二元算数编码,是H.264/AVC熵编码的一种;H.264/AVC标准定义了两种熵编码类型:CABACVLC(Variable-length Coding);残差信号做完DCT后需要进一步使用CABAC进行无损压缩;
  6. I帧B帧P帧

    1. I帧:关键帧,采用帧内预测(IDR:首个I帧
    2. B帧:双向参考帧,采用帧间压缩
    3. P帧:前向参考帧,采用帧间压缩

    由于采用的压缩方式不同,它们占用的比特数也不同,一般I帧 > P帧 > B帧;当然压缩率的代价是压缩速率和性能,由于B帧需要双向数据作为参考,因此缓存的数据也更多,对硬件的要求等也越高;因此,部分视频只有I帧P帧

    H.264编码简析_第3张图片

  7. 帧分组
    视频压缩的主要方向是时域和空域,由于相邻的两帧之间通常相似度比较高,将基础信息记录在一帧,然后后续帧使用残差信号表示,就可以得到完整信息;一般,通过宏块扫描和搜索,如果相邻的几帧图像的差别像素不超过10%,亮度差值变化不超过2%,色度差值变化不超过1%,则可以将这些帧分为一帧;

    将这样的帧分组编码后就得到了GOP。

  8. GOP
    Group of Pictures,图像组;每个GOP中仅有一个I帧GOP size为两个I帧之间的帧数;GOP一般使用2个数字描述——分别表示I/P之间的间隔及GOP size;如M=3,N=12,则对应的GOP为:
    IBBPBBPBBPBB(I)

    码率一定时,一定条件下提高GOP size,可以提升P、B帧的占比,因此可以获得较好的图像质量(P、B具有更好的压缩率);

    当然,P、B帧也具有更高的复杂度,过大的GOP size也会影响编码效率,同时影响seek定位操作的响应速度;

  9. PTSDTS
    根据I、B、P的关系,如果按照顺序进行传输时,序列为I->B->P;这时在解码端收到序列时由于B帧需要依赖于P帧的信息,这时候传输顺序和解码顺序不一致,B帧和P帧的解码和显示时间就变得不确定了,因此引入了PTSDTS

    PTSPresentation Time Stamp,显示时间戳,用于表示什么时候去显示该帧;
    DTSDecode Time Stamp,解码时间戳,用于表示什么时候去解码该帧;

    如果没有B帧,那么传输顺序与解码顺序是一致的;

  10. 运动估计与补偿
    编码器从缓存区取出前两帧视频进行宏块扫描,如果发现前一帧中有物体,则会在第二帧的对应搜索窗口内进行搜索。如果找到该物体,那么通过比较这两帧图像可以得到运动物体相关的矢量(大小和方向),将两者相减得到的差值就是补偿数据,第二帧图像的完整数据可以根据前一帧图像的数据及补偿数据进行完全恢复;

  11. 帧内预测

    人眼对图象都有一个识别度,对低频的亮度很敏感,对高频的亮度不太敏感。所以基于一些研究,可以将一幅图像中人眼不敏感的数据去除掉。这样就提出了帧内预测技术。

    H264的帧内压缩与JPEG很相似。一幅图像被划分好宏块后,对每个宏块可以进行 9 种模式的预测(9)。找出与原图最接近的一种预测模式。

    然后,将原始图像与帧内预测后的图像相减得残差值。再将我们之前得到的预测模式信息一起保存起来,这样我们就可以在解码时恢复原图了
    H.264编码简析_第4张图片

  12. Access Unit
    H.264编码简析_第5张图片

    H.264编码简析_第6张图片

H.264层级结构

根据官方文档,h.264主要有两部分构成——VCL & NAL;如下,是h.264的层级结构示意图;

  1. VCL
    涉及到的包括:图像分割及交错处理、编码器结构、运动补偿预测、帧内预测、预测残差编码、去块效应滤波器等;VCL主要负责有效处理视频数据

    VCL的新特性:

    • 增强的运动补偿;
    • 小区块使用变换编码
    • 提升的去块效应滤波器
    • 提升的熵编码
  2. NAL
    NAL Units 及 type;RTP负载及字节流格式;NAL主要是比特流的处理和封装,保证能够正确地进行网络传输和解码;

H.264编码简析_第7张图片
H.264编码简析_第8张图片

编码流程

简述: 输入视频被分割为若干个16x16的宏块作为视频输入信号,通过裁剪、量化、运动估计、帧内预测、运动补偿等将多个输出信号及控制信号进行熵编码得到输出码流;

如下图一,编码的过程基本分为预测(时/空域:帧内、帧间)、变换(频域:DCT)、量化(模拟到离散,降采样)和熵编码(CABAC等);
H.264编码简析_第9张图片

H.264编码简析_第10张图片

编解码流程

H.264编码简析_第11张图片

参考文献

  1. H.264/AVC Video Coding Standard H.264/AVC Video Coding Standard
  2. H264基本原理
  3. 深入浅出理解视频编码H264结构

你可能感兴趣的:(视频编码,H.264/AVC,GOP,运动估计与补偿,帧间预测,PTS与DTS)