打赏

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

posted @   苍山落暮  阅读(17)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
历史上的今天:
2020-02-07 golang-grpc

喜欢请打赏

扫描二维码打赏

了解更多

点击右上角即可分享
微信分享提示