/*
**************************************************************************************************************************************
(1)ES- Elementary Streams (原始流),對視頻、音頻信號及其他數據進行編碼壓縮後的數據流稱爲原始流。原始流包括訪問單元,比如視頻原始流的訪問單元就是一副圖像的編碼數據。
(2)PES- Packetized Elementary Streams (分組的原始流),原始流形成的分組稱爲PES分組,是用來傳遞原始流的一種數據結構
(3)節目是節目元素的集合。節目元素可能是原始流,這些原始流有共同的時間基點,用來做同步顯示。
(4)傳輸流和節目流
4.1) TS-Transport Stream 翻譯爲“傳輸流”
4.2) PS-Program Stream 翻譯爲“節目流”
4.3) PS用來傳輸和保存一道節目的編碼數據或其他數據,PS的組成單位是PES分組。
4.4) TS用來傳輸和保存多道節目的編碼數據或其他數據,TS的組成單位是節目。
4.5) PS適用於不容易發生錯誤的環境,以及涉及到軟件處理的應用,典型應用如DVD光盤的文件存儲.
4.6) TS適用於容易發生錯誤的環境,典型應用就是數字電視信號的傳輸。
TS和PS是可以互相轉換的,比如從TS中抽取一道節目的內容併產生有效的PS是可能。
(5)傳輸流分組和PES分組原始流分成很多PES分組,保持串行順序,一個PES分組只包含一個原始流的編碼數據。
5.1) PES分組長度很大,最大可爲64K字節。PES分組分爲“分組首部(header)”和“有效負載(payload)”。
5.2) “有效負載”指跟隨在首部字節之後的字節。首部的前4個字節構成分組的起始碼,標識了該分組所屬原始流的類型和ID號。
5.3) TS分組也就是傳輸流數據形成的數據包。每個TS分組長度爲188字節,包括“分組首部”和“有效負載,前4個字節是分組首部,包含了這個分組的一些信息。
5.4) 有些情況下需要更多的信息時,需在後面添加“調整字段(adaption field)”。
5.5) 兩者之間的關係:PES分組是插入到TS分組中的,每個PES分組首部的第一字節就是TS分組有效負載的第一字節。一個PID值的TS分組只帶有來自一個原始流的數據。
(6)PSI 全稱Program Specific Information,意爲節目專用信息。
6.1) 傳輸流中是多路節目複用的,那麼,怎麼知道這些節目在傳輸流中的位置,區分屬於不同節目呢?所以就還需要一些附加信息,這就是PSI。
6.2) PSI也是插入到TS分組中的,它們的PID是特定值。
6.3) MPEG-2中規定了4個PSI,包括:
PAT(節目關聯表),
CAT(條件訪問表),
PMT(節目映射表),
NIT(網絡信息表),
這些PSI包含了進行多路解調和顯示節目的必要的和足夠的信息。
6.4) 應用中可能包括更多的信息,比如DVB-T中定義了SDT(服務描述表),EIT(環境信息表),BAT(節目組相關表),TDT(時間日期表)等,統稱爲DVB-SI(服務信息)。
6.5) 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所在分組的PID;
PAT的第一條數據指定了NIT所在分組的PID ,其他數據指定了PMT所在分組的PID。
--->CAT (Conditional Access Table )條件訪問表CAT所在分組的PID=1;
CAT中列出了條件控制信息(ECM)和條件管理信息(EMM)所在分組的PID。
CAT用於節目的加密和解密
--->NIT( Network Information Table)網絡信息表;
NIT所在分組的PID由PAT指定;
NIT提供一組傳輸流的相關信息,以及於網絡自身特性相關的信息,比如網絡名稱,傳輸參數(如頻率,調製方式等)。
NIT一般是解碼器內部使用的數據,當然也可以做爲EPG的一個顯示數據提供給用戶做爲參考。
幾種PSI之間的關係,如下圖所示:
1. 首先PAT中指定了傳輸流中所存在的節目,及每個節目對應的PMT的PID號。
2. 比如Program 1對應的PMT的PID=22,然後找到PID=22的TS分組;
3. 解出PMT,得到這個節目中包含的原始流的PID;
4. 再根據原始流的PID去找相應的TS分組,獲取原始流的數據;
5. 然後就可以送入解碼器解碼了。
**************************************************************************************************************************************
*/
/*
* 數據結構(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<N;i++){
data_byte //8
}
}
}
/*
**************************************************************************************************************************************
--->前面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<N;i++) {
program_number // 16
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<N; i++) {
descriptor()
}
for (i=0;i<N1;i++) {
stream_type // 8
reserved // 3
elementary_PID // 13
reserved // 4
ES_info_length // 12
for (i=0; i<N2; i++) {
descriptor()
}
}
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 : 該節目相關原始流的描述符的信息長度。stream_type對應的類型:
**************************************************************************************************************************************
*/
TS_PSI介紹
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.