NALU打包成RTP的方式有三种:
1. 单一 NAL 单元模式
即一个 RTP 包仅由一个完整的 NALU 组成. 这种情况下 RTP NAL 头类型字段和原始的 H.264的
NALU 头类型字段是一样的.
2. 组合封包模式
即可能是由多个 NAL 单元组成一个 RTP 包. 分别有4种组合方式: STAP-A, STAP-B, MTAP16, MTAP24.
那么这里的类型值分别是 24, 25, 26 以及 27.
3. 分片封包模式
用于把一个 NALU 单元封装成多个 RTP 包. 存在两种类型 FU-A 和 FU-B. 类型值分别是 28 和 29.
I帧分为IDR帧和普通I帧:
I和IDR帧都是使用帧内预测的。它们都是同一个东西而已,在编码和解码中为了方便,要首个I帧和其他I帧区别开,所以才把第一个首个I帧叫IDR,这样就方便控制编码和解码流程。IDR帧的作用是立刻刷新,使错误不致传播,从IDR帧开始,重新算一个新的序列开始编码。而I帧不具有随机访问的能力,这个功能是由IDR承担。IDR会导致DPB(DecodedPictureBuffer参考帧列表——这是关键所在)清空,而I不会。IDR图像一定是I图像,但I图像不一定是IDR图像。一个序列中可以有很多的I图像,I图像之后的图像可以引用I图像之间的图像做运动参考。一个序列中可以有很多的I图像,I图像之后的图象可以引用I图像之间的图像做运动参考。
对于IDR帧来说,在IDR帧之后的所有帧都不能引用任何IDR帧之前的帧的内容,与此相反,对于普通的I-帧来说,位于其之后的B-和P-帧可以引用位于普通I-帧之前的I-帧。从随机存取的视频流中,播放器永远可以从一个IDR帧播放,因为在它之后没有任何帧引用之前的帧。但是,不能在一个没有IDR帧的视频中从任意点开始播放,因为后面的帧总是会引用前面的帧。
IDR帧通常会跟在pps和sps后
start code (起始码) 00 00 00 01 (一帧的开始)or 00 00 01 (一帧的中间)
只有当该NALU所包含的编码数据不是一帧的开头时,起始码为0x000001,其余情况为0x00000001
起始码后跟着NALU(Network Abstraction Layer Units, 网络抽取层单元),
h264的码流就是由一个个NALU组成的
每个NALU由一个NALU头加RBSP组成:
NALU头 一个字节构成
+---------------+
|0|1|2|3|4|5|6|7|
+-+-+-+-+-+-+-+-+
|F|NRI| Type |
+---------------+
(1)第1位禁止位,值为1表示语法出错
forbidden_zero_bit:在 H.264 规范中规定了这一位必须为 0.
(2)第2~3位为参考级别
nal_ref_idc:取00~11,似乎指示这个NALU的重要性,如00的NALU解码器可以丢弃\
它而不影响图像的回放,0~3,取值越大,表示当前NAL越重要,需要\
优先受到保护。如果当前NAL是属于参考帧的片,或者是序列参数集,\
或是图像参数集这些重要的单位时,本句法元素必须大于0.
(3)第4~8为是nal单元类型
nal_unit_type:这个NALU单元的类型,1~12由H.264使用,24~31由H.264以外的\
应用使用,简述如下:
0 没有定义
1-23 NAL单元 单个 NAL 单元包
1 不分区,非IDR图像的片
2 片分区A
3 片分区B
4 片分区C
5 IDR图像中的片
6 补充增强信息单元(SEI)
7 序列参数集(SPS)
8 图像参数集(PPS)
9 分界符
10 序列结束
11 码流结束
12 填充
13-23 保留
24 STAP-A 单一时间的组合包
25 STAP-B 单一时间的组合包
26 MTAP16 多个时间的组合包
27 MTAP24 多个时间的组合包
28 FU-A 分片的单元
29 FU-B 分片的单元
30-31 没有定义
RBSP (Raw Byte Sequence Payload, 原始数据字节流)
RBSP有多中类型,如:
SPS:seq_parameter_set, 序列参数集
PPS:pic_parameter_set, 序列图像集
SODB:String Of Data Bits,原始数据比特流
注:
1、SPS,PPS为编码数据的解码提供必备信息,SODB包含的则是编码数据。还有其他类型的NALU,如SEI等,在这为简化理解就不列出并讨论了,。
2、以上类型包长度不一定是8的倍数,故需添加拖尾数据(trailing)补齐,构成RBSP。
分包
h264包在传输的时候,如果包太大,会被分成多个片。NALU头会被如下的2个自己代替。
The FU indicator octet has the following format:
+---------------+
|0|1|2|3|4|5|6|7|
+-+-+-+-+-+-+-+-+
|F|NRI| Type |
+---------------+
Type为FU-A
The FU header has the following format:
+---------------+
|0|1|2|3|4|5|6|7|
+-+-+-+-+-+-+-+-+
|S|E|R| Type |
+---------------+
S bit为1表示分片的NAL开始,当它为1时,E不能为1
E bit为1表示结束,当它为1,S不能为1
R bit保留位
Type就是NALU头中的Type,取1-23的那个值