h264码流及h265码流结构分析,NAL头类型分析

视频编码标准规定了编码后码流的语法语义,也就阐明了从比特流提取语法元素并进行解释的方法,也就是视频的解码过程。
 
1.h264码流结构解析:
    H.264/AVC(Advanced Video Coding) 的功能分为两层:视频编码层(VCL, Video CodingLayer)和网络提取层(NAL, Network Abstraction Layer)。VCL数据即编码处理的输出,它表示被压缩编码后的视频数据序列。在VCL数据传输或存储之前,这些编码的VCL 数据,先被映射或封装进NAL单元中。每个NAL 单元包括一个原始字节序列负荷(RBSP, Raw Byte Sequence Payload)、一组对应于视频编码的NAL头信息。RBSP的基本结构是:在原始编码数据的后面填加了结尾比特。一个bit“1”若干比特“0”,以便字节对齐。
 
H.264BitsStream = StartCodePrefix + NALU + StartCodePrefix + NALU +...+     //StartCodePrefix为0x00000001或0x000001
NALU = NAL header(1 byte) + RBSP
RBSP = SODB  + RBSP trailing bits
NALU(NALU单元):Coded H.264 data is stored or transmitted as a series of packets known as NetworkAbstraction LayerUnits.
RBSP(原始数据字节流):A NALU contains a Raw Byte Sequence Payload, a sequence of bytes containingsyntax elements.
SODB(原始数据比特流):String Of Data Bits (SODB即编码形成的真实码流,长度不一定是8的倍数,故需要补齐)
 
NAL Header:forbidden_bit(1bit,禁止位),nal_reference_bit(2bit,NAL优先级), nal_unit_type( 5bit,类型,定义如下表)。
Nal_unit_type  NAL类型(rbsp语法结构的内容)                                      C    
0              未使用                                                       
1              不分区、非IDR图像的片(P:slice_layer_without_partitioning_rbsp()) 2,3,4
2              片分区A(slice_data_partition_a_layer_rbsp())                    2    
3              片分区B(slice_data_partition_b_layer_rbsp())                    3    
4              片分区C(slice_data_partition_c_layer_rbsp())                    4    
5              IDR 图像中的片(IDR:slice_layer_without_partitioning_rbsp())     2,3  
6              补充增强信息单元(SEI: sei_rbsp() )                               5    
7              序列参数集(SPS: seq_parameter_set_rbsp())                       0    
8              图像参数集(PPS: pic_parameter_set_rbsp())                       1    
9              分界符(access_unit_delimiter_rbsp())                            6    
10             序列结束(end_of_seq_rbsp())                                     7    
11             码流结束(end_of_stream_rbsp())                                  8    
12             填充(filler_data_rbsp())                                        9    
13~23          保留                                                        
24~31          未使用       
 
