1 NALU头

这里跟H264不同的是,NALU Header占用2个字节。

alt text

  • F(forbidden_zero_bit): 必须为0,表示有效;为1的话表示无效(传输工程中发送错误)。

  • Type(nalu_unit_type): 占6bit,NAL Type确定NAL的类型,其中VCL NAL和non-VCL NAL各有32类。
    • 0 - 31是VCL NAL单元;

    • 32 - 63是非VCL NAL单元,VCL是指携带编码数据的数据流,而non-VCL则是控制数据流。

  • LayerID(nuh_layer_id): 表示NAL所在的Access unit所属的层,该字段是为了HEVC的继续扩展设置。也就是目前都是0,以后的扩展可能会用到。

  • TID(nuh_temporal_id_plus1): 占用3bit,指示当前 NAL 单元所属的层次或帧的时间层级。(一般都是1,具体作用目前我还没明白)

1.1 NALU type

/**
 * Table 7-3: NAL unit type codes
 */
enum HEVCNALUnitType {
    HEVC_NAL_TRAIL_N    = 0, /* B帧(表示尾部帧,非参考帧,所以是B帧) */
    HEVC_NAL_TRAIL_R    = 1,  /* P帧(表示尾部帧,参考帧,所以是P帧) */
    HEVC_NAL_TSA_N      = 2,
    HEVC_NAL_TSA_R      = 3,
    HEVC_NAL_STSA_N     = 4,
    HEVC_NAL_STSA_R     = 5,
    HEVC_NAL_RADL_N     = 6,
    HEVC_NAL_RADL_R     = 7,
    HEVC_NAL_RASL_N     = 8,
    HEVC_NAL_RASL_R     = 9,
    HEVC_NAL_VCL_N10    = 10,
    HEVC_NAL_VCL_R11    = 11,
    HEVC_NAL_VCL_N12    = 12,
    HEVC_NAL_VCL_R13    = 13,
    HEVC_NAL_VCL_N14    = 14,
    HEVC_NAL_VCL_R15    = 15,
    HEVC_NAL_BLA_W_LP   = 16,
    HEVC_NAL_BLA_W_RADL = 17,
    HEVC_NAL_BLA_N_LP   = 18,
    HEVC_NAL_IDR_W_RADL = 19,  /* I帧 */
    HEVC_NAL_IDR_N_LP   = 20,
    HEVC_NAL_CRA_NUT    = 21,
    HEVC_NAL_IRAP_VCL22 = 22,
    HEVC_NAL_IRAP_VCL23 = 23,
    HEVC_NAL_RSV_VCL24  = 24,
    HEVC_NAL_RSV_VCL25  = 25,
    HEVC_NAL_RSV_VCL26  = 26,
    HEVC_NAL_RSV_VCL27  = 27,
    HEVC_NAL_RSV_VCL28  = 28,
    HEVC_NAL_RSV_VCL29  = 29,
    HEVC_NAL_RSV_VCL30  = 30,
    HEVC_NAL_RSV_VCL31  = 31,
    HEVC_NAL_VPS        = 32,   /* VPS 类型的NAL */
    HEVC_NAL_SPS        = 33,   /* SPS 类型的NAL */
    HEVC_NAL_PPS        = 34,   /* PPS 类型的NAL */
    HEVC_NAL_AUD        = 35,   /* AUD 分隔符类型的 NAL */
    HEVC_NAL_EOS_NUT    = 36,
    HEVC_NAL_EOB_NUT    = 37,
    HEVC_NAL_FD_NUT     = 38,
    /**
     * 位置:出现在实际编码视频数据(VCL NAL 单元)之前
     * 作用:通常用于在解码视频流前提供一些非视频编码相关的附加信息,这些信息可能包括场景切换、视频流的说明、缓冲区控制等。
     * 常见用途:例如传递HDR (高动态范围) 元数据,帧速率信息等。
    */
    HEVC_NAL_SEI_PREFIX = 39,
    /**
     * 位置:出现在编码视频数据(VCL NAL 单元)之后。
     * 作用:通常用于提供与解码后的视频数据相关的额外信息,但这些信息只有在解码VCL NAL单元之后才有用。
     * 常见用途:例如与特定帧相关的增强信息,在解码后提供进一步的控制和描述。
    */
    HEVC_NAL_SEI_SUFFIX = 40,
};

1.2 NALU常用Header

  • 0x40 0x01 VPS类型的NAL

  • 0x42 0x01 SPS类型的NAL

  • 0x44 0x01 PPS类型的NAL

  • 0x26 0x01 IDR关键帧类型的NAL

  • 0x02 0x01 P帧类型的NAL