原文轉自:http://blog.csdn.net/zxh821112/article/details/17587215,有增改。
一 從TS流開始
數字電視機頂盒接收到的是一段段的碼流,我們稱之爲TS(Transport Stream,傳輸流),每個TS流都攜帶一些信息,如Video、Audio以及我們需要學習的PAT、PMT等信息。因此,我們首先需要了解TS流是什麼,以及TS流是怎樣形成、有着怎樣的結構。
(一) TS流、PS流、PES流和ES流都是什麼?
ES流(Elementary Stream):基本碼流,不分段的音頻、視頻或其他信息的連續碼流。
PES流:把基本流ES分割成段,並加上相應頭文件打包成形的打包基本碼流。
PS流(Program Stream):節目流,將具有共同時間基準的一個或多個PES組合(複合)而成的單一數據流(用於播放或編輯系統,如m2p)。
TS流(Transport Stream):傳輸流,將具有共同時間基準或獨立時間基準的一個或多個PES組合(複合)而成的單一數據流(用於數據傳輸)。
*NOTE:TS流和PS流的區別:TS流的包結構是長度是固定的;PS流的包結構是可變長度的。這導致了TS流的抵抗傳輸誤碼的能力強於PS流(TS碼流由於採用了固定長度的包結構,當傳輸誤碼破壞了某一TS包的同步信息時,接收機可在固定的位置檢測它後面包中的同步信息,從而恢復同步,避免了信息丟失。而PS包由於長度是變化的,一旦某一 PS包的同步信息丟失,接收機無法確定下一包的同步位置,就會造成失步,導致嚴重的信息丟失。因此,在信道環境較爲惡劣,傳輸誤碼較高時,一般採用TS碼流;而在信道環境較好,傳輸誤碼較低時,一般採用PS碼流。)
由於TS碼流具有較強的抵抗傳輸誤碼的能力,因此目前在傳輸媒體中進行傳輸的MPEG-2碼流基本上都採用了TS碼流的包格。
(二) TS流是如何產生的?
從上圖可以看出,視頻ES和音頻ES通過打包器和共同或獨立的系統時間基準形成一個個PES,通過TS複用器複用形成的傳輸流。注意這裏的TS流是位流格式(分析Packet的時候會解釋),也即是說TS流是可以按位讀取的。
(三) TS流的格式是怎樣的?
TS流是基於Packet的位流格式,TS流涉及到的單位類型有:
1. 包(Packet)
每個包是188個字節(或204個字節,在188個字節後加上了16字節的CRC校驗數據,其他格式一樣)。
2. 段(Section)
多個包組成一個段,每個段不超過1021個字節。
根據標準,payload_unit_start_indicator爲1的包是第一個包,後續的包:1. payload_unit_start_indicator均爲0,2. 除去包頭就是與前一個包末尾相銜接的數據。我們從第一個包的section_length判斷是否有多個包存在,從第一個包的last_section_number判斷是否有多個段存在。
整個TS流組成形式如下:
PID是TS流中唯一識別標誌,Packet Data是什麼內容就是由PID決定的。如果一個TS流中的一個Packet的Packet Header中的PID是0x0000,那麼這個Packet的Packet Data就是DVB的PAT表而非其他類型數據(如Video、Audio或其他業務信息)。下表給出了一些表的PID值,這些值是固定的,不允許用於更改。
根目錄 PSI/SI(Program Specific Information/Service Information, 節目特定信息/待補充) | PID值 |
- PAT(Program Association Table, 數字電視節目關聯表) | 0x0000 |
- CAT (Conditional Access Table, 條件接收表) | 0x0001 |
- PMT (Program Map Table, 節目映射表 ) | 由解PAT的結果中得出 |
- NIT(Network Information Table, 網絡信息表) | 由解PAT的結果中得出 |
- BAT | 待補充 |
- TSDT(Service Description Table) | 0x0002 |
- EIT, ST | 0x0012 |
- RST, ST | 0x0013 |
- TDT, TOT, ST | 0x0014 |
下面以一個TS流的其中一個Packet中的Packet Header爲例進行說明:
sync_byte=01000111, 就是0x47,這是DVB TS規定的同步字節,固定是0x47.
transport_error_indicator=0, 表示當前包沒有發生傳輸錯誤.
payload_unit_start_indicator=0, 含義參考ISO13818-1標準文檔
transport_priority=0, 表示當前包是低優先級.
PID=00111 11100101即0x07e5, Video PID
transport_scrambling_control=00, 表示節目沒有加密
adaptation_field_control=01 即0x01,具體含義請參考ISO13818-1
continuity_counte=0010 即0x02,表示當前傳送的相同類型的包是第3個
TS流的基本內容就是這些了。
回顧一下,TS流是一種位流(當然就是數字的),它是由ES流分割成PES後複用而成的;它經過網絡傳輸被機頂盒接收到;數字電視機頂盒接收到TS流後將解析TS流。
TS流是由一個個Packet(包)構成的,每個包都是由Packet Header(包頭)和Packet Data(包數據)組成的。其中Packet Header指示了該Packet是什麼屬性的,並給出了該Packet Data的數據的唯一網絡標識符PID。