目录
前言
H265码流结构
H265帧结构
H265档次介绍
RTSP实时音视频开发实战课程:
《YUV编码为H265视频流代码实现》链接:
https://edu.csdn.net/learn/38258/606134?spm=1003.2001.3001.4157
《H265视频流解码为YUV代码实现》链接:
https://edu.csdn.net/learn/38258/606144?spm=1003.2001.3001.4157
在音视频开发入门基础知识(视频入门篇)中介绍了H265的一些编码基础,本文会对H265编码后的视频流做一个详细的介绍。H264视频码流结构分析一文中对H264视频码流结构做了详细的分析,H265的视频码流结构和H264视频码流结构比较相似,需要先了解下H264视频码流结构的特性。
H265的视频流中也是存在多个GOP,每一个GOP里面包含多个视频编码帧。H265支持的视频编码帧类型有IDR帧、I帧、P帧、B帧,这些帧类型的含义和H264码流的帧类型的含义是一样,作用也是一样,比如IDR帧和I帧都是帧内压缩编码,IDR帧是即时解码刷新帧,也是关键帧;P帧是前向参考帧,B帧是双向参考帧。
H265的I帧或者IDR帧采用帧内编码,由于帧内压缩效率低,所以往往IDR帧/I帧比较大;如下图中的图像是H265的视频IDR帧的图像,可以看出IDR帧里面的每一个小块都是帧内编码块(橙色);图中上方的柱状图表示每个视频帧的大小,柱状图越高数据越大,可以看出IDR帧(橙色)比较大。
H265的P帧B帧也可以采用帧内压缩的方式来编码;如下图中的图像是H265的视频P帧的图像,可以看出P帧里面的小方块的颜色是帧间编码块(蓝色块),还出了一个帧内编码块(橙色块)。
H265每一个帧的组成和H264的构成一样,功能上分为NAL层(NetworkAbstraction Layer,网络提取层)和VCL层(VideoCoding Layer,视频编码层);H265的一帧编码图像中分为一个或者多个Nal 单元;每个NAL单元包含Nal 单元头和NAL 单元 Body;Nal 单元头由起始码和Nal Type组成。NAL 单元 Body通常是RBSP(Raw Byte Sequence Payload 原始字节序列载荷)数据 。如下图所示。H265的Nal Type和H264Nal Type有些许差异,如在IDR/I帧数据通常除了SPS、PPS还有VPS,如下图中红色字体VPS是H265视频流中增加的Nal Type。
VPS:Video Parameter Set,视频参数集;主要包含视频时域子层的最大数目,时钟周期计算相关参数等。
与H264一样,H265可以通过Nal Type来判断当前Nal Unit的类型;如下图是Nal Unit 定义;在Nal Unit最开始的位置就是nal_unit_header,之后才是rbsp。
下图是nal_unit_header的定义,共占用了16bit(2个字节);其中nal_unit_type是NalUnit的类型,占前8bit的第1-6位;nal_unit_type的取值计算为(data[0] &0x7e)>> 1 。
nal_unit_type字段定义如下图;如下图可以知道 nal_unit_type为32时候 Nal Unit是VPS;nal_unit_type为33时候 Nal Unit是SPS;nal_unit_type为34时候 Nal Unit是PPS;nal_unit_type为19-20时候 Nal Unit是IDR Slice;nal_unit_type为0-9,16-18,21的时候 Nal Unit是非IDR Slice;nal_unit_type为39-40时候 Nal Unit是SEI(视频增强信息)。
在H265视频帧中,对于非IDR 的Slice我们可以进一步解析slice_segment_header()中的slice_type;slice_segment_header()定义如下图。
下图是H265视频帧中slice_type的定义 ;
下图是码流分析工具StreamAnalyzer展现出的VPS Nal Unit的bit构成,如下蓝色区域数字,起始码为00000001 ,起始码后面的40为十六进制数,(0x40&0x7e)>> 1得到nal_unit_type值是0x20,即32。
下图是码流分析工具StreamAnalyzer展现出的SPS Nal Unit的bit构成,如下蓝色区域数字,起始码为00000001 ,起始码后面的42为十六进制数,(0x42&0x7e)>> 1得到nal_unit_type值是0x21,即33。
下图是码流分析工具StreamAnalyzer展现出的PPS Nal Unit的bit构成,如下蓝色区域数字,起始码为00000001 ,起始码后面的44为十六进制数,(0x44&0x7e)>> 1得到nal_unit_type值是0x22,即34。
下图是码流分析工具StreamAnalyzer展现出的IDR slice Nal Unit的bit构成,如下蓝色区域数字,起始码为00000001 ,起始码后面的28为十六进制数,(0x28&0x7e)>> 1得到nal_unit_type值是0x14,即20。
下图是码流分析工具StreamAnalyzer展现出的P slice Nal Unit的bit构成,如下蓝色区域数字,起始码为00000001 ,起始码后面的02为十六进制数,(0x02&0x7e)>> 1得到nal_unit_type值是0x1,即1。
H265的早期标准里面的档次有Main、Main 10, 和 Main Still Picture三种;
Main Profile:允许每个像素的位深度为 8 位,采样格式为 4:2:0;
Main10 Profile:将每个像素的位深度由 8 bit提升到了10bit,以更好的支持HDR视频。
Main Still Profile:支持单张静态图像进行编码;
后来又增加了H265的档次,如[Main 4:2:2 12]支持12bit的像素格式,以及YUV422的采样格式;H265的各种档次下支持的功能如下图。水平是H265规范中支持的Profile,垂直是H265的编解码功能;Yes表示支持,No表示不支持。