H265视频码流结构分析

Posted 剑门微雨

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了H265视频码流结构分析相关的知识,希望对你有一定的参考价值。

目录

前言

H265码流结构

H265帧结构 

H265档次介绍


RTSP实时音视频开发实战课程:<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视频码流结构分析先了解下H264视频码流结构的特性和一些术语、概念。

H265码流结构

       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帧结构 

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

          在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档次介绍

       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表示不支持。

MPEG-2码流结构分析

MPEG2视频编码定义在 ISO/IEC13818-2中,MPEG2 video sequence如下图所示

技术分享图片

技术分享图片

 

 技术分享图片

我们可以借助Elecard Stream Analyer工具来分析MPEG2视频码流

技术分享图片

MPEG2编码码流的起始码的含义如下

技术分享图片

技术分享图片

1.Sequence Header

MPEG2视频裸流的每一个GOP以Sequence Header开头,Sequence Header的起始码为00 00 01 B3,它里面保存了如下信息

技术分享图片

技术分享图片

  • horizontal_size_value:视频帧宽度
  • vertical_size_value:视频帧高度
  • aspect_ratio_information:宽高比,各取值的含义如下

技术分享图片

  • frame_rate_code:帧率,各取值含义如下

技术分享图片

  • bit_rate_value:码率
  • marker_bit:This is one bit that shall be set to ‘1‘. This bit prevents emulation of start codes
  • vbv_buffer_size:定义了VBV (Video Buffering Verifie)的大小

2.Sequence Extention

它的起始码为 00 00 01 B5,保存了如下信息
技术分享图片

技术分享图片

  • profile_and_level_indication:指明了profile和leve
  • progressive_sequence:When set to ‘1‘ the coded video sequence contains only progressive frame pictures. Whenprogressive_sequence is set to ‘0‘ the coded video sequence may contain both frame pictures and field pictures, and framepicture may be progressive or interlaced frames.
  • chroma_format:采样格式,各取值含义如下

技术分享图片

3.Group of picture Header

起始码为00 00 01 B8,保存了如下信息
技术分享图片

技术分享图片

  • time_code:时码,占25个字节,包含drop_frame_flag, time_code_hours, time_code_minutes,marker_bit, time_code_seconds 以及 time_code_pictures,各标志取值范围如下

技术分享图片

 drop_frame_flag 标志只有在帧率为 29.97 时才有可能被设置为1。如果被设置为0 每秒钟的帧数被近似到最近的整数,例如29.97的被近似为30. 如果被设置为1,除了 0, 10, 20, 30, 40, 50 分钟外每分钟开始的第0和第1帧将被忽略
  • closed_gop:指明紧挨着在group of picture header后的I帧的连续的B帧的编码方式,如果被设置为1,表示该B帧只采用backward prediction 或 intra coding (Close GOP是指帧间的预测都是在GOP中进行的。而使用open GOP,后一个GOP会参考前一个GOP的信息。使用这种方式就大大降低了码率)

4.Picture Header

Picture Header保存了图像相关信息,从该头部信息中可以判断该帧时IP或B帧。它的起始码为00 00 01 00
技术分享图片

技术分享图片

  • temporal_reference:指明该帧的参考属性,各取值含义如下

技术分享图片

  • vbv_delay:当该值为 0xFFFF 表示VBR编码
当出现0x0000100,是就表示已经到了图象层,再越过10位(Temporal_reference占10位),就到了Picture_coding_type(3位),如果Picture_coding_type为001(二进制)就是I帧,为010是P帧,011则就是B帧。

5. Picture coding extension

技术分享图片

  • f_code[s][t]:4bit的整数,用在解码时的运动向量中,s和t的取值含义如下图

技术分享图片

  • intra_dc_precision: indicates the number of bits for quantized DC,coefficients of intra-coded blocks,The more bits are used, the more precise quantization is achieved,取之含义如下

技术分享图片

  • picture_structure :图像扫面方式,各取值含义如下

技术分享图片

  • frame_pred_frame_dct:If this flag is set to ‘1‘, then only frame-DCT and frame prediction are used. In a field picture it shall be ‘0‘. frame_pred_frame_dct shall be ‘1‘ if progressive_sequence is ‘1‘. This flag affects the syntax of the bitstream.
  • concealment_motion_vectors:This flag has the value ‘1‘ to indicate that motion vectors are coded in intra macroblocks. This flag has the value ‘0‘ to indicate that no motion vectors are coded in intra macroblocks
 
参考:ISOIEC13818-2-2013.pdf

以上是关于H265视频码流结构分析的主要内容,如果未能解决你的问题,请参考以下文章

Android音视频H265硬编解码&视频通话

Android音视频H265硬编解码&视频通话

视频编解码 - RTP 与 RTCP

视频编解码·学习笔记6. H.264码流分析工程创建

视频编解码·学习笔记5. NAL Unit 结构分析

H.264/AVC视频编解码技术详解十二解析H.264码流的宏块结构(下):H.264帧内编码宏块的预测结构