針對H264 作以下PS封裝:每一個IDR NALU 前通常都會包含SPS、PPS等NALU,所以將SPS、PPS、IDR 的NALU封裝爲一個PS 包,包括ps 頭,而後加上PSsystem header,PS systemmap,PES header+h264 raw data。因此一個IDR NALU PS 包由外到內順序是:PSheader|PS system header | PS system Map | PES header | h264 raw data。對於其它非關鍵幀的PS 包,就簡單多了,直接加上PS頭和PES頭就能夠了。順序爲:PS header | PES header | h264rawdata。以上是對只有視頻video 的狀況,若是要把音頻Audio也打包進PS封裝,也能夠。當有音頻數據時,將數據加上PES header 放到視頻PES 後就能夠了。順序以下:PS 包=PS頭|PES(video)|PES(audio),再用RTP 封裝發送就能夠了。ide
GB28181 對RTP 傳輸的數據負載類型有規定(參考GB28181 附錄B),負載類型中96-127編碼
RFC2250 建議96 表示PS封裝,建議97 爲MPEG-4,建議98爲H264spa
即咱們接收到的RTP 包首先須要判斷負載類型,若負載類型爲96,則採用PS解複用,將音視頻分開解碼。若負載類型爲98,直接按照H264 的解碼類型解碼。code
注:此方法不必定準確,取決於打包格式是否標準orm
PS 包中的流類型(stream type)的取值以下:視頻
1) MPEG-4視頻流: 0x10;it
2) H.264視頻流: 0x1B;io
3) SVAC視頻流: 0x80;class
4) G.711音頻流: 0x90;stream
5) G.722.1音頻流: 0x92;
6) G.723.1音頻流: 0x93;
7) G.729音頻流: 0x99;
8) SVAC音頻流: 0x9B。
前12位是RTP Header,這裏再也不贅述;
PS包頭
[0..3] Pack startcode:包起始碼字段,值爲0x000001BA的位串,用來標誌一個包的開始。
接下來的9位包括了SCR,SCRE,MUXRate,
[4..12] Systemclock reference base,system clockreference extenstion:系統時鐘參考字段。
最後一位reserved是保留位(0xf8),以及是否有填充字節
[13] Packstuffing length :包填充長度字段,3位整數,規定該字段後填充字節的個數
系統標題
接下來的00 00 01 bb是系統標題起始碼;
接下來的00 0c說明了系統標題的長度(不包括起始碼和長度字節自己);
接下來的12個字節是系統標題的具體內容,這裏不作解析;
節目映射流
繼續看到00 00 01 bc,這是節目映射流起始碼;
緊接着的00 1e一樣表明長度;
跳過e1 ff,基本沒用;
接下來是00 18,表明基本流長度,說明了後面還有24個字節;
接下來的1b,意思是H264編碼格式;
下一個字節e0,意思是視頻流;
接下里00 0c,一樣表明接下的長度12個字節;
跳過這12個字節,看到90,這是G.711音頻格式;
下一個字節是c0,表明音頻流;
接下來的00 00一樣表明長度,這裏是0;
接下來4個字節是CRC,循環冗餘校驗。
PES分組頭部
1) Packetstart code prefix:值爲0x000001的位串,它和後面的stream id 構成了標識分組開始的分組起始碼,用來標誌一個包的開始。
2) Streamid:在節目流中,它規定了基本流的號碼和類型。0x(C0~DF)指音頻,0x(E0~EF)爲視頻
3) PESpacket length:16 位字段,指出了PES 分組中跟在該字段後的字節數目。值爲0 表示PES分組長度要麼沒有規定要麼沒有限制。這種狀況只容許出如今有效負載包含來源於傳輸流分組中某個視頻基本流的字節的PES 分組中。
4) PTS_DTS:2 位字段。當值爲'10'時,PTS 字段應出如今PES分組標題中;當值爲'11'時,PTS 字段和DTS字段都應出如今PES 分組標題中;當值爲'00'時,PTS字段和DTS 字段都不出如今PES分組標題中。值'01'是不容許的。
5) ESCR:1位。置'1'時表示ESCR 基礎和擴展字段出如今PES 分組標題中;值爲'0'表示沒有ESCR 字段。
6) ESrate:1 位。置'1'時表示ES rate 字段出如今PES分組標題中;值爲'0'表示沒有ES rate 字段。
7) DSMtrickmode:1 位。置'1'時表示有8位特技方式字段;值爲'0'表示沒有該字段。
8) Additionalinfo:1 位。附加版權信息標誌字段。置'1'時表示有附加拷貝信息字段;值爲'0'表示沒有該字段。
9) CRC:1 位。置'1'時表示CRC 字段出如今PES分組標題中;值爲'0'表示沒有該字段。
10) Extensionflag:1 位標誌。置'1'時表示PES 分組標題中有擴展字段;值爲'0'表示沒有該字段。
PES header data length: 8 位。PES標題數據長度字段。指出包含在PES 分組標題中的可選字段和任何填充字節所佔用的總字節數。該字段以前的字節指出了有無可選字段。