文章目录
一. NALU的基础知识
1.1 基础知识
Annex-B,StartCode,AVCC
Annex-B: 使用start code分隔NAL(start code为三字节或四字节,0x000001或0x00000001,一般是四字节);SPS和PPS按流的方式写在头部
Start Code: 起始码+NALU的方式,其中4字节的起始码0x00000001通常标志流的随机访问点SPS, PPS, AUD,IDR,其他NALU使用3字节的起始码
AVCC: 使用NALU长度(固定字节,通常为4字节)分隔NAL;在头部包含 **extradata** (或sequence header)的结构体
Annex-B的NALU的结构
H264 NALU: 00 00 00 01(4字节) | NALU type(1字节) | NALU_data (N字节) | 0x00 00 00 01 |
---|---|---|---|
起始码(4字节) | 类型 | 数据 | 下一个NALU |
NALU_type 1字节,定义为:
1比特禁止位 | 2比特 重要性指示位 | 5比特 类型 |
---|---|---|
固定为0 | 11 | 1-12 由h264使用 |
1.2 H264和H265中的NALU的信息
if(isH265) {
nalu_unit->type = (src_data->ReadInt(1) & 0x7E) >> 1;
}else {
nalu_unit->type = (src_data->ReadInt(1) & 0x1F);
}
1.2.1 H264中的NALU的类型
enum class H264NaluType: int {
kNalSlice = 1, // 非IDR的片
kNalDPA = 2, // 片数据A分区
kNalDPB = 3, // 片数据B分区
kNalDPC = 4, // 片数据C分区
kNalIDR_Slice = 5, // IDR图像的片
kNalSEI = 6, // 补充增强信息单元(SEI)
kNalSPS = 7, // 序列参数集(SPS)
kNalPPS = 8, // 图像参数集(PPS)
kNalAUD = 9, // 间隔符
kNalEndSequence = 10,
kNalEndStream = 11,
kNalFillerData = 12,
kNalSpsExt = 13,
kNalAuxiliarySlice = 19,
kNalFfIgnore = 0xff0f001
};
0x61 (0 11 00001) I帧 重要 type = 1 非IDR的I帧 不大常见
0x41 (0 10 00001) P帧 重要 type = 1
0x01 (0 00 00001) B帧 不重要 type = 1
所以判断是否为IDR帧的算法为:
(NALU类型&0001 1111)=5 即 NALU类型0x65&0x1F=5
1.2.2 H265中的NALU的类型
enum class HEVCNaluType : int {
kNalTrailN = 0,
kNalTrailR = 1,
kNalTsaN = 2,
kNalTsaR = 3,
kNalStsaN = 4,
kNalStsaR = 5,
kNalRadlN = 6,
kNalRadlR = 7,
kNalRaslN = 8,
kNalRaslR = 9,
kNalBlaWLP = 16,
kNalBlaWRadl = 17,
kNalBlaNLP = 18,
kNalIdrWRadl = 19,
kNalIdrNLP = 20,
kNalCraNut = 21,
kNalVps = 32,
kNalSps = 33,
kNalPps = 34,
kNalAud = 35,
kNalEosNut = 36,
kNalEobNut = 37