原文:https://www.jianshu.com/p/23d9ab930b49
作者:Li_Xianglin
來源:簡書
H.264 SEI
http://www.itu.int/rec/T-REC-H.264
NAL header
起始碼(暗紅底色)"0x00000001"分割出來的比特流即是NAL unit,起始碼緊跟的第一個字節(墨綠底色)是NAL header。上圖“NAL header”一共出現了四個數值:
-
- "0x06",此時NRI爲"00B",NAL unit type爲SEI類型。
- “0x67”,此時NRI爲“11B”,NAL unit type爲SPS類型。
- “0x68”,此時NRI爲“11B”,NAL unit type爲PPS類型。
- “0x65”,此時NRI爲“11B”,NAL unit type爲IDR圖像。
SEI payload type
"0x06"後一個字節爲“0x05”(淡黃底色)是SEI payload type,即表徵SEI payload分析遵循user_data_unregistered()語法。
在國標中。sei payload type爲5,爲自定義消息:如圖
SEI payload size
“0x05”後一個字節爲“0x2F”(淡藍底色)是SEI payload size,此時整個payload是47個字節。
-
SEI payload uuid
"0x2F"隨後的16個字節即爲uuid,此時uuid爲:
dc45e9bde6d948b7962cd820d923eeef
-
SEI payload content
由於payload size是47個字節,除去16字節的uuid,剩下31個字節的content。由於content是字符串,所以有結束符"0x00",有效的30個字符內容是
Zencoder Video Encoding System
-
rbsp trailing bits
47個payload字節後的"0x80"(灰底色)即是rbsp trailing bits,在user_data_unregistered()裏面都是按字節寫入的,所以此時的NAL unit結尾寫入的字節一定是0x80。
H.265
http://www.itu.int/rec/T-REC-H.265
-
H265一個圖像序列的組成:VPS+SPS+PPS+SEI+一個I幀+若干個P幀。VPS、SPS、PPS、SEI、一個I幀、一個P幀都可以稱爲一個NALU。
-
H265的NALU結構:開始碼+NALU頭+NALU數據
- 開始碼大小爲四個字節,是一個固定值00 00 00 01(十六進制),標識一個NALU的開始。
- NALU頭大小爲兩個字節,共16位,第1位值爲0,第2-7位爲NALU的type位(共6位),標識當前NALU的類型,第8-15位值爲0,第16位值爲1。
- NALU數據爲編碼器編出來的圖像信息或圖像數據。
-
六種類型的NALU
- VPS(視頻參數集):NALU頭值爲0x40 01(十六進制),NALU頭type位值爲32(十進制)。
- SPS(序列參數集):NALU頭值爲0x42 01(十六進制),NALU頭type位值爲33(十進制)。
- PPS(圖像參數集):NALU頭值爲0x44 01(十六進制),NALU頭type位值爲34(十進制)。
- SEI(補充增強信息):NALU頭值爲0x4e 01(十六進制),NALU頭type位值爲39(十進制)。
- I幀:NALU頭值爲0x26 01(十六進制),NALU頭type位值爲19(十進制)。
- P幀:NALU頭值爲0x02 01(十六進制),NALU頭type位值爲1(十進制)。
-
H265的NALU打包成RTP包的模式(下面是用到的兩種模式)
- 一個NALU打包成一個RTP包,只需要在一個12字節的RTP包頭後添加去掉開始碼的NALU即可(這種模式在一個NALU的大小小於MTU時使用)。
- 一個NALU打包成幾個RTP包(FUs模式),在12個字節的RTP頭後面有兩個字節的PayloadHdr和一個字節的FU header。PayloadHdr的值等於NALU頭的type位改爲49(十進制)後的值,FU header第1位標記RTP包是否爲NALU的第一片,第2位標記RTP包是否爲NALU的最後一片。後6位是NALU頭的type位。