H264的内容非常多,网上也有很多资料,这里我写下我在做直播过程中对H264数据格式的一些理解正式进入正题。
一、H264格式:
H264都是由一个一个NAL单元组成,每一个单元的起始码都是0x00 0x00 0x00 0x01或者0x00 0x00 0x01来组成,紧接着后面一个字节就代表着这一帧数据的类型H264的Nal类型总共有这么几种:
// MARK: - NALType
enum NALType: UInt8 {
case UNSPEC = 0
case SLICE = 1 // P frame
case DPA = 2
case DPB = 3
case DPC = 4
case IDR = 5 // I frame
case SEI = 6
case SPS = 7
case PPS = 8
case AUD = 9
case EOSEQ = 10
case EOSTREAM = 11
case FILL = 12
}
具体计算通过&0x1f可以得出,其是推流过程我们只需要了解 p帧 I帧 SPS PPS SEI这几种数据类型就可以了。 下面是我录制的一个h264文件通过它可以更清晰的理解H264的内部结构。
二进制:
下面可以分析第一帧 00 00 00 01 27,0x27&0x1f也就是 00100111&00011111 = 00000111 = 7也就是代表第一帧是sps帧
第二帧 00 00 00 01 28 &0x1f的结果就是8代表的是pps帧,第三帧00 00 00 01 06就是SEI帧 第四帧00 00 00 01 25就是IDR帧 第五帧 00 00 00 01 21 就是P帧 第6,7帧都是P帧,...依次去这样判断,紧接着还是这样的结构: