二. PS封包
PS 是 GB28181 規定的標准封包格式(也是存儲格式),在講 PS 之前,先介紹幾種相關的 數據格式概念:
1)ES
基本流 (Elementary Streams)是直接從編碼器出來的數據流,也成為凈荷數據。ES是編碼后的視頻流(比如H.264),音頻數據流(如AAC),和其他編碼數據流的統稱。
ES是只包含一種內容的數據流(比如純粹的視頻或音頻),每個ES都由若干個存取單元(AU)組成,每個視頻AU或音頻AU都是由頭部和編碼數據兩部分組成,1個AU相當於編碼的1幅視頻圖像或1個音頻幀,也可以說,每個AU實際上是編碼數據流的顯示單元,即相當於解碼的1幅視頻圖像或1個音頻幀的取樣。
2)PES
打包的ES(Packetized Elementary Streams),是用來傳遞ES的一種數據結構。是ES流經過 PES打包形成的數據流,即將ES流分組、打包、加入包頭信息,是對ES流的第一次打包。
PTS - 顯示時間戳(Presentation Time Stamp),用來表示顯示單元出現在系統目標解碼器的時間。
DTS - 解碼時間戳(Decoding Time Stamp),用來表示將存取單元全部字節從解碼緩存取走的時間。
PTS/DTS 這兩個參數是解決音視頻同步顯示,防止解碼器輸入緩存上溢或下溢的關鍵。每一個 I幀 | P幀 | B幀 的包頭都有一個PTS和DTS。
3)PS
一個PS包 由若干個 PES 包組成,PS包頭包含了同步信息與時鍾恢復信息。
一個PS包 最多可包含具有同一時鍾基准的16個視頻PES包和32個音頻PES包。
PS包是針對 ES凈荷數據 的第二次封裝。
PS 包中的流類型(stream type)的取值如下:
MPEG-4
視頻流
H.264
視頻流
SVAC
視頻流
G.711
音頻流
G.722.1
音頻流
G.723.1
音頻流
G.729
音頻流
SVAC
音頻流
0x10
0x1B
0x80
0x90
0x92
0x93
0x99
0x9B
來看一下 PS包頭:

注意:這里面有一個 System Header,位於 PS包頭之后,當且僅當第一個數據包時 該Header存在。
在文件開頭封包格式為:PS頭 + System 頭 + PES頭 + H264流
非文件開頭格式: PS頭 + PES頭 + H264流
