最近由于工作需求,需要学习HEVC(High Efficiency Video Coding)。最初一头雾水,都不了解这是视频压缩标准的一种。此文章,主要是为了笔者初步学习HEVC而写的学习笔记。
本文章收集了网上资料,部分内容是直接复制过来的。然后结合我个人的理解,添加了自己的部分。
感谢
本文章很多内容,都来自网上资料,非常感谢各位巨人,让我看到更远处的风景。(如有侵犯,请原创博主联系我)
https://baike.baidu.com/item/HEVC/3814533?fr=aladdin
https://blog.csdn.net/g0415shenw/article/details/81609261
https://blog.csdn.net/qq_39977813/article/details/88774316
_______________________________________________________
https://blog.csdn.net/wonder_coole/article/details/96753844
https://blog.csdn.net/datamining2005/article/details/76687896
http://www.360doc.com/content/16/0920/23/9075092_592388801.shtml
http://www.360doc.com/content/13/0925/09/7324690_316909743.shtml
https://blog.csdn.net/u014470361/article/details/89541544
文献
以下资料供大家学习
背景
以下内容摘取自百度百科(知识背景这块,百度写的很详细,哈哈哈):
HEVC是High Efficiency Video Coding的缩写,是一种新的视频压缩标准,用来以替代H.264/AVC编码标准,2013年1月26号,HEVC正式成为国际标准。
2004年,ITU-T视频编码专家组(VCEG)开始研究新技术创建新的视频压缩标准,同年10月,H.264/AVC小组对潜在的各种技术进行调查。2005年1月VCEG的会议上,VCEG开始指定某些主题为“关键技术”作进一步研究。2005年成立软件代码库称为Key Technical Areas (KTA)用来评估这些新的“关键技术”。
推出组织
HEVC是ITU-T视频编码组与ISO/IEC MPEG组共同努力的结果。ITU-T促进了电信标准的建立和采用,ISO/IEC则负责电子行业相关标准的管理HEVC是ITU-T视频编码组与ISO/IEC MPEG组共同努力的结果。ITU-T促进了电信标准的建立和采用,ISO/IEC则负责电子行业相关标准的管理
优势
相同质量的视频文件,使用HEVC编码的文件大小是H.264标准的一半,MPEG-2标准的四分之一,能够显著减少文件的存储和分发成本
劣势
需要H264两倍的算力
profile
H.264拥有7个profile(profile定义了一组用于创建码流的编码工具),HEVC仅支持3个:Main、Main 10和Main Still Picture。不过,2013年1月推出的HEVC仅仅是第一个版本(version 1),未来随着12-bit、14-bit位深、4:2:2、4:4:4色度采样、MVC、SVC等方面的延伸,profile还将得到进一步的扩展。
格式
F: 必须为0,表示有效;为1的话表示无效。
NALType: 6-bits NALType 确定NAL的类型,其中VCL NAL和non-VCL NAL各有32类。0-31是vcl nal单元;32-63,是非vcl nal单元。VCL是指携带编码数据的数据流,而non-VCL则是控制数据流.
LayerID: 表示NAL所在的Access unit所属的层,该字段是为了HEVC的继续扩展设置。也就是目前都是0,以后的扩展可能会用到。
TID: 3 bit,至少有一个bit为1
enum NalUnitType
{
NAL_UNIT_CODED_SLICE_TRAIL_N = 0, // 0
NAL_UNIT_CODED_SLICE_TRAIL_R, // 1
NAL_UNIT_CODED_SLICE_TSA_N, // 2
NAL_UNIT_CODED_SLICE_TLA, // 3 // Current name in the spec: TSA_R
NAL_UNIT_CODED_SLICE_STSA_N, // 4
NAL_UNIT_CODED_SLICE_STSA_R, // 5
NAL_UNIT_CODED_SLICE_RADL_N, // 6
NAL_UNIT_CODED_SLICE_DLP, // 7 // Current name in the spec: RADL_R
NAL_UNIT_CODED_SLICE_RASL_N, // 8
NAL_UNIT_CODED_SLICE_TFD, // 9 // Current name in the spec: RASL_R
NAL_UNIT_RESERVED_10,
NAL_UNIT_RESERVED_11,
NAL_UNIT_RESERVED_12,
NAL_UNIT_RESERVED_13,
NAL_UNIT_RESERVED_14,
NAL_UNIT_RESERVED_15,
NAL_UNIT_CODED_SLICE_BLA, // 16 // Current name in the spec: BLA_W_LP
NAL_UNIT_CODED_SLICE_BLA, // 16 // Current name in the spec: BLA_W_LP
NAL_UNIT_CODED_SLICE_BLANT, // 17 // Current name in the spec: BLA_W_DLP
NAL_UNIT_CODED_SLICE_BLA_N_LP, // 18
NAL_UNIT_CODED_SLICE_IDR, // 19 // Current name in the spec: IDR_W_DLP
NAL_UNIT_CODED_SLICE_IDR_N_LP, // 20
NAL_UNIT_CODED_SLICE_CRA, // 21
NAL_UNIT_RESERVED_22,
NAL_UNIT_RESERVED_23,
NAL_UNIT_RESERVED_24,
NAL_UNIT_RESERVED_25,
NAL_UNIT_RESERVED_26,
NAL_UNIT_RESERVED_27,
NAL_UNIT_RESERVED_28,
NAL_UNIT_RESERVED_29,
NAL_UNIT_RESERVED_30,
NAL_UNIT_RESERVED_31,
NAL_UNIT_VPS, // 32
NAL_UNIT_SPS, // 33
NAL_UNIT_PPS, // 34
NAL_UNIT_ACCESS_UNIT_DELIMITER, // 35
NAL_UNIT_EOS, // 36
NAL_UNIT_EOB, // 37
NAL_UNIT_FILLER_DATA, // 38
NAL_UNIT_SEI, // 39 Prefix SEI
NAL_UNIT_SEI_SUFFIX, // 40 Suffix SEI
NAL_UNIT_RESERVED_41,
NAL_UNIT_RESERVED_42,
NAL_UNIT_RESERVED_43,
NAL_UNIT_RESERVED_44,
NAL_UNIT_RESERVED_45,
NAL_UNIT_RESERVED_46,
NAL_UNIT_RESERVED_47,
NAL_UNIT_UNSPECIFIED_48,
NAL_UNIT_UNSPECIFIED_49,
NAL_UNIT_UNSPECIFIED_50,
NAL_UNIT_UNSPECIFIED_51,
NAL_UNIT_UNSPECIFIED_52,
NAL_UNIT_UNSPECIFIED_53,
NAL_UNIT_UNSPECIFIED_54,
NAL_UNIT_UNSPECIFIED_55,
NAL_UNIT_UNSPECIFIED_56,
NAL_UNIT_UNSPECIFIED_57,
NAL_UNIT_UNSPECIFIED_58,
NAL_UNIT_UNSPECIFIED_59,
NAL_UNIT_UNSPECIFIED_60,
NAL_UNIT_UNSPECIFIED_61,
NAL_UNIT_UNSPECIFIED_62,
NAL_UNIT_UNSPECIFIED_63,
NAL_UNIT_INVALID,
};
举例说明
前面 4个字节位00 00 00 01 为nul头
下面两个字节为40 01 ====》二进制 0100 0000 0000 0001
F : 0
NalType:100 000 ==》32 =》VPS
LayerID:0 0000 0==》0
TID:001 ==》1
再根据H265的NALU类型定义分析
数据 | nuh_unit_type | 语义 | 缩写 |
00 00 00 01 40 01 | 32 | 视频参数集 | VPS |
00 00 00 01 42 01 | 33 | 序列参数集 | SPS |
00 00 00 01 44 01 | 34 | 图像参数集 | PPS |
00 00 00 01 4E 01 | 39 | 补充增强信息 | SEI |
00 00 00 01 26 01 | 19 | RADL图像的IDR图像的SS编码数据 | IDR |
00 00 00 01 02 01 | 1 | 被参考的后置图像,且非TSA、非STSA的SS编码数据 | non |
名词解释
numTemporalLayers, Temporal Scalability,在多人远程会议或直播系统中,参与的用户可能处于不同的网络环境(有线、wifi、3G、4G)中,网络质量各不一致,为了所有用户可进行远程会议或者直播的观看,简单的做法就是降低发送端的视频码流,这样不管网络质量好坏,参与的用户都将观看低码率的视频流。这种方案缺点在于大部分网络较好的用户会被少数的网络较差的用户给拖累。这里介绍 H264 编码器中的 Temporal Scalability 机制来优化该方案。
Temporal Scalability 是 H264/SVC 编码器中的概念,意思为时间上可伸缩的,在实际编码中编码器进行了分层编码,可简单的理解为 编码器对同一组输入的数据进行编码,可以输出不同帧率的码流,例如当前编码器输入帧率为 30fps 的流,编码器可同时输出多个码流,例如同时输出 3 层码流,从而可以得到不同帧率的码流。这里的 3层码流是有依赖关系,比如输出有 A、B、C 3 层码流,单独的发送 A 层则得到低帧率的码流例如 5fps,如果同时发送 A 和 B 两层码流,则能得到相对较高的码流例如 15fps,如果同时发送 ABC ,则能得到最高的码流例如 30fps。
在对视频序列进行压缩的时候,会将其先分割成若干个小的图像组(GOP,Group of Pictures),定义一个GOP编码后生成的压缩数据为CVS(Coded Video Sequence)
视频编解中,存在封闭式GOP和开放式GOP,每个图像组包含若干张图片,每张图片可以划分为一个或多个片(Slice)每个GOP分为若干个片(Slice),片与片之间进行独立编码
每个片由一个或者多个片段(SS,Slice Segment)组成一个SS在编码时,被分割成大小相同的树形结构单元(CTU,Coding Tree Unit),CTU是HEVC新引进的概念每个CTU按照四叉树分割方式分割成不同类型的编码单元(CU,Coding Unit)
这个结构与264的结构有些类似,HEVC仍旧采用“预测+变换”的混合编码框架,都包括变换、量化、熵编码、帧内预测、帧间预测以及环路滤波等模块。但是HEVC更加复杂,并且几乎每个模块都引入了新的编码技术。
这几个新技术的含义先做简单介绍:
1、帧内预测
帧内预测的主要功能是去除图像的空间相关性,通过编码后的重构信息块来预测当前像素块以去除空间冗余信息,提高图像的压缩效率。
在H.264/AVC中,基于4x4大小的编码块采用9种预测模式,而基于16x16大小的编码块采用4种预测模式。
在HEVC中,为了更准确地反映纹理特性,降低预测误差,提出了更为精确的帧内预测技术。对于亮度信号,HEVC提供了35种帧内预测模式,包括33种角度预测以及DC预测模式和Planar预测模式。增加的预测模式可以更好地匹配视频中复杂的纹理,得到更好的预测效果,更加有效地去除空间冗余。
2、帧间预测
帧间预测的主要功能是去除时间相关性,通过将已编码的图像作为当前帧的参考图像,来获取各个块的运动信息,从而去除时间冗余,提高压缩效率。
为了提升帧间预测性能,HEVC引入了一些新的技术,包括运动信息融合技术(Merge)、先进的运动矢量预测技术(Advanced Motion Vector Predictor,AMVP)和基于Merge的Skip模式。
运动信息融合技术(Merge):利用空域相关性和时域相关性来减少相邻块之间的运动参数冗余,具体来说就是取其相邻PU的运动参数作为当前PU的运动参数。
先进的运动矢量预测技术(Advanced Motion Vector Predictor,AMVP):AMVP技术的作用与Merge技术类似,也是利用空域相关性和时域相关性来减少运动参数的冗余。AMVP技术得到的运动矢量一方面为运动估计提供搜索起点,另一方面作为预测运动矢量使用。
在HEVC中,帧间预测可以采用单向和双向的参考图像来进行预测,包括类似H.264/AVC中的分层B帧的预测结构。
3、变换量化
通过对残差数据进行变换量化以去除频域相关性,对数据进行有损压缩。变换编码将图像从时域信号变换至频域,将能量集中至低频区域。量化模块可以减小图像编码的动态范围。
RQT(Residual Quad-tree Transform)技术是一种基于四叉树结构的自适应变换技术,它为最优TU模式选择提供了很高的灵活性。大块的TU模式能够将能量更好地集中,小块的TU模式能够保存更多的图像细节。根据当前CU内残差特性,自适应选择变换块大小,可以在能量集中和细节保留两者做最优的折中,与传统的固定块大小的变换相比,RQT对编码效率贡献更大。
变换编码和量化模块从原理上属于两个相互独立的过程,但是在HEVC中,两个过程相互结合,减少了计算的复杂度。
4、环路滤波
在HEVC中,环路滤波模块主要包括去块滤波器(DBF)和样点自适应补偿滤波(SAO)。DBF的主要作用是去方块效应,而SAO的主要作用是去除振铃效应。
5、熵编码
熵编码模块将编码控制数据、量化变换系数、帧内预测数据、运动数据、滤波器控制数据编码为二进制进行存储和传输。熵编码模块的输出数据即是原始视频压缩后的码流。
在HEVC中,采用了基于上下文的自适应二进制算术编码(CABAC)进行熵编码,引入了并行处理架构,在速度、压缩率和内存占用等方面均得到了大幅度改善。
接下来介绍HEVC的两个容易被忽略的新技术:ACS和IBDI。
6、ACS技术
ACS(Adaptive Coefficient Scanning)包括三类:对角扫描、水平扫描和垂直扫描。ACS技术是基于4x4块单元进行的,将一个TU划分为多个4x4块单元,每个4x4块单元内部以及各个4x4块单元之间都按照相同的扫描顺序进行扫描。
对于帧内预测区域的4x4和8x8尺寸的TU,根据所采用的帧内预测方向来选择扫描方法:当预测方向接近水平方向时采用垂直扫描;当预测方向接近于垂直方向时就选用水平扫描,对于其他预测方向使用对角扫描。
对于帧间预测区域,无论TU尺寸多大都采用对角扫描方式。
7、IBDI技术
IBDI(Internal Bit Depth Increase)技术是指在编码器的输入端将未压缩图像像素深度由P比特增加到Q比特(Q>P),在解码器的输出端又将解压缩图像像素深度从Q比特恢复至P比特。
IBDI技术提高了编码器的编码精度,降低了帧内/帧间预测误差。但由于要建立参考队列,像素深度为Q比特的重构图像须占用较大的内存空间。此外,在进行帧间运动估计和补偿时,需要较多的内存访问带宽,这样会给内存受限的系统带来不便,解决的方法是引入参考帧压缩算法,来减小重构图像的数据量。