相比h264,压缩同样的视频获得同样的质量的情况下,h265可以做到压缩后的大小为前者的一半,但压缩时间复杂度增加。h264编码单元为宏块(MB),最大划分为16x16,而h265编码单元为编码树单元(CTU),最大划分为64x64。h264的NALU类型占用5位,理论上最多可以支持32种,但实际上有一些是reserved和unspecified的;h265的NALU类型占用6位,理论上最多可以支持32种,但实际上也有一些是reserved和unspecified的。
char const* nal_unit_type_description_h264[32] = {"Unspecified", //0"Coded slice of a non-IDR picture", //1"Coded slice data partition A", //2"Coded slice data partition B", //3"Coded slice data partition C", //4"Coded slice of an IDR picture", //5"Supplemental enhancement information (SEI)", //6"Sequence parameter set", //7"Picture parameter set", //8"Access unit delimiter", //9"End of sequence", //10"End of stream", //11"Filler data", //12"Sequence parameter set extension", //13"Prefix NAL unit", //14"Subset sequence parameter set", //15"Reserved", //16"Reserved", //17"Reserved", //18"Coded slice of an auxiliary coded picture without partitioning", //19"Coded slice extension", //20"Reserved", //21"Reserved", //22"Reserved", //23"Unspecified", //24"Unspecified", //25"Unspecified", //26"Unspecified", //27"Unspecified", //28"Unspecified", //29"Unspecified", //30"Unspecified" //31
};
char const* nal_unit_type_description_h265[64] = {"Coded slice segment of a non-TSA, non-STSA trailing picture", //0"Coded slice segment of a non-TSA, non-STSA trailing picture", //1"Coded slice segment of a TSA picture", //2"Coded slice segment of a TSA picture", //3"Coded slice segment of a STSA picture", //4"Coded slice segment of a STSA picture", //5"Coded slice segment of a RADL picture", //6"Coded slice segment of a RADL picture", //7"Coded slice segment of a RASL picture", //8"Coded slice segment of a RASL picture", //9"Reserved", //10"Reserved", //11"Reserved", //12"Reserved", //13"Reserved", //14"Reserved", //15"Coded slice segment of a BLA picture", //16"Coded slice segment of a BLA picture", //17"Coded slice segment of a BLA picture", //18"Coded slice segment of an IDR picture", //19"Coded slice segment of an IDR picture", //20"Coded slice segment of a CRA picture", //21"Reserved", //22"Reserved", //23"Reserved", //24"Reserved", //25"Reserved", //26"Reserved", //27"Reserved", //28"Reserved", //29"Reserved", //30"Reserved", //31"Video parameter set", //32"Sequence parameter set", //33"Picture parameter set", //34"Access unit delimiter", //35"End of sequence", //36"End of bitstream", //37"Filler data", //38"Supplemental enhancement information (SEI)", //39"Supplemental enhancement information (SEI)", //40"Reserved", //41"Reserved", //42"Reserved", //43"Reserved", //44"Reserved", //45"Reserved", //46"Reserved", //47"Unspecified", //48"Unspecified", //49"Unspecified", //50"Unspecified", //51"Unspecified", //52"Unspecified", //53"Unspecified", //54"Unspecified", //55"Unspecified", //56"Unspecified", //57"Unspecified", //58"Unspecified", //59"Unspecified", //60"Unspecified", //61"Unspecified", //62"Unspecified", //63
};
h265的参数集比h264的多了一个vps(video parameter set)码流先从vps,sps,pps开始。
h264的NALU头只占一个字节,而h265得NALU头占用两个字节。
h264的NALU头组成:

F(forbidden_zero_bit) :1 bit
nal_ref_idc :2 bits
nal_unit_type :5 bits
h265的NALU头组成:

F(forbidden_zero_bit) :1 bit
Type(nal_unit_type) :6 bits
LayerId(nuh_layer_id) :6 bits
TID(nuh_temporal_id_plus1) :3 bits
下面以一段h265的码流来分析一下:

NALU头“40 01”对应类型为32(VPS)
NALU头“42 01”对应类型为33(SPS)
NALU头“44 01”表示类型为33(PPS)
NALU头“4E 01”表示类型为39(SEI)
h265编码出来的NALU码流的分隔,和h264一样,也是使用00 00 00 01 start code,而且防竞争机制(emulation)也一样。防竞争机制是防止NALU码流中出现00 00 01这种短start code,对NALU分隔造成干扰,在其中插入一个03,即变为00 00 03 01。通常编码器出来的码流都是做过防竞争处理的,在传输或保存NALU时无论是使用start code前缀还是长度前缀,都不需要做去03处理,解码器解码的时候会做这一步操作,当然如果要分析NALU码流,就需要先做去03处理。
具体实现可参考live555源码中的\live\liveMedia\H264or5VideoStreamFramer.cpp文件。