示例:
00000000h: 00 00 00 01 27 4D 00 33 E7 40 14 00 5A D3 50 10 ; ....'M.3鏎..Z覲.        //0x27(0 10 0111):  nal_unit_type=7(0111) 序列参数集(SPS)
00000010h: 20 2F 00 00 03 00 01 00 00 03 00 32 30 20 00 10 ;  /.........20 ..
00000020h: 4B E0 00 18 71 D7 FF F0 28 00 00 00 01 28 EE 3C ; K?.q??....(?              //0x28(0 10 1000):  nal_unit_type=8(1000) 图像参数集(PPS)
00000030h: 80 00 00 00 01 25 B8 40 00 39 6F 01 C3 64 CA FF ; €....%窣.9o.胐?       //0x25(0 10 0101):  nal_unit_type=5(0101) IDR图像(IDR)
...... ......
00007e60h: D9 91 D8 2A 31 D9 EF F0 00 00 00 01 21 E6 03 08 ; 賾?1亠?...!?.          //0x21(0 10 0001):  nal_unit_type=1(0001) 非IDR图像(P)
...... ......
 
 
2.h265码流结构解析:
    与H.264/AVC类似,H.265/HEVC( High Efficiency Video Coding)采用了视频编码层(Video Code Layer,VCL)和网络适配层(Network Abstract Layer,NAL),原始视频经过VCL层,被编码成视频数据,然后经过NAL层,封装成一个个NAL包以适应不同网络的视频传输。HEVC码流在应用过程中与H.264/AVC码流的区别就在于NAL层;NAL单元的头部容量从H.264/AVC的单字节扩充为两个字节,增加的内容主要用于标识它所装载数据的类型。
 
1、编码时的分层处理架构
    在对视频序列进行压缩的时候,会将其先分割成若干个小的图像组(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);
 
2、压缩码流结构
    GOP层、Slice层中公用的大部分语法元素游离出来组成序列参数集(SPS,Sequence Paramenter Set)和图像参数集(PPS,Picture Paramenter Set);
SPS:包含了一个CVS中所有图像共用的信息,包括解码相关信息,如档次级别,分辨率deng;
PPS:包含了一幅图像所有的公共参数,即一个图像中的所有SS会使用同样的PPS,包括初始图像控制信息,如初始化量化参数(QP,Quantization Parament)、分块信息等;
VPS(Video Parament Set, 视频参数集):包含了多个子层共享的语法元素,其他不属于SPS的特定信息等(为了适应其他应用如可分级视频编码器,多视点视频编码器,HEVC语法架构中增加VPS)。
一个SS获取参数的引用顺序如下(实则上是一个树状的结构):SS <-- PPS <-- SPS <-- VPS
 
 
    NAL根据视频压缩数据的特性将其封装为不同的NALU,NALU除了承载VPS、SPS、PPS等信息,还有视频片(Slice)的压缩数据,承载视频片压缩数据的NALU被称为VCLU(VCL NALU),承载其它信息的压缩数据的NALU则被称为non-VCLU(non-VCL NALU)。H.265/HEVC下NALU包含两部分的结构: NALU头(Header)和负载(Payload),NALU头长度为固定的两个字节,反映NALU的内容特征,NALU负载长度为整数字节,承载视频压缩后的原始字节序列载荷(Raw Byte Sequence Payload,RBSP)。RBSP是对视频编码后的原始比特流片段SODB(STring OF Data Bits)进行添加尾部(添加结尾比特1,以凑足整字节)的包装。
 
h265头解析(2字节):
0byte             |1byte                               //h265的nal unit header有两个字节构成
0    1 2 3 4 5 6   7 0 1 2 3 4    5 6 7
+-+---------------+----------------+-------+
| F|      Type     |    LayerId    |  TID  |        //通常情况下F为0(1bit),layerid为0(6bit),  TID为1(3bit)
+-+---------------+----------------+-------+
 
H265 帧类型判断:int type = (code & 0x7E)>>1;  type值类型见下表:

 

 
示例:
00000000h: 00 00 00 01 40 01 0C 01 FF FF 21 40 00 00 03 00 ; ....@...!@....      //0x40(0  100000 0):  nal_unit_type=32(100000) 序列参数集( VPS)
00000010h: 90 00 00 03 00 00 03 00 96 25 02 40 00 00 00 01 ; ?......?.@....            //0x42(0  100001 0):  nal_unit_type=33(100001) 序列参数集( SPS)
00000020h: 42 01 01 21 40 00 00 03 00 90 00 00 03 00 00 03 ; B..!@....?.....
00000020h: 42 01 01 21 40 00 00 03 00 90 00 00 03 00 00 03 ; B..!@....?.....
00000030h: 00 96 A0 03 C0 80 10 E5 9E 96 E4 4A 17 80 B5 01 ; .枲.纮.鍨栦J.€?
00000040h: 02 02 E1 00 00 03 00 01 00 00 03 00 19 51 07 FD ; ..?.........Q.?
00000050h: E1 00 0D BF 80 00 14 9F 4D 7C 20 10 40 00 00 00 ; ?.縺..烳| .@...
00000060h: 01 44 01 C0 77 C0 E6 D9 00 00 00 01 26 01 AC 63 ; .D.纖梨?...&.琧     //0x26(0  010011 0):  nal_unit_type=19(010011) 序列参数集( IDR)
...... ......
000057c0h: 3C 47 CB 78 AC 66 95 CE D6 80 00 00 00 01 02 01 ; <G藊琭曃謤......    //0x02(0  000001 0):  nal_unit_type=1(000001) 序列参数集( P)
000057d0h: D0 08 55 A1 46 2A 7C A2 5D 52 71 1D 94 E7 B5 1A ; ?U*|Rq.旂?
...... ......
 
 
 
 
 
上传了一两个很常用的h264资料和软件,如下:

 

h264官方文档(中文): https://download.csdn.net/download/chengjian815/12922198

h265官方文档(英文):https://download.csdn.net/download/chengjian815/12922739

264码流分析工具:https://download.csdn.net/download/chengjian815/12922378

MP4封装信息查看:https://download.csdn.net/download/chengjian815/12922382

 
————————————————
版权声明:本文为CSDN博主「诗和远方-」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/chengjian815/article/details/109069057

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值