天天看點

MPEG2 PS和TS流格式MPEG2 PS和TS流格式

MPEG2 PS和TS流格式

    應該說真正了解TS,還是看了朋友推薦的《數字電視業務資訊及其編碼》一書之後,MPEG2 TS和數字電視是緊密不可分割的,值得總結一下其中的一些關系。

    ISO/IEC-13818-1:

系統部分;ISO/IEC-13818-2:視訊;ISO/IEC-13818-3:音頻;ISO/IEC-13818-4:一緻性測試;ISO

/IEC-13818-5:軟體部分;ISO/IEC-13818-6:數字存儲媒體指令與控制;ISO/IEC-13818-7:進階音頻編碼;ISO

/IEC-13818-8:系統解碼實時接口;

    MPEG2系統任務包括:1. 規定以包傳輸資料的協定;2. 規定收發兩端資料流同步的協定;3. 提供多個資料流的複用和解複用協定;3. 提供資料流加密的協定。以包形式存儲和傳送資料流是MPEG2系統之要點。

    ES是直接從編碼器出來的資料流,可以是編碼過的視訊資料流,音頻資料流,或其他編碼資料流的統稱。ES流經過PES打包器之後,被轉換成PES包。PES包由標頭和payload組成,具體格式摘錄如下:

MPEG2 PS和TS流格式MPEG2 PS和TS流格式

    可以看到PTS/DTS是打在PES包裡面的,這兩個parameters是解決視音頻同步顯示,防止解碼器輸入緩存上溢或下溢的關鍵。PTS表示顯示單元

出現在系統目标解碼器(STD: system target

decoder)的時間,DTS表示将存取單元全部位元組從STD的ES解碼緩存器移走的時刻。每個I、P、B幀的標頭都有一個PTS和DTS,但PTS與DTS對B幀都是一樣的,無須标出B幀的DTS。對I幀和P幀,顯示前一定要存儲于視訊解碼器的重新排序緩存器中,經過延遲(重新排序)後再顯示,一定要分别标明PTS和DTS。

    上節介紹過,ES首先需打包成PES流包,然後PES根據需要打包成PS或TS包進行存儲或傳輸。其每路ES隻包含一路信源的編碼資料流,是以每路PES也隻包含相對應信源的資料流。

    對

PS流而言,每個PES標頭含有PTS和DTS,流識别碼,用于差別不同性質ES。然後通過PS複用器将PES包複用成PS包。實際上是将PES包分解為

更細小的PS包。在解碼的時候,解複用器将PS分解成一個個PES包,拆包器然後将PES包拆成視訊和音頻的ES,最後輸入至各自解碼器進行解碼。一個問

題是:各個ES在解碼時,如何保證視音頻的同步呢?除了PTS和DTS的配合工作外,還有一個重要的參數是SCR(system clock

reference)。在編碼的時候,PTS,DTS和SCR都是由STC(system time

clock)生成的,在解碼時,STC會再生,并通過鎖相環路(PLL-phase lock

loop),用本地SCR相位與輸入的瞬時SCR相位鎖相比較,以确定解碼過程是否同步,若不同步,則用這個瞬時SCR調整27MHz的本地時鐘頻率。最

後,PTS,DTS和SCR一起配合,解決視音頻同步播放的問題。PS格式摘錄如下:

MPEG2 PS和TS流格式MPEG2 PS和TS流格式

    PS包的長度比較長且可變,主要用于無誤碼環境裡,因為越長的話,同步越困難,且在丢包的情況下,重組也越困難。是以,PS适合于節目資訊的編輯和本地内容應用的application。

    TS流也是由一個或多個PES組合而來的,他們可以具有相同的時間基準,也可以不同。其基本的複用思想是,對具有相同時間基準的多個PES現進行節目複用,然後再對互相有獨立時間基準的各個PS進行傳輸複用,最終産生出TS。

    TS包由標頭和包資料2部分組成,其中標頭還可以包括擴充的自适用區。標頭長度占4bytes,自使用區和包資料共占184bytes,整個TS包長度相當于4個ATM包長。TS包的標頭由如下圖摘錄所示的同步位元組、傳輸誤碼訓示符、有效載荷單元起始訓示符、傳輸優先、包識别(PID-Packet Identification)、傳輸加擾控制、自适應區控制和連續計數器8個部分組成。

MPEG2 PS和TS流格式MPEG2 PS和TS流格式

    其中,可用同步位元組位串的自動相關特性,檢測資料流中的包限制,建立包同步;傳輸誤碼訓示符,是指有不能消除誤碼時,采用誤碼校正解碼器可表示1bit 的誤碼,但無法校正;有效載荷單元起始訓示符,表示該資料包是否存在确定的起始資訊;傳輸優先,是給TS包配置設定優先權;PID值是由使用者确定的,解碼器根據PID将TS上從不同ES來的TS包差別出來,以重建原來的ES;傳輸加擾控制,可訓示資料包内容是否加擾,但標頭和自适應區永遠不加擾;自适應區控制,用2 bit表示有否自适應區,即(01)表示有有用資訊無自适應區,(10)表示無有用資訊有自适應區,(11)表示有有用資訊有自适應區,(00)無定義;連續計數器可對PID包傳送順序計數,據計數器讀數,接收端可判斷是否有包丢失及包傳送順序錯誤。顯然,標頭對TS包具有同步、識别、檢錯及加密功能。

    TS包自适應區由自适應區長、各種标志訓示符、與插入标志有關的資訊和填充資料4部分組成。其中标志部分由間斷訓示符、随機存取訓示符、ES優化訓示符、PCR标志、接點标志、傳輸專用資料标志、原始PCR标志、自适應區擴充标志8個部分組成。重要的是标志部分的PCR字段,可給編解碼器的27MHz時鐘提供同步資料,進行同步。其過程是,通過PLL,用解碼時本地用PCR相位與輸入的瞬時PCR相位鎖相比較,确定解碼過程是否同步,若不同步,則用這個瞬時PCR調整時鐘頻率。因為,數字圖像采用了複雜而不同的壓縮編碼算法,造成每幅圖像的資料各不相同,使直接從壓縮編碼圖像資料的開始部分擷取時鐘資訊成為不可能。為此,選擇了某些(而非全部)TS包的自适應區來傳送定時資訊。于是,被選中的TS包的自适應區,可用于測定包資訊的控制bit和重要的控制資訊。自适應區無須伴随每個包都發送,發送多少主要由選中的TS包的傳輸專用時标參數決定。标志中的随機存取訓示符和接點标志,在節目變動時,為随機進入I幀壓縮的資料流提供随機進入點,也為插入當地節目提供友善。自适應區中的填充資料是由于PES包長不可能正好轉為TS包的整數倍,最後的TS包保留一小部分有用容量,通過填充位元組加以填補,這樣可以防止緩存器下溢,保持總碼率恒定不變。

    前面3節總結了MPEG2

TS的基本格式,其中包括PES,PS和TS,以及相關字段的介紹。那麼作為一種傳輸流,TS将内容進行打包/複用,讓其媒體内容變成TS傳輸,并最終在

解碼端解碼。簡單來看,TS是一個傳輸層的協定棧,它可以承載各種内容的傳輸,比如MPEG,WMV,H264,甚至是IP,那麼其中的傳輸規範是如何定

義的呢?這個即是PSI(節目特定資訊)要做的事情。

    PSI

由四張表構成:PAT,PMT,CAT和NIT,這四張表分别描述了一個TS所包括的所有ES流的傳輸結構。首先的一個概念是,TS是以包形式傳播,在編

解碼端都需要以一定的包ID來辨別TS流裡承載的内容,比如,PAT表會存在于一個或多個TS包裡,是以要用一個特别的包ID來表示,另外,不同的ES流

也需要不同的包ID來辨別。我們有了PAT和PMT這兩種表,解碼器就可以根據PID,将TS上從不同ES來的TS包區分出來進行解碼。

    TS的解碼分兩步進行,其一,是從PID為0

的TS包裡,解析出PAT表,然後從PAT表裡找到各個節目源的PID,一般此類節目源都由若幹個ES流組成,并描述在PMT表裡面,然後通過節目源的

PID,就可以在PMT表裡檢索到各個ES的PID。其二,解碼器根據PMT表裡的ES流的PID,将TS流上的包進行區分,并按不同的ES流進行解碼。

是以,TS是經過節目複用和傳輸複用兩層完成的,即在節目複用時,加入了PMT,在傳輸複用時,加入了PAT。同樣在節目解複用時,可以得到PMT,在傳

輸解複用時,可以得到PAT。下圖很好地概述了其思想。

MPEG2 PS和TS流格式MPEG2 PS和TS流格式

    TS是支援多路複用的,是以它可用來傳輸經複用後的多層節目。在複用過程中,要注意的是,解碼過程中所需要面對的時間參考和同步問題,因為解複用是需要各種資訊同步進行的,是以在複用過程中,就需要插入相關的時間資訊:PTS,DTS,PCR。

    在TS形成過程中,PTS和DTS是在ES打包成PES時,根據STC的參考,将其時鐘資訊注入PES包中的,而之後在PES切成TS時,再将PID和

PCR資訊注入到TS包中,當多路TS再進行複用的時候,各路TS的PCR将會被提取出來,再進行分析,然後再根據統一的STC參考,将新的PCR生成并

注入到TS中去,最後,因為原來PAT表資訊不在适用,是以新的PAT表需要再生成,并附加到新的TS流中去。經過這多層的複用之後,新的TS流即可以進

入調制,傳輸階段。過程可參見下圖:

MPEG2 PS和TS流格式MPEG2 PS和TS流格式

    解碼過程要面對的問題是:解複用,視音頻的同步,解碼緩存器無上下溢。解複用即是将TS在同一信道裡不同時序進行傳輸的節目分離出來;視音頻同步由DTS,

PTS和PCR三者協調完成,并且PCR是重建系統時間基準的絕對時标,而DTS和PTS是解碼和重制時刻的相對時标;對解碼緩存器無上下溢的問題,必須

借助于系統目标解碼器(STD)模型來對其進行實作,基本思想如下:

  1. TS流進入解碼器後,首先由換向器,按照一定的時序關系,将各種ES流分解出來(其中也包括PSI資訊流)。
  2. 分解過後的ES流會進入各自的傳輸緩存器,通過之後,其PES流進入各自的主存儲器,注意的是:PSI資訊流會進入系統緩存器,最後也到達主存儲器。
  3. 最後,解碼器根據DTS資訊,從各個主存儲器分别提取媒體或系統資訊,進行解碼,并根據PTS資訊,将媒體内容進行顯示處理。

其過程可參見下圖:

MPEG2 PS和TS流格式MPEG2 PS和TS流格式

MPEG-2 學習筆記

  最近有點時間,看了一部分MPEG-2 的規範,看後想總結點東西,算是做了點作業,另外希望能和大家讨論讨論,請大家指點。

中文版很多概念翻譯得很模糊,不易了解,但總體來說還算是不錯,适合像我這種入門級别的看,不過建議和英文版對照看,對一些概念能比較準确的了解。整個規範包括三部分:系統,視訊編碼,音頻編碼。對應的标準号分别為ISO/IEC 13818-1,ISO/IEC 13818-2,ISO/IEC 13818-3,在規範中經常可以看到這幾個字元串。

第一部分“系統”和我們現在的工作關系較緊密,我也主要學習了第一部分。後面兩部分主要是講解編碼過程,編碼部分看了實在讓人犯暈,先偷一下懶吧,把第一部分搞清楚了再看去啃難啃的骨頭吧。

下面進入正題了。

一、概念

規範中講述的概念很多,容易讓人糊塗,是以先把一些概念理清,弄清楚它們之間的關系,再看後面的就可提高很多的效率。

(1)ES- Elementary Streams (原始流),對視訊、音頻信号及其他資料進行編碼壓縮後

的資料流稱為原始流。原始流包括通路單元,比如視訊原始流的通路單元就是一副圖像的編

碼資料。

(2) PES- Packetized Elementary Streams (分組的原始流),原始流形成的分組稱為PES分組,是用來傳遞原始流的一種資料結構

(3)節目是節目元素的集合。節目元素可能是原始流,這些原始流有共同的時間基點,用來做同步顯示。

(4)傳輸流和節目流

TS-Transport Stream 翻譯為“傳輸流”

PS-Program Stream  翻譯為“節目流”

PS用來傳輸和儲存一道節目的編碼資料或其他資料。PS的組成機關是PES分組。

TS用來傳輸和儲存多道節目的編碼資料或其他資料,TS的組成機關是節目。

PS适用于不容易發生錯誤的環境,以及涉及到軟體處理的應用,典型應用如DVDCD光牒的檔案存儲

TS适用于容易發生錯誤的環境,典型應用就是數字電視信号的傳輸。

TS和PS是可以互相轉換的,比如從TS中抽取一道節目的内容并産生有效的PS是可能。

 (5)傳輸流分組和PES分組

原始流分成很多PES分組,保持串行順序,一個PES分組隻包含一個原始流的編碼資料。PES分組長度很大,最大可為64K位元組。

PES分組分為“分組首部(header)”和“有效負載(payload)”。“有效負載”指跟随在首部位元組之後的位元組。首部的前4個位元組構成分組的起始碼,辨別了該分組所屬原始流的類型和ID号。

MPEG2 PS和TS流格式MPEG2 PS和TS流格式

TS分組也就是傳輸流資料形成的資料包。每個TS分組長度為188位元組,包括“分組首部”和“有效負載,前4個位元組是分組首部,包含了這個分組的一些資訊。有些情況下需要更多的資訊時,需在後面添加“調整字段(adaption field)”。

MPEG2 PS和TS流格式MPEG2 PS和TS流格式

兩者之間的關系:

     P ES 分組是插入到 TS 分組中的,每個 PES 分組首部的第一位元組就是 TS 分組有效負載的第一位元組。 一個 PID 值的 TS 分組隻帶有來自一個原始流的資料。

MPEG2 PS和TS流格式MPEG2 PS和TS流格式

(5)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(服務資訊)。

l     PSI 的 PID 是特定的,含 PSI 的資料包必須周期 性的出現在傳輸流中。

PMT (Program Map Table )節目映射表

PMT所在分組的PID由PAT指定,是以要先解出PAT,再解PMT

PMT中包含了屬于同一節目的視訊、音頻和資料原始流的PID。

找到了PMT,解多路複用器就可找到一道節目對應的每個原始流的PID,再根據原始流

PID,去擷取原始流。如下圖:PID1和PID2分别對應某道節目的視訊原始流和音頻原始流

的PID。

MPEG2 PS和TS流格式MPEG2 PS和TS流格式

l       PAT (Program  Association    Table ) 節目關聯表

l       PAT 所在分組的 PID=0

      PAT 中列出了傳輸流中存在的節目流

l

l       PAT 指定了傳輸流中每個節目對應 PMT 所在分組的 PID

l       PAT 的第一條資料指定了 NIT 所在 分組的 PID ,其他資料指定了PMT所在分組的PID,如下圖所示:

MPEG2 PS和TS流格式MPEG2 PS和TS流格式

l CAT ( Conditional Access Table  ) 條件通路表

l CAT 所在分組的 PID=1

l CAT 中列出了條件控制資訊 (ECM) 和條件管理 資訊 (EMM) 所在分組的 PID 。

l CAT 用于節目的加密和解密

l NIT(  Network Information Table ) 網絡資訊表

l NIT 所在分組的 PID 由 PAT 指定

l NIT 提供一組傳輸流的相關資訊,以及于網絡自 身特性相關的資訊,比如 網絡名稱 , 傳輸參數 (如頻率,調制方式等) 。

l NIT 一般是解碼器内部使用的資料 , 當然也可以 做為EPG的一個顯示資料提供給使用者做為參考 。

幾種PSI之間的關系,如下圖所示:首先PAT中指定了傳輸流中所存在的節目,及每個節目對應的PMT的PID号。 比如Program 1對應的PMT 的PID=22,然後找到PID=22的TS分組,解出PMT,得到這個節目中包含的原始流的PID,再根據原始流的PID去找相應的TS分組,擷取原始流的資料,然後就可以送入解碼器解碼了。

MPEG2 PS和TS流格式MPEG2 PS和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<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

     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。

舉個例子,下述流為帶PAT的TS分組:

47 40 00 1c 00 00 b0 15 13 f6 e7 00 00 00 00 e0 10 00 01 e0 20 00 02 e0 21 1a 34 b4 77 ff…………..ff

其中紅色的四個位元組是TS分組頭部,用資料結構解出首部,得到PID=0x00,表示為該分組的有效負載是PAT。藍色的00稱為“指針域”----Pointer field,表示了一個偏移量,即從後面第幾個位元組開始是PAT部分。為00表示後面緊接着的就是PAT:00 b0 15 13 f6 e7 00 00 00 00 e0 10 00 01 e0 20 00 02 e0 21 1a 34 b4 77

再利用PAT的資料結構解出PAT,得到如下資訊:

---------------PAT Information-------------

table_id: 00

section_syntax_indicator: 01

section_length: 0015

transport_stream_id: 13f6

version_number: 13

current_next_indicator: 01

section_number: 00

last_section_number: 00

program_number: 0000

network_PID: 0010

program_number: 0001

program_map_PID: 0020

program_number: 0002

program_map_PID: 0021

CRC_32: 1a34b477

可以看出,此PAT隻有一段,包含了三個節目,節目号0000對應于network_PID=0010 ,節目号0001對應于program_map_PID =0020,節目号0002對應于program_map_PID =0021,從實際的角度,我們應該把這三個節目号了解為三個頻道,第一個頻道中的内容是網絡資訊,第二、三個頻道包含了節目資訊。在數字電視中,一個頻道即對應于一個頻點,如498MHZ,一個頻道上可以有多個節目,後面的PMT即是告訴了我們某個頻道中所有節目對應的PID。

于是現在就搜尋PID=0x0020的TS分組,即是頻道2對應的PMT資訊。

( 其實樓主的了解不是完全正确,transport_stream_id辨別了一個唯一的傳輸流(每一個傳輸流對應一個頻點,如498MHz),一個PAT表表示一個流裡面的資訊。

上面的三個節目号了解為三個頻道是正确的,但在數字電視中,一個頻道對應的也是一個節目,而不是一個頻點(當然節目号為0時對應的是NIT的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 對應的類型:

MPEG2 PS和TS流格式MPEG2 PS和TS流格式

還是舉個例子,下述是一個包含PMT的TS分組,

   47 40 20 1c 00 02 b0 1f 00 01 e7 00 00 e1 00 f0 00 02 e1 00 f0 05 02 03 b2 44 5f 04 e1 10 f0 03 03 01 67 c9 ab c8 d2

紅色的四個位元組是TS分組頭部,藍色的00是“指針域”,意義同PAT中的指針域。是以下面的資料就是PMT的内容:02 b0 1f 00 01 e7 00 00 e1 00 f0 00 02 e1 00 f0 05 02 03 b2 44 5f 04 e1 10 f0 03 03 01 67 c9 ab c8 d2

再解出PMT,得到下列資訊:

table_id: 02

section_syntax_indicator: 01

section_length: 01f

program_number: 0001

version_number: 13

current_next_indicator: 01

section_number: 00

last_section_number: 00

PCR_PID: 0100

program_info_length: 000

descriptor:

steam_type: 00

elementary_PID: 0001

ES_info_length: 000

descriptor:

steam_type: 02

elementary_PID: 0001

ES_info_length: 005

descriptor: 02 03 b2 44 5f

steam_type: 04

elementary_PID: 0011

ES_info_length: 003

descriptor: 03 01 67

CRC_32: c9abc8d2

可以看出,該節目号0001包含了三個流的資訊,流類型分别為00,02,04,00的流為保留值,可以不考慮,02表示原始流為視訊流,其elementary_PID為0001,04表示原始流為音頻流,其elementary_PID為0011,兩個流分别還帶有descriptor(描述符),說明了該原始流的一些資訊。

得到了這個elementary_PID,再從後面的傳輸流中找到PID為這個值的TS分組,其有效負載即為這個原始流的資料,擷取資料送到解碼器,即可還原這個視訊或音頻了。

三、總結

上面的都是一些零散的知識,跟我們實際應用有什麼關系呢?下面就是一個簡易的應用過程---搜台。搜台過程大緻如下:

先調整高頻頭到一個固定的頻率(如498MHZ),如果此頻率有數字信号,則相關晶片會自動把TS流資料傳送給MPEG- 2 decoder. MPEG-2 decoder先進行資料的同步,也就是等待完整的Packet的到來.然後循環查找是否出現PID== 0x0000的Packet,如果出現了,則馬上進入分析PAT的處理,擷取了所有的PMT的PID.接着循環查找是否出現PMT,如果發現了,則自動進 入PMT分析,擷取該頻段所有的頻道資料并儲存.如果沒有發現PAT或者沒有發現PMT,說明該頻段沒有信号,進入下一個頻率掃描。

上述過程主要涉及到PAT和PMT的一些解碼和解複用知識,這也是目前我學習到的,當然,數字電視涉及到的知識遠遠不止這些,解碼方面就還包括調整字段的處理,SI(業務資訊)應用,時鐘的處理,CA加密解MI系統等,還需要繼續的學習和實踐。

繼續閱讀