什麼是TS?
TS(Transport Stream,傳輸流),一種常見的影片封裝格式,是基於MPEG-2的封裝格式(所以也叫MPEG-TS),字尾為.ts
TS的分層
TS檔案分為三層,如下所示(可以倒序更好理解)
-
TS層(Transport Stream):在PES層基礎上加入了資料流識別資訊和傳輸資訊
-
PES層(Packet Elemental Stream):在ES層基礎上加入時間戳(PTS/DTS)等資訊。
-
ES層(Elementary Stream):壓縮編碼後的音影片資料。
TS層
ts包大小固定為188位元組,ts層分為三個部分:ts header、adaption field、payload。
-
ts header固定4個位元組
-
adaption field可能存在也可能不存在,主要作用是給不足188位元組的資料做填充。
-
payload是PES資料,或者PAT,PMT等。
-
ts Header+adaption field格式如下:
pid決定了負載內容的型別,主要包括:PAT表,PMT表,影片流,音訊流。常用的PID值:
調整欄位
PAT表結構(指明PMT表的PID值)
typedef struct TS_PAT{
unsigned table_id :8//固定為0x00,表示該表是PAT
unsigned section_syntax_indicator:1//段語法標誌,固定為1
unsigned zero :1//固定為0
unsigned reserved_1 :2//第一個保留位
unsigned section_length :12//表示這個位元組之後有用的位元組數,包括CR0
unsigned transport_stream_id :16//傳輸流的ID,區別於一個網路中其他多路
unsigned reserved_2 :2//第二個保留位
unsigned version_number :5//表示PAT的版本號
unsigned current_next_indicator :1//表示傳送的PAT是當前有效還是下一個有效
unsigned section_number :8//如果PAT分段傳輸,那麼此值每次遞增1
unsigned last_section_number :8//最後一個分段的號碼
for(int i = 0;i < N; i++)
{
unsigned Program_number :16//節目號
unsigned Reversed_3 :3//保留位
if(Program_number == 0)
{
Network_id :13//網路資訊表NIT的PID
}
else
Program_MAP_PID :13//節目對映表的PID,每個 節目都有一個
}
unsigned CRC_32 :32//CRC32校驗碼
}TS_PAT
PMT指明音影片流的PID值
補充說明
- 打包ts流時PAT和PMT表是沒有調整欄位的,不夠的長度直接補0xff即可
- 影片流和音訊流都需要加adaptation field,通常加在一個幀的第一個ts包和最後一個ts包裡,中間的ts包不加。
PES層
- PES(Packetized Elementary Stream,打包的ES),在ES層的基礎上加入了時間戳(PTS/TDS)等資訊。
- ES資料包比較大,加入PES頭時需將ES進行分割,只在第一個分割的ES上加PES頭,如下圖所示
- PES packet length一指示PES包中跟隨該欄位最後位元組的位元組數。0值指示PES包長度 既末指示也未限定並且僅在這樣的PES包中才被允許,該PES包的有效載荷由來自傳輸流包中所包含的影片基本流的位元組組成。
- PES結構如下: