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。