H264 FRExt
- H264最初版本只支持8bit量化,4:2:0色度采样,后来有一些应用 要求数据精度超过8bit/sample;色度要求使用4:2:2或者4:4:4;高分辨率或超高分辨率编码;超高保真度或部分无损编码。04年出现了fidenlity range extension
H264编码方法
- 采用块结构的混合编码框架,整个结构分为网络抽象层(NAL)和视频编码层(VCL)
- 每一帧分为一个或多个条带slice,每个条带包含多个宏块
- 宏块是H264基本编码单元
- H264对宏块的编码
- 宏块编码提供了更灵活的编码方式,相比于之前一个宏块或半个宏块的编码方式,提供了更高的预测精度
- 每一个宏块分割成多种不同大小的子块进行预测
- 帧内预测采用的块大小可能为16*16或者4*4
- 帧间预测或者运动补偿采用的块有7中不同的形状:16*16;8*8;16*8;8*4;4*8;4*4;8*16
- 针对预测残差数据进行变换编码的变换块大小为4*4或者8*8
- 效率更高的熵编码方法:CAVLC和CABAC
H264采用的编码工具
- 帧内预测:
- 根据当前相邻像素可能有相同的性质,利用相邻像素的相关性,采用新的帧内预测模式。使用空间域的左方与上方相邻像素预测当前编码的像素值,只对实际值和预测值的差值进行编码。以往的标准的帧内预测,是直接把像素快的数值进行变换,导致I帧包含大量信息,预测效率不高。MPEG-4、H263帧内预测数据由变换域实现
- 如果一个宏块为帧内宏块,亮度分量有两种分割模式一个是16*16像素块,或者是16个 4*4像素块。对于每个4*4像素块,共有9中预测模式,对于16*16像素块,共定义4中预测模式。
- 宏块中有2个8*8色度分量,有4种预测模式
- 帧间预测
- 采用运动补偿预测的方式
- 支持的帧间预测类型 P slice Bslice
- 更多种的块分割模式:从16*16到4*4 Mtype 16*16(0) 16*8(上0下1) 8*16(左0右1) 8*8(0 1 2 3);8*8type再继续分割成 8*8 8*4 4*8 4*4。每个区域包含自己的运动矢量,当选用区域较大时,用于表示运动矢量和区域选取的数据量减少,但运动补偿后的残差会增大,选用小区域,残差减小,预测更精确,用于表示运动矢量和区域选取的数据量增大。大区域适合反映帧间同质部分,小区域适合表现帧间细节部分。
- 更高的运动矢量精度:亮度MV可达1/4像素 MV的亚像素插值
- 变换和量化编码
- 对图像和残差数据采用4*4整数DCT变换,并不是像MPEG-2和MPEG-4那样采用8×8 DCT 的浮点数变换。
- 采用标量量化
- 扫描顺序:如果块是按帧模式编码的,那么就使用之字形扫描,如果是按场模式编码的,就是用场扫描。
- 无损熵编码
- 熵编码,无损。各种编码信息损失都来自量化
- 经典的熵编码算法:haffman、香浓-费诺编码
- h264针对不同的语法元素制定了不同的熵编码算法:(之前采用)UVLC指数哥伦布编码,CAVLC和CABAC
- 其他技术
- 环路去块滤波器:基于内容的抗块效应滤波器,当边界上两边图像差较小则使用滤波器使差别平滑掉,若边界上图像特征明显则不使用滤波器,这样,既减弱块效应的影响,又避免滤掉图像的内容。同时在相同主观质量下使比特率减小5%-10%。H264对块效应滤波是基于4×4块边界的,16×16的亮度块有4条边界和4条垂直边界进行滤波,而8×8的色度分量只需要对其2条边界和2条垂直边界进行滤波
- 帧/场编码:把一帧图像拆成两场图像,其中一场采用帧内编码,而另一场则利用前一场的信息,进行运动补偿编码,提高压缩效率。在剧烈水平方向运动的场景下,图像的一些部分采用帧模式编码,另一部分采用场模式编码,H264支持在宏块级自适应的场帧编码模式转换。
- SI、Sp帧:switching P和switch I
- 码率控制
- 面向IP和无线环境
- 除了利用量化步长的改变来适应信道码率外,还常利用数据分割的方法来应对信道码率的变化。
- 数据分割的概念是在编码器中生成具有不同优先级的视频数据以支持网络中的服务质量,例如采用基于语法的数据分割(syntaxbaseddatapartitioning,将每帧数据按其重要性分为几部分,允许在缓冲区溢出时丢弃不太重要的信息,还可以采用类似的时间数据分割temporaldatapartitioning)