H.264 视频编码器的研究与分析

H.264 视频编码器的研究与分析

郝瑞林

北京邮电大学网络技术研究院 北京(100876)

E-mail:ruilynn@gmail.com

摘 要:随着市场对多媒体信息传输需求的增加,多媒体信息传输如何适应不同信道传输特性的问题日益显现出来。H.264作为新一代视频编解码标准,它压缩性能优异,图像质量高,可满足各种不同速率、 不同场合的视频应用。 正因为功能的多样性, 使其编码方法异常复杂,因此本文分析了 H.264视频编码器的原理,对当今流行的 H.264编码器进行了性能比较,以X264开源编码器为例进行了源码级的分析,详细介绍了 X264中的函数流程与算法,并根据具体应用进行了不同参数设置的性能分析。 本文的分析能使用户对 H.264视频编码原理有更深入的认识,并为自己的应用设计独特的视频编码器,提高视频编码性能。

关键词:H.264;X264;视频编码

中图分类号:TP391

1. 引 言

视频编解码技术是流媒体技术的关键技术之一,从 H.261视频编码建议,到 H.262/3、MPEG-1/2/4等都有一个共同的不断追求的目标,即在尽可能低的码率(或存储容量)下获得尽可能好的图像质量。而且随着市场对图像传输需求的增加,如何适应不同信道传输特性的问题也日益显现出来。于是 IEO/IEC 和 ITU-T 两大国际标准化组织联手制定了视频新标准 H.264[1]来解决这些问题。

H.264/AVC引入了面向 IP包的编码机制,有利于网络中的分组传输,支持网络中视频的流媒体传输。H.264 具有较强的抗误码特性[2]

,可适应丢包率高、干扰严重的无线信道中的视频传输。H.264 支持不同网络资源下的分级编码传输,从而获得平稳的图像质量。H.264能适应于不同网络中的视频传输,网络亲和性好。

正因为功能的多样性,使其编码方法异常复杂,因此本文分析了 H.264 视频编码器的原理,对当今流行的 H.264编码器进行了比较,以 X264 开源编码器为例进行了源码级的分析,详细介绍了 X264 中的主要数据结构和函数调用关系,并根据具体应用进行了不同参数设置的性能分析。本文的分析能使用户对 H.264 视频编码原理有更深入的认识,并为自己的应用设计独特的视频编码器,提高视频编码性能。

2. H.264 编码器原理

2.1 H.264编码器的功能结构

如图 2-1 所示,H.264 标准压缩系统由视频编码层(Video Coding Layer,VCL)和网络提取层(Network Abstraction Layer,NAL)两部分组成[3]。VCL 层主要包括帧内预测,帧间预测、变换量化、熵编码等压缩单元。NAL 层则用于为 VCL 层提供一个与网络无关的统一接口,它负责对视频数据进行封装打包后使其在网络中传送,它采用统一的数据格式,包括单个字节的包头信息、多个字节的视频数据与组帧、逻辑信道信令、定时信息、序列结束信号等。包头中包含存储标志和类型标志。存储标志用于指示当前数据不属于被参考的帧。类型标志用于指示图像数据的类型。VCL 可以传输按当前的网络情况调整的编码参数。

2.2 H.264 编码器工作流程

如图 2-2 所示,编码器采用的是变换和预测的混合编码法。输入的帧或场 Fn 以宏块为单位被编码器处理[4]。首先,按帧内或帧间预测编码的方法进行处理。若采用帧内预测编码,其预测值 PRED 是由当前片中当前块的左侧和上侧已编码的象素点推出的,而如果采用帧间预测编码,其预测值 PRED 是由已编码的视频帧/场通过运动补偿得到的。预测值 PRED 和当前块相减后,产生一个残差块 Dn,经变换,量化后产生的变化系数 X 再经熵编码,与解码需要信息一起组成一个压缩码流, 经NAL 供传输和存储用。 为进一步提供预测用的参考图像,编码器还需要有重建图像的功能。 即将残差图像经反量化, 反变换后得到 Dn′与预测值PRED相加,得到 uFn′,经过滤波后得到 Fn′即为重建图像,可用于参考图像。

3. X264 开源编码器分析

3.1 三大开源编码器

目前 H.264的开源编码器主要有三类:JM,T264和 X264。JM 作为 H.264 的官方测试源码,由德国 hhi 研究所负责开发。它实现了 264 所有的特性,但其程序结构冗长,只考虑引入各种新特性以提高编码性能,忽视了编码复杂度,其编码复杂度极高,不宜实用。T264是中国视频编码自由组织联合开发的H.264编解码器, 编码器能编码输出标准的H.264码流,但解码器只能解 T264 编码器生成的码流,目前已经停止更新。X264 是网上自由组织联合开发的兼容 264 标准码流的编码器,它注重实用,和 JM 相比,在不明显降低编码性能的前提下,努力降低编码的计算复杂度,编码效率很高。

3.2 X264流程

因为 X264 编码器的高效率和高性能,应用之中较多使用,下面对 X264 进行源码分析,进一步分析 H.264 的编码器原理。

在 X264 编码器的调度中最重要的是 Encode 函数,是对整个视频序列的 H.264 编码。在函数中,首先进行了函数的初始化操作,然后判断是否已经编码完毕,如果没有则继续读取一帧数据到缓冲区,然后进行帧解码;如果编码完毕则退出编码流程。详细函数关系如图3-1 所示:

其中,x264_encoder_open()这个函数是对不正确的参数进行修改,并对各结构体参数和cabac 编码,预测等需要的参数进行初始化。x264_picture_alloc()这个函数分配能容纳一帧sizeof(x264_picture_t)字节数的空间,然后进行初始化。p_read_frame()这个函数就是一次读入一帧到刚分配的空间,这里的数据都是原始的视频图像数据。Encode_frame()这个函数对视频序列其中一帧进行 264 编码。x264_picture_clean()和 x264_encoder_close()两个函数主要是编码后的处理工作,如将帧数据全置零等。

在 Encode_frame() 函数中开始上文提到的 VCL 编码和 NAL 编码,其中x264_encoder_encode()函数为 VCL 层编码, 其详细流程如图 3-2所示。 其中, Setup new frame from picture 主要是将图片的原始数据赋值给一个未使用的帧,用于编码。Get frame to be encoded 主要是帧管理的操作,从编码帧的缓存中取出一帧来对他进行编码。Setup frame context 主要是对即将编码帧进行帧类型的预设定。 Init ,Write the bitstream主要是对参考列表的初始化,片头的初始化,以及对将编码后数据写入比特流进行传输。Update encoder state这部分是一帧编码后的编码器的更新处理部分,主要有参考帧的管理,去块滤波,象素内插等工作。Compute/Print statistics这部分并不属于编码的工作,只是对其中编码性能的统计计算和显示工作。

x264_slice_write()函数是编码中最重要的函数,以上所介绍的预测编码等都在这个函数中实现的。Init()函数主要是初始化的一些操作。x264_macroblock_cache_load()函数主要是把当前宏块的 up 宏块和 left 宏块的预测模式,非零系数值等数据加载进来,放到一个数组里面,供当前模块参考使用。 x264_macroblock_analyse()函数主要是模式选择的问题,通过对SAD 值或者其他 COST 值的分析,确定当前宏块的编码类型。以 I 帧模块为例,我们可以将它分割成16个4*4的块,如果这16个块的sad加起来小于按16*16的方式计算出来的sad值,我们就将这个 16*16 的块分成 16 个 4*4 的块进行编码,否则采用 16*16 的方式编码。x264_macroblock_encode()函数即是依据上面所确定的编码模式对当前宏块进行 264 编码。CABAC/CAVLC 部分为熵编码部分。

3.3 预测编码算法

帧内预测编码的预测值 P 是在一定的预测模式下,通过邻近已编码的象素值推出的。H.264 中的帧内预测分为 4×4 子块和 16×16 子块以及对 8x8 子块的预测模式。在 x264 代码中,帧内预测模式的算法主要在 predict.c 中。其中亮度象素有三种方式:16x16 宏块预测模式,8x8 子块预测模式,4x4 子块预测模式;色度象素有只有 8x8 色度预测模式。 帧间预测编码主要包括运动估计,运动补偿等,其中运动估计尤为重要。在 x264 中帧间运动估计有三种算法可供选择 X264_ME_DIA,X264_ME_HEX,X264_ME_ESA。

