TS流基本概念


  在MPEG-2標准中,有兩種不同類型的碼流輸出到信道:一種是節目碼流(Program Stream, PS),適用於沒有誤差產生的媒體存儲,如DVD等存儲介質;另一種是傳送流(Transport stream, TS),適用於有信道噪聲產生的傳輸,目前TS流廣泛應用於廣播電視中,如機頂盒等。

一、基本概念

  ES流(Elementary Stream):基本碼流,可以理解為編碼后的裸數據;

  PES流:分割打包的ES流,加入了PES頭。PES包是可變長度的,PES頭中最重要的部分是顯示時間標記(Presentation Time Stamp, PTS)和解碼時間標記(Decode Time Stamp, DTS),有了PTS和DTS,再加上節目時鍾參考PCR,解碼器就能從TS流中重建視頻流;

  TS流(Transport Stream):傳輸流。固定包長度為188B,TS流固定包長度的好處是便於找到幀的起始位置,易於從包丟失中恢復,適合於有誤碼的環境。

二、TS流格式

2.1 TS流格式

 

  TS header是4byte,分別是1byte的同步字節,1bit傳輸數據包差錯指示, 1bit凈荷單元起始指示, 1bit傳送優先權, 13bit包標識符PID, 2bit傳送加擾控制,2bit調整字段控制和4bit連續計數器。 

        同步字節(sync byte): 1B,其值固定為0x47,該字段是MPEG-2 TS傳送包標識符;

  傳輸誤差指示符(transport error indicator): 1bit,其值為1時,表示在相關的傳送包中至少有一個不可糾正的錯誤位,只有在錯誤糾正之后,該位才能被重新置0;

  有效載荷單元起始符(payload unit start indicator: 1bit, 當TS包帶有PES包數據時,置為1,表示TS包的有效凈荷以PES包的第一個字節開始;置為0,表示該TS包的開始不是PES包;當TS包帶有PSI數據時,置為1,表示TS包帶有PSI部分的第一個字節,即第一個字節帶有指針pointer_field;置為0,表示TS包不帶有一個PSI部分的第一個字節,即有效凈荷中沒有指針pointer_field。空包時,該位置為0;

  傳輸優先級(transport_prority): 1bit, 置為1,表示相關的包比其他具有相同PID,但是此字段置0的包有更高的優先級;

  PID: 13bit, 表示傳送包的有效凈荷中的數據的類型。具體如下表:

PID取值 

PID值使用描述

0x0000

節目關聯表(program association table, PAT)

0x0001

條件訪問表(conditional access table, CAT)

0x0002

傳送流描述表(transport stream description table, TSDT)

0x0003~0x000F

保留

0x0010~0x1FFE

可以分配為network PID, Program map PID,  elementary PID, 或其它

0x1FFF

空包(8191)

  PID信息非常關鍵,它直接表征本次TS包的用途。比較重要的是PAT和PMT,之后會有說明;

  傳輸加擾控制(transport scrambling control): 2bit,該字段用來指示傳送流包有效凈荷的加擾方式;

  自適應字段控制(adaption field control): 2bit,表示傳送流包首部是否跟隨有調整字段和/或有效凈荷。具體如下表:

調整字段值

描述

00

保留

01

沒有調整字段,僅含有184B長度的有效凈荷

10

沒有有效凈荷,僅含有183B長度的調整字段

11

0~182B的調整字段后為有效凈荷

  連續計數器(continuity counter): 4bit,隨着具有相同PID TS包的增加而增加,達到最大則恢復為0.

2.2 TS流調整字段

  在MPEG-2 TS中,為了傳送打包后長度不足188B的不完整TS,或者為了在系統層插入節目時鍾參考(program clock reference, PCR),需要在TS包中插入可邊長字節的調整字段。調整字段其中一個重要作用是解決編解碼器的音視頻同步問題。一般在視頻幀中的TS包的調整字段中,每隔一定傳輸時間,傳送系統時鍾27MHz的一個抽樣值給接收機,作為解碼器解碼時的時鍾參考信息PCR。PCR通常每隔100ms至少被傳輸一次。PCR的數值所表示的是解碼器在讀完這個抽樣值的最后那個字節時,解碼器本地時鍾所應處的狀態。通常情況下,PCR不直接改變解碼器的本地時鍾,而是作為參考基准來調整本地時鍾,使之與PCR趨於一致。

2.3 PES包格式

  PES包的第5個字節標識一整個PES包的長度,一般來說,一個PES包包含一幀圖像,獲取了PES的包長度Len,當接收到Len個字節后,將接收到的字節組成一個block,放入FIFO中,等待解碼線程解碼。DTS和PTS也在PES包中傳送。

三、節目專用信息(Program Special Information, PSI)

  前邊提到了PAT和PMT,它們都是PSI之一。MPEG-2 TS傳送TS包,這些包攜帶兩類信息:已壓縮的音視頻(PES)和與之相關的符號化表(PSI),由傳送包的PID來識別。

3.1 節目關聯表(Program Association Table, PAT)

  PAT定義了TS中的所有節目,其值為0x0000,是PSI信息的根結點。其格式如下圖。

  上圖中,程序在解析到N環部分的時候,會讀取並保存節目列表及其PID。PAT信息在TS流中隔一段時間就會傳送,接收機在接收時,以接收PAT表為起始。PAT表列出了TS流中所有的節目列表,以及節目對應的PID值,這個PID值表征的是該節目對應的PMT表的PID值(PMT表稍后說明)。PAT表與PMT的關系如下圖。

3.2 節目映射表(Program Map Table, PMT)

  PMT提供一路節目包含的所有原始碼流的PID映射表,其格式如下圖。

 

  程序在讀取N環的時候會讀取該節目所有的碼流列表及其PID,解析的時候可以根據PID來分離。這N環描述符包括的信息如下圖所示。節目時鍾參考PCR的PID和視頻的PID是相等的。由PAT得出所有的節目列表,選定收看的節目后,篩選出等於該節目PID的TS包,就可以得到該節目的所有碼流的PID映射表,這樣接收機就可以只接收PID等於該節目的碼流的TS包即可收看該節目。

 

 四、音視頻同步

  前邊介紹的是TS流用的最多的格式,以及PAT和PMT等,現在說一下TS流在解碼時是如何做到音視頻同步的。

4.1 時間標記與PTS和DTS

  時間標記本身是以90KHz單位表達的33bit二進制值,是MPEG-2系統層提供的一種機制,以便確保在解碼器上相關的原始流之間正確的同步。時間標記有兩類:一個是解碼時間標記(DTS,Decode Time Stamp), 它規定了在某時間應該從解碼器緩沖區中刪除一個訪問單元並解碼,但是不進行播放;另一個是顯示時間標記(PTS,Present Time Stamp),它規定了在某時刻,解碼的圖像最后從臨時緩存中釋放出來並進行播放。這樣PTS將總是比與之相關的DTS大。

4.2 音視頻同步

  在MPEG-2編碼器中有一個系統時鍾,該系統時鍾用來生成一個共同的時序以便音視頻能夠正常的解碼與播放。因為編碼器有共同的系統時鍾STC,解碼器中的時鍾可以根據PCR重新恢復。所以端到端的同步分為以下幾個步驟:

(1) 解碼器接收到PCR時,恢復系統時鍾;

(2) 解碼器接收到PTS/DTS時,存入對應的堆棧;

(3) 每幅圖像解碼前,用其對應的DTS與系統時鍾STC進行比較,當兩者相等時,就開始解碼;

(4) 每幅圖像播放前,用其對應的PTS與系統時鍾STC進行比較,當兩者相等時,就開始播放。

  實際應用時,解碼器一般都有自主的系統時鍾頻率,不能直接拿編碼器的PCR設置為解碼器的系統時鍾STC,而是利用接收到的PCR值,通過鎖相環PLL校正解碼器的系統時鍾STC。

  VLC調試接收TS流的代碼分析見鏈接:vlc源碼分析(四) 調用libts接收TS流,對理解上述過程非常有幫助。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM