FFMpeg/H.264/AVC视频简介(笔记)

H.264/AVC视频编解码技术详解- https://blog.csdn.net/shaqoneal/article/list/1

> FFMpeg

-- 使用FFMpeg进行视频编码的主要流程如:
 1.首先解析、处理输入参数,如编码器的参数、图像的参数、输入输出文件;
 2.建立整个FFMpeg编码器的各种组件工具,顺序依次为:avcodec_register_all -> avcodec_find_encoder -> avcodec_alloc_context3 -> avcodec_open2 -> av_frame_alloc -> av_image_alloc;
 3.编码循环:av_init_packet -> avcodec_encode_video2(两次) -> av_packet_unref
 4.关闭编码器组件:avcodec_close,av_free,av_freep,av_frame_free

  -- FFMpeg解码器的流程与编码器类似,只是中间需要加入一个解析的过程。整个流程大致为:
1.读取码流数据 -> 2.解析数据,是否尚未解析出一个包就已经用完?是返回1,否继续 -> 3.解析出一个包?是则继续,否则返回上一步继续解析 -> 4.调用avcodec_decode_video2进行解码 -> 5.是否解码出一帧完整的图像?是则继续,否则返回上一步继续解码 -> 6.写出图像数据 -> 返回步骤2继续解析。
  -- FFMpeglibavfilter库实际上实现的是视频的滤镜功能,除了水印之外,还可以实现视频帧的灰度化、平滑、翻转、直方图均衡、裁剪等操作。
  -- FFMpeg提供了libswscale库,可以轻松实现视频的分辨率转换功能。除此之外,libswscale库还可以实现颜色空间转换等功能。FFMpeg中libswscale库也是针对AVFrame结构进行缩放处理。视频缩放的主要思想是对视频进行解码到像素域后,针对像素域的像素值进行采样或差值操作

 视频信号的表示方法:RGB与YUV。在实际的编解码等视频处理的过程中,YUV格式比RGB格式更为常用。在YUV格式中,一个像素由亮度分量和色度分量表示,每一个像素由一个亮度分量Y和两个色度分量U/V组成。亮度分量可以与色度分量一一对应,也可以对色度分量进行采样,即色度分量的总量少于亮度分量。

> H.264/AVC视频编解码技术,标准化组织
 -- 从事视频编码算法的标准化组织主要有两个,ITU-T和ISO。
  1.ITU-T,全称International Telecommunications Union - Telecommunication Standardization Sector,即国际电信联盟——电信标准分局。该组织下设的VECG(Video Coding Experts Group)主要负责面向实时通信领域的标准制定,主要制定了H.261/H263/H263+/H263++等标准。
  2.ISO,全称International Standards Organization,即国际标准化组织。该组织下属的MPEG(Motion Picture Experts Group),即移动图像专家组主要负责面向视频存储、广播电视、网络传输的视频标准,主要制定了MPEG-1/MPEG-4等。
  实际上,真正在业界产生较强影响力的标准均是由两个组织合作产生的。比如MPEG-2、H.264/AVC和H.265/HEVC等。
  为了专门处理视频信息中的多种冗余,视频压缩编码采用了多种技术来提高视频的压缩比率。其中常见的有预测编码、变换编码和熵编码等。
  3.Google:VP8/VP9;
  4.Microsoft : VC-1;
  5.国产自主标准:AVS/AVS+/AVS2

  -- 预测编码可以用于处理视频中的时间和空间域的冗余。视频处理中的预测编码主要分为两大类:帧内预测和帧间预测。
  帧内预测:预测值与实际值位于同一帧内,用于消除图像的空间冗余;帧内预测的特点是压缩率相对较低,然而可以独立解码,不依赖其他帧的数据;通常视频中的关键帧都采用帧内预测。
  帧间预测:帧间预测的实际值位于当前帧,预测值位于参考帧,用于消除图像的时间冗余;帧间预测的压缩率高于帧内预测,然而不能独立解码,必须在获取参考帧数据之后才能重建当前帧。
  在视频编码算法中通常使用正交变换进行变换编码,常用的正交变换方法有:离散余弦变换(DCT)、离散正弦变换(DST)、K-L变换等。

  视频编码中的熵编码方法主要用于消除视频信息中的统计冗余。由于信源中每一个符号出现的概率并不一致,这就导致使用同样长度的码字表示所有的符号会造成浪费。通过熵编码,针对不同的语法元素分配不同长度的码元,可以有效消除视频信息中由于符号概率导致的冗余。
  在视频编码算法中常用的熵编码方法有变长编码和算术编码等,具体来说主要有上下文自适应的变长编码(CAVLC)和上下文自适应的二进制算术编码(CABAC)。

