标准定义
RFC 3550
RTP标准头
| 字段 | 占用(bit) | 说明 |
|---|
| version | 2 | 版本号,一般默认是2 |
| padding | 1 | 是否填充标志。为1表示填充,在RTP包的末尾会填充数据。填充的长度由RTP包的最后一个字节指定,不包含最后一个字节 |
| extension | 1 | 版本号,一般默认是2 |
| CSRC count | 4 | CSRC计数器 |
| marker | 1 | 一种标识。视频包时:表示一帧的结束(一帧的最后一个RTP包该值为1)。音频包时:表示会话开始,也就是第一个音频的RTP包 |
| payload type | 7 | 载荷类型。H264或H265该值一般为96(0x96) |
| sequence number | 16 | RTP包的序号 |
| timestamp | 32 | 时间戳。视频包的时间戳时钟频率固定位90000HZ,音频包的时间戳根据采样率变化 |
| SSRC | 32 | 同步信源标识符。一个RTP会话中,不会存在两个相同的SSRC值。比如一个会话中的视频包和音频包的SSRC值都是不同的 |
RTP拓展头
| 字段 | 占用(bit) | 说明 |
|---|
| defined by profile | 16 | 拓展数据类型,一般自定义 |
| length | 16 | 拓展数据长度,不包含defined by profile和length字段的占用 |
| header extension | length * 8 | 拓展数据内容 |
H264 RTP封装
H264 Nalu单元头

| 比特位 | 字段名称 | 长度 | 含义 |
|---|
| 7 | forbidden_zero_bit | 1 bit | 禁止位。通常为 0。如果网络传输中发现比特错误,可能会将其置为 1,接收端据此丢弃该包。 |
| 5-6 | nal_ref_idc | 2 bits | 参考级别。表示该 NALU 的重要性(0-3)。值越大越重要,解码器在处理不过来时可丢弃低优先级的包。 |
| 0-4 | nal_unit_type | 5 bits | NALU 类型。这是最核心的字段,定义了 Payload 中装的是什么数据(如 I 帧、P 帧、SPS、PPS 等)。 |
常见头部字节
| 十六进制值 | 二进制拆解 (F + NRI + Type) | 类型名称 | 说明 |
|---|
| 0x67 | 0 11 00111 | SPS | 序列参数集,包含分辨率等全局信息,优先级最高 (NRI=3, Type=7)。 |
| 0x68 | 0 11 01000 | PPS | 图像参数集,包含解码一幅图像所需的参数,优先级高 (NRI=3, Type=8)。 |
| 0x65 | 0 11 00101 | IDR | 关键帧(I 帧),解码的起点,优先级高 (NRI=3, Type=5)。 |
| 0x61 | 0 11 00001 | P 帧 | 非 IDR 图像片(通常是 P 帧),用于参考 (NRI=3, Type=1)。 |
| 0x41 | 0 10 00001 | P 帧 | 非 IDR 图像片,优先级稍低 (NRI=2, Type=1)。 |
| 0x01 | 0 00 00001 | B 帧 | 非 IDR 图像片(通常是 B 帧),不可用于参考 (NRI=0, Type=1)。 |
| 0x06 | 0 00 00110 | SEI | 补充增强信息,如时间戳、用户数据等 (NRI=0, Type=6)。 |
载荷
| NAL Unit Type | Packet Type Name | 说明 |
|---|
| 0 | 未指定 | 保留 (Reserved) |
| 1 | 非 IDR 片 | Coded slice of a non-IDR picture (P帧/B帧) |
| 2 | 切片数据分区 A | Coded slice data partition A |
| 3 | 切片数据分区 B | Coded slice data partition B |
| 4 | 切片数据分区 C | Coded slice data partition C |
| 5 | IDR 片 | Coded slice of an IDR picture (关键帧 I帧) |
| 6 | 补充增强信息 | Supplemental enhancement information (SEI) |
| 7 | 序列参数集 | Sequence parameter set (SPS) |
| 8 | 图像参数集 | Picture parameter set (PPS) |
| 9 | 访问单元分隔符 | Access unit delimiter |
| 10 | 序列结尾 | End of sequence |
| 11 | 流结尾 | End of stream |
| 12 | 填充数据 | Filler data |
| 13 | 序列参数集扩展 | Sequence parameter set extension |
| 14 | 切片层扩展 | Prefix NAL unit |
| 15 | 子序列参数集 | Subset sequence parameter set |
| 16 | 保留 | Reserved (用于深度参数集等) |
| 17 | 保留 | Reserved |
| 18 | 切片层扩展 | Sliced layer extension |
| 19 - 23 | 保留 | Reserved |
| 24 | STAP-A | Single-time aggregation packet (单时间聚合包) |
| 25 | STAP-B | Single-time aggregation packet (单时间聚合包) |
| 26 | MTAP16 | Multi-time aggregation packet (多时间聚合包, 16位偏移) |
| 27 | MTAP24 | Multi-time aggregation packet (多时间聚合包, 24位偏移) |
| 28 | FU-A | Fragmentation unit (分片单元 A, 最常用) |
| 29 | FU-B | Fragmentation unit (分片单元 B) |
| 30 | 保留 | Reserved |
| 31 | 保留 | Reserved |
单一分包模式
RTP包头后面直接+H264的裸数据(去除起始码),比如SPS和PPS这种小于一个RTP包大小的就直接封装为一个RTP包
聚合包
切片包(FU-A)
对于一帧数据大于一个RTP包的大小的,就需要采用RTP分包的策略。这时候H264的NALU头中的nal_unit_type值固定位28(表示FU-A),这个字节也被称为(FU indicator),后面接着的是分片单元头(FU header),然后是去掉H264 Nalu头的数据依次放入多个RTP包中
分片单元头(FU header)

