https://github.com/latelee/H264BSAnalyzer 是一个Win程序,用于分享H264文件,已有打包好exe的文件。
打开一个H264文件,如图
可以看到这个软件已经把每一个Nal解析为一行一行的,H264文件就是以Nal为单位。
一个H264文件,开头的是SPS和PPS,SEI可有可无,然后就是I帧,再就P帧或者B帧。
每一帧都会有一个start code,H264BSAnalyzer 是将 00 00 00 01
+ FNRIType(第一个字节)
作为 start code 。
00 00 00 01
也可以看做是一个分隔符,00 00 01
也是合法的
FNRIType的二进制表示意义:
1 | // +---------------+ |
F 占1bit,是禁止位,它的值一定是0,非0就说明这个Nal是错误的
NRI 占2bit,它的取值范围在0~3,值越大,表示这个Nal越重要
Type 占5bit,表示Nal的类型nal_type。
常见的FNRIType字节值有:
1 | 67:SPS |
通过这个字节可以简单的判断帧类型,但严谨的作法是: 读取这个字节的低位5个bit,转为十进制,这才是真正的类型值 nal_type。
以 0x67 作为例:
- 0x67的二进制是 0x01100111
- 取5个bit高位补零 就是 0x00000111 ( &0x1F )
- 十进制是7。
- 查表找到SPS
值 | NAL类型 |
---|---|
0 | 未使用 |
1 | 非IDR的片 |
2 | 片数据A分区 |
3 | 片数据B分区 |
4 | 片数据C分区 |
5 | 一个序列的第一个图像叫做 IDR 图像(立即刷新图像),IDR 图像都是 I 帧 |
6 | 补充增强信息单元(SEI) |
7 | 序列参数集(SPS) |
8 | 图像参数集(PPS) |
9 | 分界符 |
10 | 序列结束 |
11 | 码流结束 |
12 | 填充 |
13…23 | 保留 |
24…31 | 未使用 |