1. 程式人生 > >rtmp資料封裝三-視訊(H264&H265)

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。