TS基本概念和資料結構(轉
)ES- Elementary Streams (原始流),對影片、音訊訊號及其他資料進行編碼壓縮後的資料流稱為原始流。原始流包括訪問單元,比如影片原始流的訪問單元就是一副影像的編碼資料。
(2) PES- Packetized Elementary Streams (分組的原始流),原始流形成的分組稱為PES分組,是用來傳遞原始流的一種資料結構
(3)節目是節目元素的集合。節目元素可能是原始流,這些原始流有共同的時間基點,用來做同步顯示。
(4)傳輸流和節目流TS-Transport Stream 翻譯為“傳輸流”PS-Program Stream 翻譯為“節目流”PS用來傳輸和儲存一道節目的編碼資料或其他資料。PS的組成單位是PES分組。TS用來傳輸和儲存多道節目的編碼資料或其他資料,TS的組成單位是節目。PS適用於不容易發生錯誤的環境,以及涉及到軟體處理的應用,典型應用如DVD光碟的檔案儲存TS適用於容易發生錯誤的環境,典型應用就是數字電視訊號的傳輸。TS和PS是可以互相轉換的,比如從TS中抽取一道節目的內容併產生有效的PS是可能。
(5)傳輸流分組和PES分組原始流分成很多PES分組,保持序列順序,一個PES分組只包含一個原始流的編碼資料。PES分組長度很大,最大可為64K位元組。PES分組分為“分組首部(header)”和“有效負載(payload)”。“有效負載”指跟隨在首部位元組之後的位元組。首部的前4個位元組構成分組的起始碼,標識了該分組所屬原始流的型別和ID號。TS分組也就是傳輸流資料形成的資料包。每個TS分組長度為188位元組,包括“分組首部”和“有效負載,前4個位元組是分組首部,包含了這個分組的一些資訊。有些情況下需要更多的資訊時,需在後面新增“調整欄位(adaption field)”。兩者之間的關係:PES分組是插入到TS分組中的,每個PES分組首部的第一位元組就是TS分組有效負載的第一位元組。一個PID值的TS分組只帶有來自一個原始流的資料。
(6)PSI 全稱Program Specific Information,意為節目專用資訊。傳輸流中是多路節目複用的,那麼,怎麼知道這些節目在傳輸流中的位置,區分屬於不同節目呢?所以就還需要一些附加資訊,這就是PSI。PSI也是插入到TS分組中的,它們的PID是特定值。MPEG-2中規定了4個PSI,包括PAT(節目關聯表),CAT(條件訪問表),PMT(節目對映表),NIT(網路資訊表),這些PSI包含了進行多路解調和顯示節目的必要的和足夠的資訊。應用中可能包括更多的資訊,比如DVB-T中定義了SDT(服務描述表),EIT(環境資訊表),BAT(節目組相關表),TDT(時間日期表)等,統稱為DVB-SI(服務資訊)。 PSI的PID是特定的,含PSI的資料包必須週期性的出現在傳輸流中。
PMT (Program Map Table )節目對映表PMT所在分組的PID由PAT指定,所以要先解出PAT,再解PMT。PMT中包含了屬於同一節目的影片、音訊和資料原始流的PID。找到了PMT,解多路複用器就可找到一道節目對應的每個原始流的PID,再根據原始流PID,去獲取原始流。
PAT (Program Association Table )節目關聯表PAT所在分組的PID=0 PAT中列出了傳輸流中存在的節目流PAT指定了傳輸流中每個節目對應PMT所在分組的PIDPAT的第一條資料指定了NIT所在分組的PID ,其他資料指定了PMT所在分組的PID。
CAT (Conditional Access Table )條件訪問表CAT所在分組的PID=1CAT中列出了條件控制資訊(ECM)和條件管理資訊(EMM)所在分組的PID。CAT用於節目的加密和解密 NIT( Network Information Table)網路資訊表NIT所在分組的PID由PAT指定NIT提供一組傳輸流的相關資訊,以及於網路自身特性相關的資訊,比如網路名稱,傳輸引數(如頻率,調製方式等)。NIT一般是解碼器內部使用的資料,當然也可以做為EPG的一個顯示資料提供給使用者做為參考。幾種PSI之間的關係,如下圖所示:首先PAT中指定了傳輸流中所存在的節目,及每個節目對應的PMT的PID號。 比如Program 1對應的PMT 的PID=22,然後找到PID=22的TS分組,解出PMT,得到這個節目中包含的原始流的PID,再根據原始流的PID去找相應的TS分組,獲取原始流的資料,然後就可以送入解碼器解碼了。
資料結構(1)TS分組前面提到,TS分組由188個位元組構成,其結構如下:
transport_packet(){
sync_byte // 8
transport_error_indicator //1
payload_unit_start_indicator //1
transport_priority // 1 PID //13
transport_scrambling_control // 2
adaptation_field_control //2
continuity_counter //4
if(adaptation_field_control=='10' || adaptation_field_control=='11'){
adaptation_field()
}
if(adaptation_field_control=='01' || adaptation_field_control=='11') {
for (i=0;i
}
}
}
前面32bit的資料即TS分組首部,它指出了這個分組的屬性。
sync_byte 同步位元組,固定為0x47 ,表示後面的是一個TS分組,當然,後面包中的資料是不會出現0x47的
transport_error_indicator 傳輸錯誤標誌位,一般傳輸錯誤的話就不會處理這個包了
payload_unit_start_indicator 這個位功能有點複雜,字面意思是有效負載的開始標誌,根據後面有效負載的內容不同功能也不同,後面用到的時候再說。
transport_priority 傳輸優先順序位,1表示高優先順序,傳輸機制可能用到,解碼好像用不著。
PID 這個比較重要,指出了這個包的有效負載資料的型別,告訴我們這個包傳輸的是什麼內容。前面已經敘述過。
transport_scrambling_control 加密標誌位,表示TS分組有效負載的加密模式。TS分組首部(也就是前面這32bit)是不應被加密的,00表示未加密。
adaption_field_control 翻譯為“調整欄位控制”,表示TS分組首部後面是否跟隨有調整欄位和有效負載。01僅含有效負載,10僅含調整欄位,11含有調整欄位和有效負載。為00的話解碼器不進行處理。空分組沒有調整欄位
continuity_counter 一個4bit的計數器,範圍0-15,具有相同的PID的TS分組傳輸時每次加1,到15後清0。不過,有些情況下是不計數的。如下:(1)TS分組無有效負載(2)複製的TS分組和原分組這個值一樣(3)後面講到的一個標誌discontinuity_indicator為1時
adaptation_field() 調整欄位的處理
data_byte 有效負載的剩餘部分,可能為PES分組,PSI,或一些自定義的資料。
(2) PAT資料結構如下:
program_association_section() {
table_id // 8
section_syntax_indicator // 1
'0' // 1
reserved // 2
section_length // 12
transport_stream_id // 16
reserved // 2
version_number // 5
current_next_indicator // 1
section_number // 8
last_section_number // 8
for (i=0; i
reserved // 3
if(program_number == '0') {
network_PID // 13
}
else {
program_map_PID // 13
}
}
CRC_32 // 32
}
table_id 固定為0x00 ,標誌是該表是PAT
section_syntax_indicator 段語法標誌位,固定為1
section_length 表示這個位元組後面有用的位元組數,包括CRC32。假如後面的位元組加上前面的位元組數少於188,後面會用0XFF填充。假如這個數值比較大,則PAT會分成幾部分來傳輸。
transport_stream_id 該傳輸流的ID,區別於一個網路中其它多路複用的流。
version_number範圍0-31,表示PAT的版本號,標註當前節目的版本.這是個非常有用的引數,當檢測到這個欄位改變時,說明TS流中的節目已經變化了,程式必須重新搜尋節目.
current_next_indicator 表示傳送的PAT是當前有效還是下一個PAT有效。
section_number分段的號碼。PAT可能分為多段傳輸,第一段為00,以後每個分段加1,最多可能有256個分段
last_section_number 最後一個分段的號碼
program_number 節目號
network_PID 網路資訊表(NIT)的PID,網路資訊表提供了該物理網路的一些資訊,和電視臺相關的。節目號為0時對應的PID為network_PID
program_map_PID 節目對映表的PID,節目號大於0時對應的PID,每個節目對應一個
CRC_32 CRC32校驗碼
上面program_number,network_PID,program_map_PID 是迴圈出現的。program_number等於0時對應network_PID,program_number等於其它值時對應program_map_PID。
(3)PMT PMT資料結構如下:
TS_program_map_section() {
table_id // 8
section_syntax_indicator // 1
'0' // 1
reserved // 2
section_length // 12
program_number // 16
reserved // 2
version_number // 5
current_next_indicator // 1
section_number // 8
last_section_number // 8
reserved // 3
PCR_PID // 13
reserved 4
program_info_length // 12
for (i=0; i
}
for (i=0;i
reserved // 3
elementary_PID // 13
reserved // 4
ES_info_length // 12
for (i=0; i
}
}
CRC_32 // 32
}
table_id 固定為0x02 ,標誌是該表是PMT。
section_syntax_indicator section_length version_number current_next_indicator 以上四個欄位意思和PAT相同,可參考上面解釋
section_number last_section_number 以上兩個欄位意思和PAT相同,不過值都固定為0x00,我覺得這樣的原因可能是因為PMT不需要有先後順序,因為先定義哪個節目都是無所謂。
program_number 節目號,表示該PMT對應的節目
PCR_PID PCR(節目時鐘參考)所在TS分組的PID,根據PID可以去搜尋相應的TS分組,解出PCR資訊。
program_info_length 該節目的資訊長度,在此欄位之後可能會有一些位元組描述該節目的資訊
stream_type 指示了PID為elementary_PID的PES分組中原始流的型別,比如影片流,音訊流等,見後面的表
elementary_PID 該節目中包括的影片流,音訊流等對應的TS分組的PID
ES_info_length 該節目相關原始流的描述符的資訊長度。
本文來自CSDN部落格,轉載請標明出處:http://blog.csdn.net/a31898534/archive/2009/08/01/4399353.aspx
[@more@]來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/24790158/viewspace-1041567/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 資料結構-基本概念和術語資料結構
- 資料結構基本概念和術語資料結構
- 資料結構的基本概念資料結構
- 資料結構-基本概念和時空複雜度資料結構複雜度
- 資料結構——圖相關基本概念資料結構
- C++資料結構和pb資料結構的轉換C++資料結構
- 資料結構的一些基本概念資料結構
- 資料結構之第一講 基本概念資料結構
- 資料結構筆記——樹的基本概念資料結構筆記
- 結構化資料、半結構化資料和非結構化資料
- 資料結構FAQ (轉)資料結構
- MySQL資料庫結構和資料的匯出和匯入 (轉)MySql資料庫
- 資料庫結構操作 (轉)資料庫
- 資料倉儲面試資料(基本概念)(轉)面試
- Set和Map資料結構。資料結構
- 結構和其他資料形式
- 資料結構——樹和森林資料結構
- 資料結構:順序結構和鏈式結構的資料型別定義資料結構資料型別
- Linux核心資料結構(轉)Linux資料結構
- ICMP 頭部資料結構 (轉)資料結構
- mysql資料目錄結構(轉)MySql
- bbs的資料結構和儲存過程(二) (轉)資料結構儲存過程
- bbs的資料結構和儲存過程(一) (轉)資料結構儲存過程
- bbs的資料結構和儲存過程(三) (轉)資料結構儲存過程
- 【資料結構——圖和圖的儲存結構】資料結構
- 資料結構 & 演算法 in Swift (一):Swift基礎和資料結構資料結構演算法Swift
- 資料結構—棧和佇列資料結構佇列
- 資料結構和演算法資料結構演算法
- 資料結構(棧和佇列)資料結構佇列
- 【資料結構】--棧和佇列資料結構佇列
- 演算法和資料結構演算法資料結構
- Golang 將資料庫轉換為gorm結構和RESTful apiGolang資料庫ORMRESTAPI
- 資料結構學習(C++)——圖【2】(DFS和BFS) (轉)資料結構C++
- 資料結構:棧的基本概念、順序棧、共享棧以及鏈棧資料結構
- 【PHP資料結構】圖的概念和儲存結構PHP資料結構
- 玩轉資料結構之陣列資料結構陣列
- Java中的資料結構(轉載)Java資料結構
- JavaScript 資料由駝峰結構轉下劃線結構JavaScript