【H.264/AVC视频编解码技术详解】二. 主流视频编码标准的发展- https://blog.csdn.net/shaqoneal/article/details/52081001


  > H.261标准
 --从H.261开始,视频编码方法采用了沿用至今的基于波形的混合编码方法。H.261标准主要目标是用于视频会议和可视电话等高实时性、低码率的视频图像传输场合。
 -- H.261信源编码所采用的技术:
 1.帧内编码/帧间编码判定:根据帧与帧之间的相关性判定——相关性高使用帧间编码,相关性低使用帧内编码。
 2.帧内编码:对于帧内编码帧,直接使用DCT编码8×8的像素块。
 3.帧间编码/运动估计:使用以宏块为基础的运动补偿预测编码;当前宏块从参考帧中查找最佳匹配宏块,并计算其相对偏移量(Vx, Vy)作为运动矢量;编码器使用DCT、量化编码当前宏块和预测宏块的残差信号;
 4.环路滤波器:实际上是一个数字低通滤波器,滤除不必要的高频信息,以消除方块效应;

 -- 经过H.261码流复合器输出的码流,总共可以分为四层,从上到下分别为帧层、块组层、宏块层和块层。每一层按照不同的封装格式包含了头信息和下一层的结构。
 1.帧层:由帧首和块组数据构成;帧首包括帧起始码( PSC)、帧计数码( TR)、帧类型( PTYPE)等;
 2.块组层:由块组首和宏块数据组成;块组首包括组起始码( GBSC)、块组编号码( GN)、块组量化步长等;
 3.宏块层(Macroblock,MB):由宏块首和块数据构成;宏块首包括宏块地址码、宏块类型、宏块量化步长、运动矢量数据、编码模式等;
 4.块层:包括每个8×8块的DCT系数按之字形扫描后的熵编码码流,以块结束符结尾

 > H.263标准
  H.263是相对于H.261的改进标准,同样以低码率视频通信为目标,但是具有更好的压缩效率。与H.261相比,H.263支持更多种分辨率的图像格式:
 Sub-QCIF: 128×96;QCIF: 176×144;
 CIF:352×288;4CIF:704×576;16CIF:1480×1152;

 除了更多的分辨率选择之外,视频信源编码算法也相比H.261实现了多项改进。
 1.运动矢量:相比于H.261,H.263的运动矢量分配更加灵活。在H.261中,每一个MB分配一个运动矢量;H.263中支持对每一个8×8像素块各自使用一个运动矢量。
 2.MV精度:H.261只支持整数像素的运动矢量,在H.263中运动矢量精度为1/2像素。
 3.双向预测模式:H.263的帧间编码帧除了P帧之外,也支持B帧,使用前后双向预测模式。
 4.熵编码:采用了算术编码,以较高的运算复杂度换取更高的编码效率。

 > MPEG-1标准
  MPEG-1是国际标准化组织ISO下属的移动图像专家组负责制定的早期视频压缩标准,主要用于视频信息的存储、广播电视和网络传输应用。其中在VCD中保存的视频信息便使用MPEG-1标准进行压缩,其码率越为1.2~1.5Mb/s。

  MPEG-1标准所支持的图像类型与H.263类似,支持I、B、P帧类型:
 1.I帧:帧内编码帧,采用帧内编码,可作为P/B帧的参考帧;
 2.P帧:前向预测帧,采用帧间编码,以I/P帧作为参考帧;
 3.B帧:双向预测帧,参考前后两个方向的参考帧;

 > MPEG-2标准
  MPEG-2标准是ITU-T和ISO合作制定的编码标准,其视频部分也称作H.262标准,其标准编号为ISO-13818。ISO-13818是一系列标准的集合,包括了系统、视频、音频、一致性、参考软件等10个部分。MPEG-2标准在数字电视广播和音视频媒体容器等场合得到了广泛应用,常见的DVD视盘采用的就是MPEG-2视频编码方法。
  MPEG-2格式的主要改进之处之一是支持支持逐行或者隔行扫描视频,使用基于帧或场的编码。在MPEG-2中,为适应隔行扫描视频信号的特点,在DCT、预测和运动估计算法中对帧和场进行了不同的处理。
  另一方面,MPEG-2根据不同的编码工具定义了5个Profile:简单SP、主要MP、SNR可分级SNP、空间可分级SSP和高级HP。根据视频分辨率的不同定义了4个Level:低级LL、主级ML、高-1440级High1440和高级HL。

 -- MPEG-2的码流分为三层:
 基本流:ES,由视频编码的视频基本流和音频编码的音频基本流构成
 打包基本流:PES,为音视频ES分别打包
 传输流、节目流:TS/PS,若干个PES进行复用后输出,分别用于传输和存储
 在MPEG-2的ES流层中,其码流结构采用了类似MPEG-1码流结构的分层封装的方法:

 -- 图像序列层:包括若干GOP,序列头包含起始码和序列参数等;
 图像组(GOP)层:包括若干图像,GOP头包括起始码、GOP标识等;
 图像层:包括若干个Slice,图像头中包括起始码和图像参数等;
 片(Slice)层:最小的同步单位,包括若干宏块,Slice头中包括起始码、片地址、量化步长等信息;
 宏块(Macroblock)层:由4个亮度块和2个色度块组成,宏块头包括地址、类型、MV等信息

 > MPEG-4标准
  MPEG-4是ISO与1999年颁布的视频编码标准。同前任的MPEG-1和MPEG-2相比,MPEG-4更注重多媒体系统的交互性、灵活性和可扩展性。MPEG-4的标准编号为ISO-14496,也包括多个部分,如系统、视觉信息、音频、一致性等。
  MPEG-4中最为显著的特点是采用了基于对象的编码。在MPEG-4中,一个视频对象主要定义为画面中分割出来的不同物体,每个物体由三类信息描述:运动信息、轮廓信息和纹理信息。MPEG-4通过编码这三类信息来实现对视频对象的编码。


> H.264

H.264简介- https://blog.csdn.net/shaqoneal/article/details/52081021
  H.264标准是属于MPEG-4家族的一部分,即MPEG-4系列文档ISO-14496的第10部分,因此又称作MPEG-4/AVC。同MPEG-4重点考虑的灵活性和交互性不同,H.264着重强调更高的编码压缩率和传输可靠性,在数字电视广播、实时视频通信、网络流媒体等领域具有广泛的应用。
  在H.264进行编码的过程中,每一帧的H图像被分为一个或多个条带(slice)进行编码。每一个条带包含多个宏块(MB,Macroblock)。宏块是H.264标准中基本的编码单元,其基本结构包含一个包含16×16个亮度像素块和两个8×8色度像素块,以及其他一些宏块头信息。在对一个宏块进行编码时,每一个宏块会分割成多种不同大小的子块进行预测。帧内预测采用的块大小可能为16×16或者4×4,帧间预测/运动补偿采用的块可能有7种不同的形状:16×16、16×8、8×16、8×8、8×4、4×8和4×4。相比于早期标准只能按照宏块或者半个宏块进行运动补偿,H.264所采用的这种更加细分的宏块分割方法提供了更高的预测精度和编码效率。在变换编码方面,针对预测残差数据进行的变换块大小为4×4或8×8(仅在FRExt版本支持)。相比于仅支持8×8大小的变换块的早期版本,H.264避免了变换逆变换中经常出现的失配问题。
  H.264标准中采用的熵编码方法主要有上下文自适应的变长编码CAVLC和上下文自适应的二进制算数编码CABAC,根据不同的语法元素类型指定不同的编码方式。通过这两种熵编码方式达到一种编码效率与运算复杂度之间的平衡。

  同前期标准类似,H.264的条带也具有不同的类型,其中最常用的有I条带、P条带和B条带等。另外,为了支持码流切换,在扩展档次中还定义了SI和SP片。
 1.I条带:帧内编码条带,只包含I宏块;
 2.P条带:单向帧间编码条带,可能包含P宏块和I宏块;
 3.B条带:双向帧间编码条带,可能包含B宏块和I宏块;

  视频编码中采用的如预测编码、变化量化、熵编码等编码工具主要工作在slice层或以下,这一层通常被称为“视频编码层”(Video Coding Layer, VCL)。相对的,在slice以上所进行的数据和算法通常称之为“网络抽象层”(Network Abstraction Layer, NAL)。设计定义NAL层的主要意义在于提升H.264格式的视频对网络传输和数据存储的亲和性。

为了适应不同的应用场景,H.264也定义了三种不同的档次:
  1.基准档次(Baseline Profile):主要用于视频会议、可视电话等低延时实时通信领域;支持I条带和P条带,熵编码支持CAVLC算法。
  2.主要档次(Main Profile):主要用于数字电视广播、数字视频数据存储等;支持视频场编码、B条带双向预测和加权预测,熵编码支持CAVLC和CABAC算法。
  3.扩展档次(Extended Profile):主要用于网络视频直播与点播等;支持基准档次的所有特性,并支持SI和SP条带,支持数据分割以改进误码性能,支持B条带和加权预测,但不支持CABAC和场编码。

  H.264中使用的编码技术主要有以下类型(H264核心算法):帧内预测;帧间预测;交错视频编码;变换和量化编码;无损熵编码算法.H.264还定义了包括去块环路滤波器、SI/SP帧、码率控制等多种技术。
  H.264的语法元素进行编码后,生成的输出数据都封装为NAL Unit进行传递,多个NAL Unit的数据组合在一起形成总的输出码流。对于不同的应用场景,NAL规定了一种通用的格式适应不同的传输封装类型。通常NAL Unit的传输格式分两大类:字节流格式和RTP包格式。

  在信息论中,香农提出了信源编码定理。该定理说明了香农熵与信源符号概率之间的关系,说明信息的熵为信源无损编码后的平均码字长度的下限。在实际使用中,常用的熵编码主要有变长编码和算术编码等方法。其中变长编码相对于算术编码较为简单,但平均压缩比可能略低。常见的变长编码方法有哈夫曼编码和香农-费诺编码等。
  指数哥伦布编码同样属于变长编码(VLC)的一种。指数哥伦布编码同哈夫曼编码最显著的一点不同在于,哈弗曼编码构建完成后必须在传递的信息中加入码字和码元值的对应关系,也就是编码的码表,而指数哥伦布编码则不需要。

指数哥伦布编码同哈夫曼编码的比较:
 1.哈夫曼编码在编码过程中考虑了信源各个符号的概率分布特性,根据符号的概率分布进行编码,因此对于不同的信源,即使是相同的符号的哈夫曼编码的结果也是不同的;指数哥伦布编码针对不同的信源采用的编码是统一的,因此无论是什么样的输入,输出的编码后的数据都是一致的。
 2.由于哈夫曼编码是针对信源特性进行的编码,因此在存储或传输编码后的数据之前必须在前面保存一份码表供解码段重建原始信息使用;而指数哥伦布编码不需要存储任何额外信息就可以进行解码。
 3.由于未考虑信源的实际特性,指数哥伦布编码的压缩比率通常比较低,对于有些信息甚至完全没有压缩效果,输出数据比原始数据更大,在这一点上哈夫曼编码作为“最优编码”在效率上更高;然而由于哈夫曼编码运算较指数哥伦布编码更为复杂,且必须保存码表信息增加了传输负荷,也对压缩比率造成了不利影响。

在H.264的各种语法元素中,SPS中的信息至关重要。SPS即Sequence Paramater Set,又称作序列参数集。SPS中保存了一组编码视频序列(Coded video sequence)的全局参数。所谓的编码视频序列即原始视频的一帧一帧的像素数据经过编码之后的结构组成的序列。而每一帧的编码后数据所依赖的参数保存于图像参数集中。

  除了序列参数集SPS之外,H.264中另一重要的参数集合为图像参数集Picture Paramater Set(PPS)。通常情况下,PPS类似于SPS,在H.264的裸码流中单独保存在一个NAL Unit中,只是PPS NAL Unit的nal_unit_type值为8;而在封装格式中,PPS通常与SPS一起,保存在视频文件的文件头中。
  整个H.264的码流结构可以分为两层:网络抽象层NAL和视频编码层VCL。在NAL层,H.264的码流表示为一系列的NAL Units,不同的NAL Units中包含不同类型的语法元素。
 一个Slice包含一帧图像的部分或全部数据,换言之,一帧视频图像可以编码为一个或若干个Slice。一个Slice最少包含一个宏块,最多包含整帧图像的数据。在不同的编码实现中,同一帧图像中所构成的Slice数目不一定相同。
  在H.264中设计Slice的目的主要在于防止误码的扩散。因为不同的slice之间,其解码操作是独立的。某一个slice的解码过程所参考的数据(例如预测编码)不能越过slice的边界。每一个Slice总体来看都由两部分组成,一部分作为Slice header,用于保存Slice的总体信息(如当前Slice的类型等),另一部分为Slice body,通常是一组连续的宏块结构(或者宏块跳过信息)。

 H.264的Slice Header解析,根据码流中不同的数据类型,H.264标准中共定义了5总Slice类型:
  I slice: 帧内编码的条带;
  P slice: 单向帧间编码的条带;
  B slice: 双向帧间编码的条带;
  SI slice: 切换I条带,用于扩展档次中码流切换使用;
  SP slice: 切换P条带,用于扩展档次中码流切换使用;
  在I slice中只包含I宏块,不能包含P或B宏块;在P和B slice中,除了相应的P和B类型宏块之外,还可以包含I类型宏块。

  预测残差等占据码流大量体积的数据则必须使用压缩率更高的算法,如CAVLC和CABAC等。H.264码流结构(如NAL Unit、Slice Header等)。
  CAVLC算法不是像指数哥伦布编码那样采用固定的码流-码字映射的编码,而是一种动态编码的算法,因而压缩比远远超过固定变长编码UVLC等算法。在H.264标准中,CAVLC主要用于预测残差的编码。

 -- 在编码过程中需要注意以下重要的语法元素:
  非零系数的个数(TotalCoeffs):取值范围为[0, 16],即当前系数矩阵中包括多少个非0值的元素;
  拖尾系数的个数(TrailingOnes):取值范围为[0, 3],表示最高频的几个值为±1的系数的个数。拖尾系数最多不超过3个,若超出则只有最后3个被认为是拖尾系数,其他被作为普通的非0系数;
  拖尾系数的符号:以1 bit表示,0表示+,1表示-;
