h264 startcode 3字节和4字节
对H264 startcode一些粗浅的认识
为什么需要startcode
主要是为了将相邻两个NALU划分开,让他们有一个界线,方便解码,比如将h264的数据存储在一个文件当中,解码器无法从数据流中分别每个NALU的起始位置。
在编码时,每个NALU前面添加startcode(占4字节0x00000001或者3字节0x000001),这里有人会想到万一中间出现0x000001怎么办呢,h264有个防止竞争的机制,在编码完一个NAL时,如果出现有连续两个0x00字节,就在后面插入一个0x03(解码的时候这个0x03会被丢弃)。
决定起始部分占4字节还是3字节
实际上startcode只占3字节,4字节的起始部分 = zero_byte + start_code_prefix_one_3bytes,就是说无论啥时候其实startcode都是3字节,关键就在于zero_byte。
包含sps,pps的NALU前面要加zero_byte(4字节)。
当一帧被分为多个slice时,首个NALU前面要加zero_byte(4字节)。
SPS (4字节头)
PPS (4字节头)
SEI (4字节头)
I0(slice0) (4字节头)
I0(slice1) (3字节头)
P1(slice0) (4字节头)
P1(slice1) (3字节头)
P2(slice0) (4字节头)
P2(slice1) (3字节头)
总结一下就是,当一个完整的帧被分为多个slice时,除掉第一个NALU,剩下的都用3字节的,其余的都是4字节。