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 | 未使用 |