27-RTP-NALU结构
RTP结构
+-------------------------------------------------------------+
| RTP Header | 
|---|
| Version (2 bits) | 
| +---------------------+------------------+---------------------+ | 
| Marker (1 bit) | 
| +---------------------+---------------------+---------------------------+ | 
| Timestamp (32 bits) | 
| +-------------------------------------------------------------+ | 
| SSRC (32 bits) | 
| +-------------------------------------------------------------+ | 
| CSRC (0 to 15 entries, 32 bits each, optional) | 
| +-------------------------------------------------------------+ | 
| Payload | 
| (H.265 NALU or other media data, e.g., audio/video data) | 
| +-------------------------------------------------------------+ | 
RTP 数据包头部详细字段说明
| 字段名 | 长度 | 描述 | 
|---|---|---|
| Version | 2 bits | RTP协议版本,固定为 2。 | 
| Padding | 1 bit | 如果为1,表示RTP包的结尾有填充字节。 | 
| CSRC Count | 4 bits | CSRC标识符的数量,如果没有则为0。 | 
| Marker | 1 bit | 用来标记RTP包中的重要帧,通常用来表示视频关键帧等。 | 
| Payload Type | 7 bits | 指示RTP负载的类型(例如,H.265视频、G.711音频等)。 | 
| Sequence Number | 16 bits | RTP包的序列号,用于检测丢包和包的顺序。 | 
| Timestamp | 32 bits | 时间戳,用于同步音视频流的时间轴。 | 
| SSRC | 32 bits | 同步源标识符,标识数据流的发送端。 | 
| CSRC | 0-15 entries | 每个CSRC标识符占32位,最多15个CSRC标识符(可选)。 | 
RTP负载NALU结构
+---------------------------------------------------------------+
| RTP Header | 
|---|
| Version | 
| +---------------------------------------------------------------+ | 
| Payload (Multiple NALU) | 
| +---------------------------------------------------------------+ | 
| Start Code Prefix (3 bytes) | 
| +---------------------------------------------------------------+ | 
| NALU 1 Header (1 byte) | 
| +---------------------------------------------------------------+ | 
| NALU 1 Payload Data | 
| +---------------------------------------------------------------+ | 
| Start Code Prefix (3 bytes) | 
| +---------------------------------------------------------------+ | 
| NALU 2 Header (1 byte) | 
| +---------------------------------------------------------------+ | 
| NALU 2 Payload Data | 
| +---------------------------------------------------------------+ | 
| Start Code Prefix (3 bytes) | 
| +---------------------------------------------------------------+ | 
| NALU 3 Header (1 byte) | 
| +---------------------------------------------------------------+ | 
| NALU 3 Payload Data | 
| +---------------------------------------------------------------+ | 
| ... | 
| +---------------------------------------------------------------+ | 
| Start Code Prefix (3 bytes) | 
| +---------------------------------------------------------------+ | 
| NALU N Header (1 byte) | 
| +---------------------------------------------------------------+ | 
| NALU N Payload Data | 
| +---------------------------------------------------------------+ | 
说明:每个NALU之前会有一个起始码(0x00000001)和它的NALU头部。这样,在RTP传输中,即使是多个NALU,它们也能通过特定的分隔符(起始码)被正确识别并拼接。
H264 NALU结构图
+-----------------------------------+
|        Start Code Prefix (3 bytes) |
+-----------------------------------+
|         NALU Header (1 byte)       |
+-----------------------------------+
|         Payload Data               |
|  (encoded video data, e.g., I/P/S) |
+-----------------------------------+
H264 NALU Header
+--------------------+-----------------+-----------------+
| forbidden_zero_bit | nal_ref_idc (2) | nal_unit_type (5) |
+--------------------+-----------------+-----------------+
| 字段名 | 长度 | 描述 | 
|---|---|---|
| forbidden_zero_bit | 1 bit | 固定为0,表示没有错误。 | 
| nal_unit_type | 5 bits | 表示NALU的类型(如I帧、P帧、SPS、PPS等)。 | 
| nal_ref_idc | 2 bits | 表示NALU的参考级别(0-3,0表示不作为参考)。 | 
| nal_unit_type | 5 bits | NALU的类型(具体类型根据该字段的值)。 | 
H264 NALU paload
NALU的 Payload Data 是实际的编码数据部分,包括压缩的视频数据。这个部分的数据大小和内容根据NALU类型的不同而变化。例如,I帧、P帧、SPS、PPS等都有不同的数据格式。
典型的NALU类型:
NALU Type 7:SPS (Sequence Parameter Set)
NALU Type 8:PPS (Picture Parameter Set)
NALU Type 5:IDR Frame (I-Frame with Instantaneous Decoder Refresh)
NALU Type 1:Non-IDR Frame (I-Frame without IDR)
NALU Type 6:SEI (Supplemental Enhancement Information)
+------------------------------------------+
|          Start Code Prefix (3 bytes)     |
+------------------------------------------+
|          NALU Header (1 byte)            |
|   +------------------+------------------+ |
|   | forbidden_zero_bit| nal_ref_idc (2)  | |
|   +------------------+------------------+ |
|   | nal_unit_type (5 bits)               | |
+------------------------------------------+
|          Payload Data (variable size)   |
|      (e.g., compressed frame data)      |
+------------------------------------------+
RTP包承载H264数据的FU-A
FU-A(Fragmentation Unit A)是H.264视频编码中用于将大于MTU(最大传输单元)的NALU分割成多个较小单元的一种格式。在H.264视频流传输中,尤其是通过RTP传输时,可能需要将一个大的NALU切分成多个片段,而每个片段就叫做一个 FU-A。为了有效地传输这些分片,FU-A 外层还会有额外的封装信息。
当FU-A片段需要通过 RTP 进行传输时,FU-A片段就成为RTP数据包中的负载部分。在RTP数据包的外层是RTP头部,封装了FU-A片段的传输信息。
+---------------------------------------------------------------+
| RTP Header | 
|---|
| Version (2 bits) | 
| --------------------------------------------------------------- | 
| Marker (1 bit) | 
| --------------------------------------------------------------- | 
| Timestamp (32 bits) | 
| --------------------------------------------------------------- | 
| SSRC (32 bits) | 
| --------------------------------------------------------------- | 
| CSRC (optional, 0-15 entries, each 32 bits) | 
| +---------------------------------------------------------------+ | 
| Payload (FU-A Fragment) | 
| --------------------------------------------------------------- | 
| FU Header | 
| +---------------------------------------------------------------+ | 
| Start Bit=1 | 
| +---------------------------------------------------------------+ | 
| Start Bit=0 | 
| +---------------------------------------------------------------+ | 
| Start Bit=0 | 
| +---------------------------------------------------------------+ | 
FU Header 结构
+---------------------+
|  7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
+---------------------+
| Start | End | Res | NALU Type |
+---------------------+
| 1 bit  | 1 bit | 1 bit | 5 bits  |
+---------------------+
字段解析:
Start Bit (1 bit):第一个分片标志。
End Bit (1 bit):最后一个分片标志。
Reserved (1 bit):保留位,固定为0。
NALU Type (5 bits):NALU类型,表示该片段所属于的NALU类型(比如 I 帧、P 帧、SPS、PPS 等)。
举例说明
假设我们有一个大的 NALU,它需要分成 3 个 FU-A 片段。以下是 FU-A 片段的拆分和组织示意图。
+---------------------------------------------------------------+
| RTP Header (outer RTP header, 12 bytes)                       |
+---------------------------------------------------------------+
| FU Header (Start Bit=1, End Bit=0, NALU Type=X) | 
|---|
| NALU Header (nal_ref_idc=2, nal_unit_type=X) | 
| --------------------------------------------------------------- | 
| Payload Data (Part 1 of the original NALU) | 
| +---------------------------------------------------------------+ | 
| RTP Header (outer RTP header, 12 bytes) | 
| +---------------------------------------------------------------+ | 
| FU Header (Start Bit=0, End Bit=0, NALU Type=X) | 
| --------------------------------------------------------------- | 
| NALU Header (nal_ref_idc=2, nal_unit_type=X) | 
| --------------------------------------------------------------- | 
| Payload Data (Part 2 of the original NALU) | 
| +---------------------------------------------------------------+ | 
| RTP Header (outer RTP header, 12 bytes) | 
| +---------------------------------------------------------------+ | 
| FU Header (Start Bit=0, End Bit=1, NALU Type=X) | 
| --------------------------------------------------------------- | 
| NALU Header (nal_ref_idc=2, nal_unit_type=X) | 
| --------------------------------------------------------------- | 
| Payload Data (Part 3 of the original NALU) | 
| +---------------------------------------------------------------+ | 
| 详细解释: | 
| RTP Header:外层的RTP头部负责标识包的传输信息,如序列号、时间戳等。 | 
| FU Header:每个片段都有一个 FU Header,其中包含了 Start Bit(表示是否为第一个片段)、End Bit(表示是否为最后一个片段)以及 NALU Type(表示该片段属于什么类型的NALU,例如I帧、P帧等)。 | 
| NALU Header:表示NALU的基本信息,包含了该NALU的类型和参考级别等。 | 
| Payload Data:每个片段包含NALU数据的一部分,它会被分为多个片段进行传输,直到整个NALU完全传输完成。 | 
H265 NALU结构
+---------------------------------------------------------------+
|             NALU Start Code (4 bytes)                         |
|                0x00 0x00 0x00 0x01                            |
+---------------------------------------------------------------+
|              NALU Header (1 byte)                             |
|  [Forbidden Zero Bit (1 bit)] [NAL Ref IDC (2 bits)] [NALU Type (5 bits)]  |
|  +------------------------+-----------------+--------------------+
|  | Forbidden Zero Bit (1) | NAL Ref IDC (2) | NALU Type (5)      |
|  +------------------------+-----------------+--------------------+
+---------------------------------------------------------------+
|             Payload Data (Variable size)                       |
|             (Actual NALU data chunk)                           |
+---------------------------------------------------------------+
H265 NALU Header结构
+---------------------------------------------------------------+
|    forbidden_zero_bit (1 bit)  | nal_ref_idc (2 bits) | nal_unit_type (5 bits) |
+---------------------------------------------------------------+
|        0                      |   00  |      (NALU Type)  |
+---------------------------------------------------------------+
forbidden_zero_bit(1 bit):始终为 0。
nal_ref_idc(2 bits):标识该 NALU 的参考级别。
nal_unit_type(5 bits):标识该 NALU 的类型,例如 I 帧、PPS、SPS 等。
常见类型如下:
1:视频分片(视频帧片段)
2:非 IDR 图像(非关键帧)
3:IDR 图像(关键帧)
4:Sequence Parameter Set (SPS)
5:Picture Parameter Set (PPS)
6:Access Unit Delimiter (AUD)
7:End of Sequence (EOS)
8:End of Stream (EOST)
9-31:保留,暂时未使用
H.265 FU-A 分片的结构图
+---------------------------------------------------------------+
|                       RTP Header (12 bytes)                   |
|   (RTP header: 包括序列号、时间戳等传输信息)                     |
+---------------------------------------------------------------+
|                        FU Header (1 byte)                     |
|  [Start Bit (1 bit)] [End Bit (1 bit)] [Reserved (1 bit)] [NALU Type (5 bits)] |
|  +------------------+-------------------+----------------+--------+
|  | Start Bit (1 bit)| End Bit (1 bit)    | Reserved (1 bit)| NALU Type (5 bits) |
|  +------------------+-------------------+----------------+--------+
+---------------------------------------------------------------+
|                    NALU Header (1 byte)                       |
|   [Forbidden Zero Bit (1 bit)] [NAL Ref IDC (2 bits)] [NALU Type (5 bits)] |
|  +------------------------+-----------------+--------------------+
|  | Forbidden Zero Bit (1) | NAL Ref IDC (2) | NALU Type (5)      |
|  +------------------------+-----------------+--------------------+
+---------------------------------------------------------------+
|                Payload Data (Variable size)                    |
|           (This is the fragment of the original NALU data)     |
+---------------------------------------------------------------+
负载H265裸数据并分包:
+-----------------------------+
| RTP Header | 
|---|
| Version, Padding, CSRC, | 
| Marker Bit, Payload Type, | 
| Sequence Number, Timestamp, | 
| SSRC, CSRC(s) | 
| +-----------------------------+ | 
| Payload (H.265 NALU) | 
| +-----------------------------+ | 
| Start Code Prefix (3 bytes) | 
| ----------------------------- | 
| NALU Header (1 byte) | 
| ----------------------------- | 
| Fragmentation Unit Header | 
| (FUS Header) | 
| ----------------------------- | 
| Payload Data (NALU data) | 
| +-----------------------------+ | 
H.265 FU-A Header 结构图
+---------------------------------------------------------------+
|                         FU-A Header (1 byte)                  |
|  [Start Bit (1 bit)] [End Bit (1 bit)] [Reserved (1 bit)] [NALU Type (5 bits)] |
|  +------------------+-------------------+----------------+--------+
|  | Start Bit (1)    | End Bit (1)        | Reserved (1)   | NALU Type (5 bits) |
|  +------------------+-------------------+----------------+--------+
+---------------------------------------------------------------+
参考链接
https://www.cnblogs.com/shu-jie/p/17118869.html
https://hezhaojiang.github.io/post/2020/8b244ad3/
https://blog.csdn.net/qq_41681715/article/details/112408011
https://www.jongbel.com/manual-analysis/hevch-265-video-es-viewer/
https://blog.csdn.net/m0_60259116/article/details/126627095
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号