唐文昊 廖斌蘭 唐霓云 莫東海
TS碼流經過IP打包后能被網絡設備轉發和交換,通過光纖、衛星、微波等方式接入各個臺站。信源交換機的監控口靜態綁定了碼流的組播地址,使監控口始終轉發碼流。通過抓包可以觀察到標準網絡幀結構。每個幀長為1358字節,包括MAC頭(14字節)、IP頭(20字節)、UDP頭(8字節)和7個碼流包(每個188字節)共1358字節。一個幀最多封裝七個碼流包,否則會超過以太幀的最大長度上限1518字節而無法傳輸。
如圖1所示,抓包工具Wireshark中顯示的幀結構,有七個以ISO/IEC開頭的行,每行標識一個標準碼流包。PID和CC是碼流包頭部中的兩個重要參數:包ID和連續計數。

圖1 衛星接收機發出的被封裝的TS碼流
TS碼流傳輸使用了IP組播技術,組播地址為IP報文的目的地址,一份碼流能同時被轉發到多個設備(如IP復用器、碼流記錄儀、分析儀、自臺監控服務器等),只需給接收設備添加組播地址加入組播組即可。分析時根據邏輯連接進行過濾,把光纖信源中央八套節目碼流(12.171.30.93:2560->239.171.30.5:4000)分離出來,再將各底層頭部剝除,留下應用層的碼流包。碼流包長度為188字節,包含4字節頭部和184字節載荷。載荷既可以是音視頻編碼數據,也可以是控制信息表PSISI。圖2為光纖信源中央八套節目TS碼流中的“空”碼流包。

圖2 光纖信源中央八套節目TS碼流中的“空”碼流包
TS碼流包中的數據是大尾(big-endian)字節序,數據的低位保存在內存的高地址,與Windows系統相反。“空”碼流包的載荷部分全部是0xff,只有頭部有數據。4字節的頭部包含了8個參數,分別是同步字節、傳輸誤碼指示符、有效荷載單元起始指示符、傳輸優先級、PID、傳輸加擾控制、自適應控制和連續計數器。第一個字節是固定的0x47,‘G’的ASCII碼,標識碼流包起始位置,錯誤或丟失將產生290一級錯誤中的同步字節錯誤或同步丟失錯誤。PID(Packet ID)用中間的13個比特表示,標識此碼流包的類型,即數據載荷解析的方式,標識此包是音、視頻還是信息表。PID為0x1ffff時為“空”包,載荷不需要解析。連續計數用末尾的4個比特標識,同類型的下一個包的計數值會遞增,計數值累計到0xf之后再回到0。組播的傳輸層是UDP協議,沒有保證可靠交付,網絡不良時會使連續計數亂序、丟失,從而產生一級錯誤中的連續計數錯誤。
TS碼流中還存在其他控制信息PSI和SI(業務信息)。PSI定義了4種表(有資料說5種),SI定義了9種表。PSI的作用是從碼流中定位節目的音視頻流,是必備的。SI根據業務功能不同是可選的。PSI中用于定位節目音視頻流的表有兩種:PAT(節目關聯表)和PMT(節目映射表)。定位過程如下。
1.PAT的PID固定為0,可從碼流中直接找出PAT,一個碼流只有一個PAT流;
2.PAT中包含一或多個PMT的PID,可根據PAT找出碼流中所有的PMT,碼流中有多少個節目就有多少個PMT流;
3.PMT中包含節目的音、視頻流的PID,可根據PMT找出碼流中的音視頻流并提取出PES(打包的基本流);
4.由PES解包出ES(基本流)再送入解碼器解碼。
在光纖信源中央八套節目碼流中,每秒傳輸5個PAT包。其數據載荷是一樣的,只有頭部的連續計數在遞增。光纖信源中央八套節目TS碼流PAT包的頭部如圖3所示。包頭以0x47開頭,PID為0,數據載荷作為PAT解析。第三項Payload Unit Start Indicator:1,說明這是PAT的第一個碼流包,如果表很大,會被分到多個碼流包中。

