目录

前言

H265码流结构

H265帧结构 

H265档次介绍



前言

       在音视频开发入门基础知识(视频入门篇)中介绍了H265的一些编码基础,本文会对H265编码后的视频流做一个详细的介绍。H264视频码流结构分析一文中对H264视频码流结构做了详细的分析,H265的视频码流结构和H264视频码流结构比较相似,建议阅读H264视频码流结构分析先了解下H264视频码流结构的特性和一些术语、概念。

H265码流结构

       H265的视频流中也是存在多个GOP,每一个GOP里面包含多个视频编码帧。H265支持的视频编码帧类型有IDR帧、I帧、P帧、B帧,这些帧类型的含义和H264码流的帧类型的含义是一样,作用也是一样,比如IDR帧和I帧都是帧内压缩编码,IDR帧是即时解码刷新帧,也是关键帧;P帧是前向参考帧,B帧是双向参考帧。

android仿微信视频预览_实时音视频

        H265的I帧或者IDR帧采用帧内编码,由于帧内压缩效率低,所以往往IDR帧/I帧比较大;如下图中的图像是H265的视频IDR帧的图像,可以看出IDR帧里面的每一个小块都是帧内编码块(橙色);图中上方的柱状图表示每个视频帧的大小,柱状图越高表示数据量越大,可以看出IDR帧(橙色)比较大。

android仿微信视频预览_android仿微信视频预览_02

       H265的P帧B帧也可以采用帧内压缩的方式来编码,不过主要还是靠帧间编码来提示压缩率的;如下图中的图像是H265的视频P帧的图像,可以看出P帧里面的小方块的大多是帧间编码块(蓝色块),还出了一个帧内编码块(橙色块)。

android仿微信视频预览_音视频_03

H265帧结构 

       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,视频参数集;主要包含视频时域子层的最大数目,时钟周期计算相关参数等。

android仿微信视频预览_实时音视频_04

      与H264一样,H265可以通过Nal Type来判断当前Nal Unit的类型;如下图是Nal Unit 定义;在Nal Unit最开始的位置就是nal_unit_header,之后才是rbsp。

android仿微信视频预览_码流_05

 下图是nal_unit_header的定义,共占用了16bit(2个字节);其中nal_unit_type表示的是一个NalUnit数据的类型,占前8bit的6个bit位;nal_unit_type的取值计算为(data[0] &0x7e)>> 1 。

android仿微信视频预览_码流_06

 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(视频增强信息)。实际上16-21都是I帧类型的数据。

android仿微信视频预览_码流_07

          在H265视频帧中,对于非IDR 的Slice我们可以进一步解析slice_segment_header()中的slice_type;slice_segment_header()定义如下图。

android仿微信视频预览_码流_08

下图是H265视频帧中slice_type的定义 ;

android仿微信视频预览_码流_09

       下图是码流分析工具StreamAnalyzer展现出的VPS Nal Unit的bit构成,如下蓝色区域数字,起始码为00000001 ,起始码后面的40为十六进制数,(0x40&0x7e)>> 1得到nal_unit_type值是0x20,即十进制的32。  

android仿微信视频预览_android仿微信视频预览_10

      下图是码流分析工具StreamAnalyzer展现出的SPS Nal Unit的bit构成,如下蓝色区域数字,起始码为00000001 ,起始码后面的42为十六进制数,(0x42&0x7e)>> 1得到nal_unit_type值是0x21,即十进制的33。

android仿微信视频预览_音视频_11

      下图是码流分析工具StreamAnalyzer展现出的PPS Nal Unit的bit构成,如下蓝色区域数字,起始码为00000001 ,起始码后面的44为十六进制数,(0x44&0x7e)>> 1得到nal_unit_type值是0x22,即十进制的34。

android仿微信视频预览_码流_12

      下图是码流分析工具StreamAnalyzer展现出的IDR slice Nal Unit的bit构成,如下蓝色区域数字,起始码为00000001 ,起始码后面的28为十六进制数,(0x28&0x7e)>> 1得到nal_unit_type值是0x14,即十进制的20。

android仿微信视频预览_码流_13

      下图是码流分析工具StreamAnalyzer展现出的P slice Nal Unit的bit构成,如下蓝色区域数字,起始码为00000001 ,起始码后面的02为十六进制数,(0x02&0x7e)>> 1得到nal_unit_type值是0x1,即十进制的1。

android仿微信视频预览_实时音视频_14

H265档次介绍

       H265的早期标准里面的档次有MainMain 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表示不支持。

android仿微信视频预览_实时音视频_15