目录
NAL Unit格式
这一部分在h.264标准文档的7.3节。
解释部分在h264标准文档的7.4.1节
NAL Header
+---------------+
|0|1|2|3|4|5|6|7|
+-+-+-+-+-+-+-+-+
|F|NRI| Type |
+---------------+
-
//F: 1个比特.
forbidden_zero_bit. 在 H.264 规范中规定了这一位必须为 0. -
//NRI: 2个比特.
nal_ref_idc. 取00~11,似乎指示这个NALU的重要性,如00的NALU解码器可以丢弃它而不影响图像的回放,11表示其可能有SPS、PPS和作为参考帧的slice等等比较重要的数据.
比如在网传的时候,如果网络卡,那么就需要适当丢掉一些数据,丢掉哪些数据就是根据重要性来进行选择 -
//Type: 5个比特.
nal_unit_type. 这个NALU单元的类型.简述如下:
- - 0 没有定义
- - 1-23 NAL单元 单个 NAL 单元包
- - 24 STAP-A 单一时间的组合
- - 25 STAP-B 单一时间的组包
- - 26 MTAP16 多个时间的合包
- - 27 MTPA24 多个事件组合包
- - 28 FU-A 一帧单包传输
- - 29 FU-B 一帧分多包传输
- - 30-31 没有定义
h264仅用1-23,24以后的用在RTP H264负载类型头中
nal_unit_type
在h264标准文档的表7-1
- 0是没有定义的
- 7——该NALU承载SPS序列参数集
- 8——该NALU承载PPS图像参数集
通过这个方式,我们只需要读取NAL包的第一个单元,就能知道这个NALU包含的是什么,并且能针对不同内容对其进行解析或解码
NAL Body
Extended Byte String Payload
可以在h264标准文档中看到
- 若内部的连续4个字节数据出现了以下情况时
- 0x 00 00 00
- 0x 00 00 01
- 0x 00 00 02
- 0x 00 00 03
- 在两个0字节之后会插入值为3的一个字节:
- 0x 00 00 03 00
- 0x 00 00 03 01
- 0x 00 00 03 02
- 0x 00 00 03 03
防止NAL内部出现和起始码一样的冲突
在00后面插入一个03,形成的就是Extended Byte String Payload
如果需要对其解析,需要将03去除后进行解析。
RBSP和SODB
RBSP是去掉03后的数据
问:RBSP是不是等同于原始语法元素值本身?
有时候并不是如此。语法元素进行编码后,并不是按照每个byte对其,可能最后在整数个字节后余下3、4、5个bit的空余;而RBSP(Raw Byte Sequence Payload)有个字是byte,也就是说这里面的数据是按照字节来对齐的
。因此在希望得到这样的数据的时候,需要在原始语法元素的码流后面添加一个rbsp_trailing_bits
,作用是实现字节的对其。
rbsp_trailing_bits
包含一个固定的1bitt和若干个0bit,0的数量直到实现字节对其为止。
---xxx|10|100000|
---------|rtb |
NAL Unit是紧密传输的,若一个NALU没有对齐,后面的NALU都不会对齐。所以需要时时刻刻进行对齐,在比特位进行比对的操作,但这样对接收端和解码端造成极大的负担。所以在RBSP这一层添加了字节对齐的功能。
SODB:String Of Data Bits
实际h264语法元素编码后的二进制码流(不保证对齐),即编码后的视频流
大多数情况会有空余,所以需要逐层向上封装,形成NALU这样的结构
结构关系
RBSP + RBSP trailing bits + SODE = RBSP
NAL header(1byte) + RBSP = NALU