| 比特位 | 字段名称 | 长度(bit) | 含义 |
|---|
| 7 | S (Start) | 1 | 起始位。设置为 1 时,表示这是被分片 NALU 的第一个 RTP 包。 |
| 6 | E (End) | 1 | 结束位。设置为 1 时,表示这是被分片 NALU 的最后一个 RTP 包。 |
| 5 | R (Reserved) | 1 | 保留位。发送时必须设置为 0,接收时必须忽略。 |
| 0-4 | Type | 5 | 类型。该字段的值与原始 NALU 的类型完全相同。例如,如果分片的是一个 I 帧(NALU Type 5),那么这里的 Type 值也是 5。 |
H265 RTP封装
H265 Nalu单元头

| 比特位 | 字段名称 | 长度 | 含义 |
|---|
| 15 | forbidden_zero_bit | 1 bit | 禁止位。必须为 0。如果为 1 表示语法违规或传输错误。 |
| 9-14 | nal_unit_type | 6 bits | NALU 类型。这是核心字段,定义了数据内容(如 VPS, SPS, IDR, TRAIL 等)。 |
| 3-8 | nuh_layer_id | 6 bits | 层级 ID。用于可伸缩视频编码(SVC)或 3D 视频,普通视频中通常为 0。 |
| 0-2 | nuh_temporal_id_plus1 | 3 bits | 时域 ID + 1。表示该 NALU 所属的时间层。值为 0 是非法的,通常至少为 1。 |
常见头部字节
| 类型名称 | Type 值 | 典型头部 (Hex) | 说明 |
|---|
| VPS | 32 | 40 01 | 视频参数集。H.265 特有,包含多图层配置。 |
| SPS | 33 | 42 01 | 序列参数集。包含分辨率、位深等信息。 |
| PPS | 34 | 44 01 | 图像参数集。包含切片头、量化参数等。 |
| IDR | 19/20 | 26 01 / 28 01 | 关键帧。Type 19 (IDR_W_RADL) 或 Type 20 (IDR_N_LP)。 |
| CRA | 21 | 2A 01 | 清理随机访问。类似 I 帧,用于随机接入点。 |
| TRAIL | 0/1 | 00 01 / 02 01 | 普通帧 (P/B 帧)。Type 0 (非参考) 或 Type 1 (参考)。 |
| SEI | 39/40 | 4E 01 / 50 01 | 辅助信息。Type 39 (前缀) 或 Type 40 (后缀)。 |
载荷
| 类型值 | 名称 | 类别 | 说明 |
|---|
| 0 | TRAIL_N | VCL | 普通非参考切片 (Trailing non-reference) |
| 1 | TRAIL_R | VCL | 普通参考切片 (Trailing reference) |
| 2 | TSA_N | VCL | 时间子层访问 - 非参考 (Temporal Sub-layer Access) |
| 3 | TSA_R | VCL | 时间子层访问 - 参考 |
| 4 | STSA_N | VCL | 逐步时间子层访问 - 非参考 |
| 5 | STSA_R | VCL | 逐步时间子层访问 - 参考 |
| 6 | RADL_N | VCL | 随机访问可解码前导图 - 非参考 |
| 7 | RADL_R | VCL | 随机访问可解码前导图 - 参考 |
| 8 | RASL_N | VCL | 随机访问跳过前导图 - 非参考 |
| 9 | RASL_R | VCL | 随机访问跳过前导图 - 参考 |
| 10-15 | RSV_VCL | VCL | 保留 (Reserved) |
| 16 | BLA_W_LP | VCL | 断链访问 - 低延迟 (Broken Link Access) |
| 17 | BLA_W_RADL | VCL | 断链访问 - 带RADL |
| 18 | BLA_N_LP | VCL | 断链访问 - 无前导图 |
| 19 | IDR_W_RADL | VCL | 关键帧 - 带RADL (Instantaneous Decoding Refresh) |
| 20 | IDR_N_LP | VCL | 关键帧 - 无前导图 (纯IDR) |
| 21 | CRA_NUT | VCL | 清理随机访问 (Clean Random Access) |
| 22-23 | RSV_IRAP | VCL | 保留 IRAP (Reserved Intra Random Access Point) |
| 24-31 | RSV_VCL | VCL | 保留非IRAP VCL |
| 32 | VPS_NUT | Non-VCL | 视频参数集 (Video Parameter Set) |
| 33 | SPS_NUT | Non-VCL | 序列参数集 (Sequence Parameter Set) |
| 34 | PPS_NUT | Non-VCL | 图像参数集 (Picture Parameter Set) |
| 35 | AUD_NUT | Non-VCL | 访问单元分隔符 (Access Unit Delimiter) |
| 36 | EOS_NUT | Non-VCL | 序列结束 (End of Sequence) |
| 37 | EOB_NUT | Non-VCL | 比特流结束 (End of Bitstream) |
| 38 | FD_NUT | Non-VCL | 填充数据 (Filler Data) |
| 39 | PREFIX_SEI | Non-VCL | 前缀 SEI (Supplemental Enhancement Info) |
| 40 | SUFFIX_SEI | Non-VCL | 后缀 SEI |
| 41-47 | RSV_NVCL | Non-VCL | 保留 (Reserved) |
| 48-63 | UNSPEC | Non-VCL | 未指定 (Unspecified) |
单一分包模式
RTP包头后面直接+H265的裸数据(去除起始码),比如SPS和PPS这种小于一个RTP包大小的就直接封装为一个RTP包
聚合包
切片包(FU-A)
对于一帧数据大于一个RTP包的大小的,就需要采用RTP分包的策略。这时候H265的NALU头中的nal_unit_type值固定位28(表示FU-A),然后第二个字节保持不变,这两个字节也被称为(PayloadHdr),后面接着的是分片单元头(FU header),然后是去掉H265 Nalu头的数据依次放入多个RTP包中
分片单元头(FU header)

| 比特位 | 字段名称 | 长度(bit) | 含义 |
|---|
| 7 | S (Start) | 1 | 起始位。设置为 1 时,表示这是被分片 NALU 的第一个 RTP 包。 |
| 6 | E (End) | 1 | 结束位。设置为 1 时,表示这是被分片 NALU 的最后一个 RTP 包。 |
| 0-5 | FuType | 6 | 分片类型。该字段的值与原始 NALU 的类型完全相同。例如,如果分片的是一个 IDR 帧(NALU Type 19),那么这里的 FuType 值也是 19。 |
评论已关闭