H264 码流结构
H264 码流是由很多 NAL Unit 组成,所有 NAL Unit 均存在一个八位数据的 NAL Unit Header ,这八位数据也充当此 RTP 有效负载格式的有效负载头。一个 NAL Unit Header 的语法如下:
+---------------+
|0|1|2|3|4|5|6|7|
+-+-+-+-+-+-+-+-+
|F|NRI| Type |
+---------------+
-
F: 1bit forbidden_zero_bit,在 H.264 规范中规定了这一位必须为 0。
-
NRI: 2bit nal_ref_idc,取 00 ~ 11, 似乎指示这个 NALU 的重要性,如 00 的 NALU 解码器可以丢弃它而不影响图像的回放。不过一般情况下不太关心这个属性。
-
Type: 5bit 等于 nal_unit_type,标识着这个 NAL Unit 的 Type,其类型如下:
Table 1. Summary of NAL unit types and the corresponding packet types NAL Unit Packet Packet Type Name Section Type Type ------------------------------------------------------------- 0 reserved - 1-23 NAL unit Single NAL unit packet 5.6 24 STAP-A Single-time aggregation packet 5.7.1 25 STAP-B Single-time aggregation packet 5.7.1 26 MTAP16 Multi-time aggregation packet 5.7.2 27 MTAP24 Multi-time aggregation packet 5.7.2 28 FU-A Fragmentation unit 5.8 29 FU-B Fragmentation unit 5.8 30-31 reserved
H264 码流打包
RFC 6184 Section 5.2 中指定了 3 种打包方式:
- 单 NAL 单元模式(Single NAL Unit Packet): 仅包含单个 NAL 单元的有效载荷。
- 组合封包模式(Aggregation Packet):用于聚合多个 NAL 单元的分组类型成为单个 RTP 有效负载。
- 分片封包模式(Fragmentation Unit):用于将单个 NAL 单元分段成多个 RTP 数据包。
单 NAL 单元模式
一个 RTP 包仅由一个完整的 NALU 组成。这种情况下 RTP 的 NAL 头类型字段和原始的 H.264 的 NALU 头类型字段是一样的。
对于 NALU 的长度小于 MTU 大小的包,一般采用单一 NAL 单元模式。一个原始的 H.264 NALU 单元常由 [Start Code] [NALU Header] [NALU Payload] 三部分组成,其中 Start Code 用于标示这是一个 NALU 单元的开始,必须是 "00 00 00 01" 或 "00 00 01", NALU 头仅一个字节,其后都是 NALU 单元内容,打包时去除 "00 00 01" 或 "00 00 00 01" 的开始码,把其他数据封包为 RTP 包即可。
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+