咸鱼

咸鱼是以盐腌渍后,晒干的鱼

0%

开源的H264数据包分析软件H264BSAnalyzer

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
2
3
4
5
// +---------------+
// |0|1|2|3|4|5|6|7|
// +-+-+-+-+-+-+-+-+
// |F|NRI| Type |
// +---------------+

F 占1bit,是禁止位,它的值一定是0,非0就说明这个Nal是错误的
NRI 占2bit,它的取值范围在0~3,值越大,表示这个Nal越重要
Type 占5bit,表示Nal的类型nal_type。

常见的FNRIType字节值有:

1
2
3
4
5
6
67:SPS
68:PPS
65:I帧
41:非I帧
61:非I帧
...

通过这个字节可以简单的判断帧类型,但严谨的作法是: 读取这个字节的低位5个bit,转为十进制,这才是真正的类型值 nal_type。
以 0x67 作为例:

  1. 0x67的二进制是 0x01100111
  2. 取5个bit高位补零 就是 0x00000111 ( &0x1F )
  3. 十进制是7。
  4. 查表找到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 未使用