rtmp数据封装三-视频(H264&H265)

前面文章《rtmp数据封装一-块(chunk)》中讲到rtmp传输媒体数据时是把一整帧数据拆分成chunk的形式发送的。其实一帧媒体数据在拆分成chunk之前还需要进行必要的头部信息封装,本文介绍rtmp协议中H.264/H.265视频数据的头部信息封装。

H.264 rtmp头部信息封装

SPS PPS

AVCDecoderConfigurationRecord

  • frame type (1 byte)
  • fixed 0x00 0x00 0x00 0x00 (4 byte)
  • configurationVersion (1 byte)
  • AVCProfileIndication (1 byte)
  • profile_compatibility (1 byte)
  • AVCLevelIndication (1 byte)
  • lengthSizeMinusOne (1 byte)

SPS

  • sps number (1 byte)
  • sps data length (2 byte)
  • sps data

PPS

  • pps number (1 byte)
  • pps data length (2 byte)
  • pps data

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。

其他NALU

  • frame type (1 byte)
  • fixed 0x01 0x00 0x00 0x00 (4 byte)
  • NALU size (4 byte)
  • NALU data

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。

H.265 rtmp头部信息封装

rtmp协议中并没有H.265,这里讲的H.265封装是在H.264的基础上改进的。

SPS PPS VPS

HEVCDecoderConfigurationRecord

  • frame type (1 byte)
  • fixed 0x00 0x00 0x00 0x00 (4 byte)
  • configurationVersion (1 byte)
  • HEVCProfileIndication (1 byte)
  • profile_compatibility (1 byte)
  • HEVCLevelIndication (1 byte)
  • lengthSizeMinusOne (1 byte)

SPS

  • sps number (1 byte)
  • sps data length (2 byte)
  • sps data

PPS

  • pps number (1 byte)
  • pps data length (2 byte)
  • pps data

VPS

  • vps number (1 byte)
  • vps data length (2 byte)
  • vps data

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。

其他NALU

  • frame type (1 byte)
  • fixed 0x01 0x00 0x00 0x00 (4 byte)
  • NALU size (4 byte)
  • NALU data

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。