当前块值(numberCurrent):用于选择编码码表,由上方和左侧的相邻块的非零系数个数计算得到。设当前块值为nC,上方相邻块非零系数个数为nA,左侧相邻块非零系数个数为nB,计算公式为nC = round((nA + nB)/2);对于色度的直流系数,nC = -1;
  普通非0系数的幅值(level):幅值的编码分为prefix和suffix两个部分进行编码。编码过程按照反序编码,即从最高频率非零系数开始。
  最后一个非0系数之前的0的个数(TotalZeros);
  每个非0系数之前0的个数(RunBefore):按照反序编码,即从最高频非零系数开始;对于最后一个非零系数(即最低频的非零系数)前的0的个数,以及没有剩余的0系数需要编码时,不需要再继续进行编码。

  H.264的变换编码(一)——矩阵运算与正交变换基本概念。在实际应用中,矩阵可以在多个技术领域发挥重要作用,如音视频压缩编码、机器学习、人工智能等领域。
  在H.264及更新的视频压缩标准中,采用的是DCT的优化改进版——整数变换。相对于浮点类型的离散余弦变换,整数变换有效降低了变换操作的运算复杂度,提升了编解码器的运行效率。
  变换和量化编码在图像和视频的压缩编码中具有重要作用。通过变换编码,空间域信息可以被转换到频率域,使其能量集中于低频区域,并使其码率相对于空间信号有大幅下降。H.264定义了4×4的整数离散余弦变换(简称整数变换),相对浮点数的离散余弦变换,整数变换具有更低的运算复杂度,更适用于移动设备等适用于低功耗的设备运行。
  量化运算实际上并非视频压缩领域首先使用的。在通信信号处理等领域,量化技术早就获得广泛的应用。在模拟-数字信号转化过程中,首先需要对模拟信号按照某个频率进行采样,获得离散时间信号,其取值范围为一个连续区间。此时的离散时间信号尚不能称之为数字信号。
  为了对信号进行数字化,必须对离散时间信号进行量化,将连续的取值范围区间也进行离散化。这样的取值位置离散,采样值也是离散的信号称之为数字信号。
  对于16×16的亮度块,变换量化的块包括两个部分:直流部分DC和交流部分AC。16×16亮度块的变换和量化依然要分为16个4×4个子块实现,而与4×4模式不同的是,16×16模式首先抽取出16个4×4系数矩阵的直流分量,组成一个新的4×4矩阵,再对这个直流矩阵进行Hadamard变换后再进行量化。对于4×4模式的色度分量,同样需要抽取直流分量进行Hadamard变换然后再进行量化。然而色度分量的大小为8×8,每个分量分为4个4×4个子块。

视频信息中通常包含的冗余有三种:空间冗余、时间冗余和统计冗余。处理这三种冗余信息通常采用不同的方式:
 1.空间冗余采用帧内预测编码压缩;
 2.时间冗余采用运动搜索和运动补偿压缩;
 3.统计冗余采用熵编码压缩。

  在各种视频帧类型中,I帧(包括IDR帧等)全部采用帧内预测,I帧的压缩比率通常比P和B帧更低,因此帧内预测编码的效率对视频整体平均码率具有较大影响。另一方面,I帧通常都会作为P/B帧解码过程中的参考帧,如果I帧的编码出现了错误,那么不仅仅是该I帧出现错误,参考该I帧的P/B帧也同样不能正确解码。
  在早期的视频编码标准中就已经存在了帧内编码的方法。如MPEG-1/MPEG-2等早期的标准中,帧的类型已经定义了I/P/B三种类型,分别表示帧内编码帧、预测编码帧和双向预测编码帧。然而在H.264/AVC之前的标准中,编码I帧时并未采用预测编码,只有编码P/B帧时采用了帧间预测编码。在MPEG-1/MPEG-2等编码标准中,I帧的编码采用的是DCT-RLC的方法进行编码。
  视频信息在输出码流之前需要经过量化操作。量化完成后的信息用数字化表示,其所需要的位数与表示信息的范围与方差有关。对于取值范围小、方差较小的信息,量化器所需要的比特范围就更小,每个像素数的比特位数便更小。统计表明,相比于原始的图像像素,预测残差的方差与动态范围远小于原始图像像素。通过预测编码,不仅降低了表示像素信息所需要的比特数,还可以保留视频图像的画面质量不至于降低。

在H.264中采用的算法主要可分为预测编码模式和PCM编码模式。
  预测编码并非H.264最先采用的技术。在早期的压缩编码技术中便采用了预测数据+残差的方法来表示待编码的像素。然而在这些标准中预测编码仅仅用于帧间预测来去除空间冗余,对于帧内编码仍然采用直接DCT+熵编码的方法,压缩效率难以满足多媒体领域的新需求。H.264标准深入分析了I帧中空间域的信息相关性,采用了多种预测编码模式,进一步压缩了I帧中的空间冗余信息,极大提升了I帧的编码效率,为H.264的压缩比取得突破奠定了基础。
  H.264的帧内预测算法通常可以分为三种情况讨论:4×4的亮度分量预测、16×16的亮度分量预测、色度分量预测。
 对于每一个帧内预测宏块,其编码模式可以分为I_4x4和I_16x16两种。对于I_4x4模式,该宏块的亮度分量被分为16个4×4大小的子块,每一个4×4大小的子块作为一个帧内预测的基本单元,针对每一个4×4像素块进行过预测与编码。
  帧内预测会参考每一个像素块的相邻像素来构建预测数据。对于某一个4×4的子块而言,该子块上方4个、右上方4个、左侧4个以及左上方顶点的1个像素,共13个像素会作为参考数据构建预测块
  除了帧内预测编码之外,H.264还定义了一种特殊的编码模式,即为I_PCM模式。I_PCM模式不对像素块进行预测-变换-量化操作,而是直接传输图像的像素值。在有些时候(如传输图像的不规则纹理信息,或低量化参数条件下),该模式比预测编码模式效率更高。

 熵编码是利用信息的统计冗余进行数据压缩的无损编码方法。H.264的算术编码,CABAC的全称为上下文自适应的二进制算术编码(Context-Adaptive Binary Arithmetic Coding, CABAC),是一种经过特殊设计的算术编码,其具体步骤主要有:
设定编码上下文;语法元素的二值化;算术编码;

 算术编码属于熵编码的一种重要的类型,其作用同变长编码等熵编码方法类似,用于压缩输入数据中的统计冗余,并且使用算术编码的压缩同样是无损压缩。
 哈夫曼编码在内的变长编码具有一个共同特点,就是针对每一个码元不同的概率,分配每个码元对应的码字。通常针对概率更高的码元,分配长度更短的码字;针对概率较低的码元,分配长度较长的码字。通过这种不同长度码字的分配使得整体输入信息的平均码字长度小于定长编码,达到数据压缩的效果。
  另一方面,由于采用这种变长度的编码方法,变长编码存在一项难以突破的性能瓶颈:即使是某一个输入信源的概率再高,也至少需要1个bit的码字。这种特性限制了编码性能进一步向信源熵逼近,也导致了无法进一步提升整体的压缩性能。
  算术编码的引入可以有效解决这个问题。算术编码的思想同变长编码完全不同,算术编码无法针对每一个输入码元准确细分出对应的码字。另外,变长编码可以针对短输入信息进行编码,而算术编码对类似一两个码元的输入信息通常没有任何意义,因为生成的码流长度通常更长。
  在算术编码执行的过程中,始终需要两个区间来计算,这两个区间即信源的概率区间和码流的编码区间。

 上下文自适应的二进制算术编码。H.264采用的为称作上下文自适应的二进制算术编码(Context-based Adaptive Binary Arithmetic Coding, CABAC)。CABAC算法是H.264中新引入的一种非常复杂的熵编码算法,专门用于视频的压缩编码。事实证明,在视频压缩编码领域,CABAC保持了强大的生命力,在H.264更新的标准H.265中继续保留了CABAC算法,并且废弃了CAVLC而将CABAC作为主要的熵编码方法。

 在CABAC中,主要步骤或算法可以分为3个步骤/类别:语法元素的二值化;上下文模型;算术编码;

猜你喜欢

转载自blog.csdn.net/shareus/article/details/80715494