前面文章《rtmp数据封装一-块(chunk)》中讲到rtmp传输媒体数据时是把一整帧数据拆分成chunk的形式发送的。其实一帧媒体数据在拆分成chunk之前还需要进行必要的头部信息封装,本文介绍rtmp协议中H.264/H.265视频数据的头部信息封装。
AVCDecoderConfigurationRecord
SPS
PPS
1) frame type
高4位表示是否是关键帧,低4位表示编码类型。SPS和PPS是关键帧用1表示,H.264(AVC)对应的值是7,所以这个byte是0x17。
2) fixed
这4个byte的具体含义我也不清楚,但对于H.264 AVCDecoderConfigurationRecord来说是 0x00 0x00 0x00 0x00
3) configurationVersion
0x01
4) AVCProfileIndication
SPS的第2个byte,也就是去掉第一个byte的NALU type之后的那个byte。
5) profile_compatibility
SPS的第3个byte。
6) AVCLevelIndication
SPS的第4个byte。
7) lengthSizeMinusOne
0xff
8) sps number
SPS的序号,是0xE1
9) sps data length
这2个byte表示SPS数据的长度,长度是去掉分隔符00000001之后的长度。高位存在第一个byte,低位存在最后一个byte。如:
packet[i++] = (data_size>>8)&0xff;
packet[i++] = data_size&0xff;
10) sps data
最后是存放SPS数据,不包含开头的分隔符00000001。
11) pps number
PPS的序号,是0x01
12) pps data length
这2个byte表示PPS数据的长度,长度是去掉分隔符00000001之后的长度。高位存在第一个byte,低位存在最后一个byte。
13) pps data
最后是存放PPS数据,不包含开头的分隔符00000001。
1) frame type
如果关键帧就是0x17,如果非关键帧就是0x27。高4位表示是否是关键帧,低4位表示编码类型,H.264(AVC)对应的值是7。
2) fixed
这4个byte的具体含义我也不清楚,但对于H.264来说都是固定值 0x01 0x00 0x00 0x00
3) NALU size
这4个byte表示NALU数据的长度,长度是去掉分隔符00000001之后的长度。高位存在第一个byte,低位存在最后一个byte。如:
packet[i++] = (data_size>>24)&0xff;
packet[i++] = (data_size>>16)&0xff;
packet[i++] = (data_size>>8)&0xff;
packet[i++] = data_size&0xff;
4) NALU data
最后是存放长度为[NALU size]的NALU数据,不包含开头的分隔符00000001。
rtmp协议中并没有H.265,这里讲的H.265封装是在H.264的基础上改进的。
HEVCDecoderConfigurationRecord
SPS
PPS
VPS
1) frame type
高4位表示是否是关键帧,低4位表示编码类型。SPS、PPS、VPS是关键帧用1表示,H.265(HEVC)对应的值是12,所以这个byte是0x1C。
2) fixed
这4个byte的具体含义我也不清楚,但对于H.265 HEVCDecoderConfigurationRecord来说是 0x00 0x00 0x00 0x00
3) configurationVersion
0x01
4) HEVCProfileIndication
SPS的第2个byte,也就是去掉第一个byte的NALU type之后的那个byte。
5) profile_compatibility
SPS的第3个byte。
6) HEVCLevelIndication
SPS的第4个byte。
7) lengthSizeMinusOne
0x03
8) sps number
SPS的序号,是0xE1
9) sps data length
这2个byte表示SPS数据的长度,长度是去掉分隔符00000001之后的长度。高位存在第一个byte,低位存在最后一个byte。如:
packet[i++] = (data_size>>8)&0xff;
packet[i++] = data_size&0xff;
10) sps data
最后是存放SPS数据,不包含开头的分隔符00000001。
11) pps number
PPS的序号,是0x01
12) pps data length
这2个byte表示PPS数据的长度,长度是去掉分隔符00000001之后的长度。高位存在第一个byte,低位存在最后一个byte。
13) pps data
最后是存放PPS数据,不包含开头的分隔符00000001。
14) vps number
VPS的序号我也不知道,我暂时写0x01
15) vps data length
这2个byte表示VPS数据的长度,长度是去掉分隔符00000001之后的长度。高位存在第一个byte,低位存在最后一个byte。
16) vps data
最后是存放VPS数据,不包含开头的分隔符00000001。
1) frame type
如果关键帧就是0x1C,如果非关键帧就是0x2C。高4位表示是否是关键帧,低4位表示编码类型,H.265(HEVC)对应的值是12。
2) fixed
这4个byte的具体含义我也不清楚,我暂时写 0x01 0x00 0x00 0x00
3) NALU size
这4个byte表示NALU数据的长度,长度是去掉分隔符00000001之后的长度。高位存在第一个byte,低位存在最后一个byte。如:
packet[i++] = (data_size>>24)&0xff;
packet[i++] = (data_size>>16)&0xff;
packet[i++] = (data_size>>8)&0xff;
packet[i++] = data_size&0xff;
4) NALU data
最后是存放长度为[NALU size]的NALU数据,不包含开头的分隔符00000001。
个人博客网站:灵动的指针