RTP分包模式(H264/H265)
在rfc6184-h264文档5.4章节有详细说明、以及rfc7798-h265文档4.2章节中也有部分介绍。
一、NALU Header
● H264 NALU Header(1 byte)结构图如下:
F: 1 bit
forbidden_zero_bit,禁止位,大多数情况为0,表示NAL单元类型和有效载荷不应该包含误码或其它语
法错误。值为1,表示该NAL单元类型和有效载荷可能包含误码或者其它语法错误。
NRI: 2 bit
nal_ref_idc,nal 参考级别,该值一般为00、01、10、11(二进制),表示该NAL单元重要级别,如果
为0,可能解码器丢弃,不会导致花屏现象。该值必须遵循H264编码规范。比如:sps、pps、idr等NAL
单元时,该值必须为11(二进制)
Type:5 bit
nal_unit_type,代表nal单元类型,常见的该值为7(sps)、8(pps)、5(idr)等。
● H265 NALU Header(2 byte)结构图如下:
F: 1 bit
forbidden_zero_bit,禁止位,大多数情况为0,表示NAL单元类型和有效载荷不应该包含误码或其它语法
错误。值为1,表示该NAL单元类型和有效载荷可能包含误码或者其它语法错误。
Type: 6 bit
nal_uint_type,代表nal单元类型,允许NAL单元的类型编码数比 h264/AVC多一倍,达到64类,其中32类
作用在VCL NAL单元,32类用作non-VCL NAL单元。
LayerId:6 bit
nal_layer_id,hevc中等于0,扩展标识符。该语法未来用于标识CVS中可能出现的层,其中层包括空间可
伸缩层、质量可伸缩层、纹理视图或深度视图。
TID: 3 bit
nal_temporal_id_plus1,层识别信息。表示当前NAL单元属于哪个时域子层,时域标识符的值为0~6。
二、RTP有效载荷结构(Payload Structures)
1)H264 FUs结构
H264 FU-A的RTP负载如图所示:
H264 FU-B的RTP负载如图所示:
H264 FU indicator定义如下:
1 //FU Indicator定义实际就是H264的NAL Header,H264 2 typedef struct _tagFUIndicator 3 { 4 uint8_t F : 1; /*1 bit,forbidden_zero_bit(禁止位),一般为0*/ 5 uint8_t NRI : 2; /*2 bit,nal_ref_idc(nal参考级别),代表这一个NAL的重要级别,比如sps、pps、idr该值一般为11(二进制),由*/ 6 uint8_t TYPE : 5; /* set to 28 or 29 */ 7 } FUIndicator;
FU-A和FU-B的type字段分别为28和29,FUIndicator结构和NALU单元头定义类似,只是FU-A和FU-B中
的TYPE字段表示分片类型,而NALU单元中的TYPE为nalu_unit_type。
H264 FU header结构如下:
1 //FU Header定义,H264 2 typedef struct _tagH264FUHeader 3 { 4 uint8_t S : 1; /*1 bit,Start位,当设置为1时,Start位表示一个分片NAL单元的开始。当FU有效载荷不是分片NAL单元有效载荷起始时,该值被设置为0*/ 5 uint8_t E : 1; /*1 bit,End位,当设置为1时,表示分片NAL单元的结束,即当该NAL单元分片最后一个分片时,该值为1,否则End位被设置为0*/ 6 uint8_t R : 1; /*1 bit,预留位,一般为0*/ 7 uint8_t Type : 5; /*5 bit,nalu_unit_type, set to nal type */ 8 } H264FUHeader;
2)H265 Fus结构
H265 PayloadHdr定义(即H265的NAL Header)如下:
1 typedef struct tagH265NalHeader 2 { 3 uint8_t F : 1; /* start flag */ 4 uint8_t Type : 6; /* end flag */ 5 uint8_t LayerId : 6; /* end flag */ 6 uint8_t Tid : 3; /* set to nal type */ 7 } H265NalHeader;
H265 FU header结构如图:
1 typedef struct tagH265FUHeader 2 { 3 uint8_t S : 1; /* start flag */ 4 uint8_t E : 1; /* end flag */ 5 uint8_t Type : 6; /* set to nal type */ 6 } H265FUHeader;
三、三种分包模式和适用场景