影片封裝格式篇(TS)

不会笑的孩子發表於2024-04-21

什麼是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結構如下:

相關文章