X264_ME_ESA::全搜索法,也称为穷尽搜索法,是对搜索范围内所有可能的候选位置计算 SAD(i,j)值,从中找出最小 SAD(绝对差值和),其对应偏移量即为所求运动矢量。此算法虽计算量大,但最简单、可靠,找到的必为全局最优点。

X264_ME_DIA::菱形搜索[5],搜索模板的形状和大小不但影响整个算法的运行速度,而且也影响它的性能。块匹配的误差实际上是在搜索范围内建立了误差表面函数,全局最小点即对应着最佳运动矢量。基于这两点事实,菱形算法采用了两种搜索模板,分别是有 9个检测点的大模板 LDSP(Large Diamond Search Pattern)和有 5 个检测点的小模板SDSP(SmallDiamond Search Pattern),搜索时先用大模板计算,当最小块误差 MBD点出现在中心点处时,将大模板 LDSP 换为 SDSP,再进行匹配计算,这时 5 个点中的 MBD 即为最优匹配点。

X264_ME_HEX::六边形搜索,与菱形搜索相似,只是搜索形状为六边形。

4. 验证分析

针对视频监视这一特殊应用来说,通常都是静止的图像,所以使用相对高速而图像质量下降并不是很多的算法是比较好的。

根据以上的分析,对编码器做如下修改:

1. 帧内预测取消了亮度 I8x8 帧内预测模式;

2. 帧间预测运动估计算法使用 X264_ME_DIA;运动估计的搜索范围由 16改为 8;亚象素搜索算法由每一次模式分析时都做一次 1/2 象素搜索,二次 1/4 象素搜索改成只在模式选择之后做一次 1/2 象素搜索,一次 1/4 象素搜索;模式选择取消了16x8,8x16,8x4,4x8,4x4 子模块;

3. 变换量化部分取消了 8x8 变换。

测试环境:AMD Athlon XP 1800+ 512M DDR WindowsXP Professional

测试序列:Akiyo,Mobile,Flower

可以得到修改前后的对比:

5. 结束语

从以上的分析可以看出,经过特殊设定的编码器的编码器复杂度明显下降了,在测试序列 mobile 中编码速度差不多提高了 70%,cpu 占有率也明显的降低了 10-15%,内存的占用也有所降低;而 psnr的下降都在 0.2db 以下,对人眼来说是基本上没有区别,码率的提升也在 10%以下。

在特定的视频应用中,根据对编码器的了解,设置正确的参数,往往能极大的提高编码器的性能。

参考文献

[1] Thomas Wiegand,Gary Sullivan. Overview of the H.264/AVC Video Coding Standard[C]. .IEEE transactions on circuits and systems for video technology,2003-07 ,Vol.13,No.7:560-575

[2] Iain Richardson.H.264 And MPEG-4 video compression[M].England: John Wiley & Sons Ltd, 2004

[3] Keng-Pang Lim ,Gary Sullivan and Thomas Wiegand.Text Description of Joint Model Reference Encoding Methods and Decoding Concealment Methods[R].Busan,Korea: Joint Video Team (JVT) of ISO/IEC MPEG and ITU-T VCEG, 2005-11-09

[4] 毕厚杰.《新一代视频压缩编码标准——H.264/AVC》[M], 北京:人民邮电出版社,2005

[5] 沈兰荪,卓力等.《视频编码与低速率视频传输》[M], 北京:电子工业出版社,2001。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
前 言 2 第1章 绪 论 9 1.1信息化与视频通信 9 1.1.1什么是信息 9 1.1.2什么是信息化 9 1.1.3 我国的信息化和视频通信 9 1.2 视频信息和信号的特点 10 1.2.1 直观性 10 1.2.2 确切性 10 1.2.3 高效性 10 1.2.4 广泛性 10 1.2.5 视频信号的高带宽性 10 1.3 视频压缩编码要求和可能性 11 1.3.1 视频压缩编码目标 11 1.3.2 视频压缩的可能性 11 1.4 视频压缩编码技术综述 12 1.4.1 基本结构 12 1.4.2 基于波形的编码 12 1.4.3 基于内容的编码 13 1.4.4 三维(立体)视频编码 13 参考文献 14 第2章 数字视频 15 2.1 数字电视的基本概念 15 2.1.1 数字电视的优越性 15 2.1.2 数字电视的PCM原理 16 2.2 数字电视信号 18 2.2.1 电视信号的时间和空间取样 18 2.2.2 彩色空间 19 2.2.3 彩色电视取样格式 19 2.2.4 数字电视信号的编码参数 20 2.3 视频信号的预处理 21 2.3.1 色彩插值(Color Interpolation) 21 2.3.2 色彩校正(Color Correction) 22 2.3.3 伽马校正(Gamma Correction) 23 2.3.4 图像增强(Image Enhancement) 24 2.3.5 白平衡(White Balance) 27 2.4 视频质量 29 2.4.1 主观质量的评定 29 2.4.2 客观质量的测量 29 参考文献 31 第3章 视频压缩编码的基本原理 32 3.1 预测编码 32 3.1.1 预测编码的基本概念 32 3.1.2 帧内预测编码 33 3.1.3 帧间预测编码 37 3.1.4 运动估计 41 3.2 变换编码 54 3.2.1 变换编码的基本概念 54 3.2.2 K-L变换 54 3.2.3 离散余弦变换DCT 55 3.2.4 锯齿形扫描和游程编码 57 3.3 变换编码与预测编码的比较 58 3.4 熵编码 59 3.4.1 变长编码 59 3.4.2 算术编码 59 参考文献 62 第4章 视频编码标准简介 63 4.1视频编码发展简史 63 4.2 H.261标准 63 4.2.1 图像格式 63 4.2.2 H.261视频编解码 64 4.3 H.263标准 68 4.3.1 H.263标准图像格式 68 4.3.2 H.263视频信源编码算法 69 4.4 MPEG-1标准 69 4.4.1 功能 69 4.4.2 图像类型和编码结构 69 4.5 MPEG-2 70 4.5.1 MPEG-2编码复用系统 70 4.5.2 档次和级别 71 4.5.3 MPEG-2视频编码 72 4.6 JPEG标准 73 参考文献 76 第5章 MPEG-4压缩编码标准 77 5.1 MPEG4标准概述 77 5.1.1 MPEG-4标准特性 77 5.1.2 AVO及数据结构 77 5.2 MPEG-4标准构成 78 5.2.1 系统 78 5.2.2 音频 80 5.2.3 视频 80 5.2.4 网格动画 84 5.2.5 其余 85 5.3 MPEG-4编码技术 85 5.3.1 形状编码 85 5.3.2 可扩展性编码 87 5.3.3 sprite编码 90 5.3.4 视频系统合成 91 5.4 MPEG-4档次和级 93 参考文献 96 第6章H.264/AVC编码原理 97 6.1 H.264/AVC的应用 97 6.2 H.264/AVC编解码 98 6.2.1 H.264编解码特点 98 6.2.2 H.264编码 98 6.2.3 H.264解码 99 6.3 H.264/AVC的结构 99 6.3.1 名词解释 99 6.3.2 档次和级 99 6.3.3 编码数据格式 100 6.3.4参数图像 102 6.3.5 片和片组 102 6.4 帧内预测 104 6.4.1 4×4亮度预测模式 105 6.4.2 16×16亮度预测模式 107 6.4.3 8×8色度块预测模式 109 6.4.4 信号化帧内预测模式 109 6.5 帧间预测 110 6.5.1 树状结构运动补偿 110 6.5.2 运动矢量 111 6.5.3 MV预测 113 6.5.4 B片预测 114 6.5.5加权预测 117 6.6 H.264的SP/SI帧技术(SP片或SI宏块的P宏块) 117 6.6.1 SP/SI帧的应用 118 6.6.2 SP/SI帧的基本原理 120 6.6.3 实验结果和性能分析 123 6.7 整数变换与量化 124 6.7.1 整数变换 125 6.7.2 量化 129 6.7.3 DCT直流系数的变换量化 131 6.8 CAVLC(基于上下文自适应的可变长编码) 132 6.8.1熵编码的基本原理 132 6.8.2 CAVLC的基本原理 133 6.8.3 CAVLC的上下文模型 133 6.8.4 CAVLC的编码过程 133 6.8.5 CAVLC解码过程 135 6.8.6 CAVLC编解码过程实例 138 6.8.7 CAVLC 与UVLC比较 139 6.9 CABAC(基于上下文的自适应二进制算术熵编码) 141 6.9.1 自适应算术编码 141 6.9.2 上下文模型 144 6.9.3 对输入流预编码 146 6.9.4 初始化 147 6.9.5 结论 147 6.10 码率控制 148 6.10.1基于Lagrangian优化算法的H.264编码控制模型 148 6.10.2 实验结果和性能分析 151 6.11 去方块滤波 153 6.11.1 去方块滤波基本概念 154 6.11.2 边界分析 155 6.11.3 滤波过程 157 6.12 其余特征 160 6.12.1 参考图像管理 160 6.12.2 重排序 160 6.12.3 隔行视频 161 6.12.4 数据分割片 162 6.12.5 H.264传输 162 参考文献 164 第7章 H.264的句法和语义 166 7.1 句法 166 7.1.1句法元素的分层结构 166 7.1.2句法的表示方法 169 7.2句法表 170 7.3 语义 189 7.3.1 NAL层语义 190 7.3.2 序列参数集语义 192 7.3.3 图像参数集语义 194 7.3.4片头语义 196 7.3.5参考图像序列重排序的语义 201 7.3.6加权预测的语义 202 7.3.7参考图像序列标记 (marking)操作的语义 203 7.3.8 片数据的语义 204 7.3.9 宏块层的语义 205 7.3.10 宏块预测的语义 210 7.3.11子宏块预测的语义 211 7.3.12 用CAVLC方式编码的残差数据的语义 213 7.3.13 用CABAC方式编码的残差数据的语义 213 7.4总结 213 参考文献 214 第8章 H.264/AVC解码的原理和实现 215 8.1 解码原理 215 8.2 NAL单元 216 8.2.1 NAL单元结构 216 8.2.2 NAL单元解码过程 216 8.3 图像序列号(PICTURE ORDER COUNT)的计算 217 8.3.1图像序列号(POC) 217 8.3.2 POC类型为0的POC计算 219 8.3.3 POC类型为1的POC计算 220 8.3.4 POC类型为2的POC计算 221 8.4 宏块片组映射图的产生 221 8.5 片数据分割的解码 223 8.6 参考图像列表的初始化 224 8.6.1 图像序号的计算 224 8.6.2 参考图像列表的初始化 225 8.6.3 参考帧列表的重排序 228 8.7 解码的参考图像的标记过程 230 8.7.1 frame_num不连续的解码过程 231 8.7.2 参考图像滑窗标记过程 231 8.7.3 参考图像的自适应内存控制标记过程 231 8.8 帧内预测 233 8.8.1 4x4亮度块预测方式的提取 234 8.8.2 4x4亮度块的帧内预测编码方式 235 8.8.3 16x16亮度块的帧内预测方式 240 8.8.4 8x8色度块的帧内预测方式 243 8.9 帧间预测解码处理 245 8.9.1 MV分量及参考索引获取 246 8.9.2 帧间预测像素解码处理 248 8.10 变换系数解码 254 8.10.1 变换系数逆扫描过程 255 8.10.2 DCT变换系数中直流系数的逆变换量化 256 8.10.3 残差变换系数的反量化 258 8.10.4 残差变换系数的逆DCT变换 258 8.10.5 去方块滤波前的图像恢复与重建 258 8.11 SP片中的P宏块和SI片中的SI宏块的解码过程 259 8.11.1 主SP片中P宏块的解码过程 259 8.11.2 辅SP/SI片的解码过程 261 参考文献 263 第9章 H.264视频编码传输的QOS 264 9.1 互联网视频传输QOS 264 9.1.1 错误恢复在视频通信中的重要性和实现途径 264 9.1.2 基于块的混合视频编码框架 265 9.1.3 视频通信中提高QoS的抗误码和错误恢复技术 266 9.2 无线网视频传输QOS 271 9.2.1 无线视频通信系统 271 9.2.2 无线信道编码和错误控制 272 9.2.3 无线视频通信的应用 276 9.2.4 H.264无线通信中传输结构 277 9.2.5无线视频传输的鲁帮性研究 278 9.3 H.264视频编解码标准的错误恢复 279 9.3.1 H.264视频编码层的错误恢复 279 9.3.1 H.264的网络提取层的错误恢复 281 参考文献 284 术语及英文解释 286 附录一 CAVLC相关码表 297 附录二 CABAC相关码表 304 附录三 H.264档次和级 318

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值