圖3 光纖信源中央八套節目TS碼流PAT包的頭部
如圖4,PSI的第一個碼流包中,頭部之后的一字節(第5個字節)表示指針域(也叫適配域長度),指出到PAT還有多少字節。這里為0,所以PAT從第6個字節開始,再根據PAT第四項表示的長度45字節(從此項之后開始算),PAT到第54個字節結束,只占用一個碼流包,之后用0xff填充。

圖4 光纖信源中央八套節目TS碼流PAT包
PAT前8字節的結構固定,第4、5字節表示碼流ID,占16bit,理論上一個連接可以傳輸65535個碼流。從第9字節開始,是包含九個元素的數組,每個元素4字節,共36字節。每個元素包含2字節的節目號和2字節的PMT的PID,PID用低13位標識,但第一個元素是例外,它的節目號為0,PID是NIT(網絡信息表)的PID(固定的0x10)。之后的八個元素對應了中央八套節目。以第二個元素為例,節目號為0x12d,它的PMT的PID是0x101,如圖5所示。

圖5 節目號0x12d的PMT包
每秒鐘有3、4個同節目的PMT包傳輸。PMT表從第6個字節開始,前12個字節的結構固定。第11、12字節的低12位表示節目的描述信息長度,這里為5,此后緊跟5字節的描述信息。信息類型由第1字節的tag決定,這里是最大傳輸比特率。描述信息之后緊接著多個流信息,流信息前5個字節的結構是固定的。此PMT中總共包含兩個流信息,第1字節表示流的類型,值分別為0x42和0x6,表示AVS視頻和AC3音頻。第2、3字節的低13位表示流的PID,值分別為0x200和0x28a。第4、5字節的低12位表示流描述信息總長度。因為描述信息本身含有長度,所以可以判斷出每個描述信息的位置。第一個流信息包含2個描述信息,第二個流信息則包含4個描述信息。描述信息包括流ID、最大比特率、注冊信息、網絡層信息等。至此,節目的AVS視頻流PID=0x200、AC3音頻流PID=0x28a已找出。
PCR是節目參考時鐘,由編碼器生成,供解碼器解碼時進行同步。PMT開頭第9、10字節低13位標識PCR存在的PID,在圖5中是0x200。也就是說,這里的PCR只穿插在視頻流中,音頻流中沒有(PCR可以插入音頻流,也可以使用自己獨立的PID)。帶有PCR的視頻流包每秒有5個。PCR存在于視頻流中的適配域,頭部之后的第5字節指針域(適配域長度)在PAT、PMT中為0,而帶有PCR的視頻流包中是7。7字節中的第1字節是8個標志位,PCR標志置1。后6字節是參考時鐘,參考時鐘會有規律地遞增。實際上PCR只用了42位,包括33位基礎位和9位擴展位。擴展位是基礎位的低位,表達更精細的數值,最大值是300而不是512,超過300歸零并給基礎位加1。除了PCR,PES層中還有兩個同步信息DTS和PTS,同步機制比較復雜,這里不詳細展開。
SDT(服務描述表)中包含了節目的類型、名稱等信息,它的PID是固定的0x11。SDT表起始的11個字節的頭部也是固定的。在中央八套節目TS碼流的SDT中,頭部之后跟著的是8個服務(節目)描述信息。第一個描述信息描述了節目號為0x12d的節目。在描述信息的服務名字段中,可以看到節目名稱為CCTV-1。
ISO13818-1碼流標準已經使用了十幾年,它詳細地定義了音視頻流及其控制信息,是一套非常成熟的傳輸標準。標準中定義的TS流不但能單獨傳輸,也容易被TCP/IP等網絡承載。碼流的使用者只要了解重要的部分,借助碼流分析儀或碼流分析軟件,就能迅速地判斷碼流信號質量的高低,分析碼流質量變差的原因,找到問題根源,對碼流進行恢復。