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組成,具體格式摘錄如下:
可以看到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格式摘錄如下:
PS包的長度比較長且可變,主要用于無誤碼環境裡,因為越長的話,同步越困難,且在丢包的情況下,重組也越困難。是以,PS适合于節目資訊的編輯和本地内容應用的application。
TS流也是由一個或多個PES組合而來的,他們可以具有相同的時間基準,也可以不同。其基本的複用思想是,對具有相同時間基準的多個PES現進行節目複用,然後再對互相有獨立時間基準的各個PS進行傳輸複用,最終産生出TS。
TS包由標頭和包資料2部分組成,其中標頭還可以包括擴充的自适用區。標頭長度占4bytes,自使用區和包資料共占184bytes,整個TS包長度相當于4個ATM包長。TS包的標頭由如下圖摘錄所示的同步位元組、傳輸誤碼訓示符、有效載荷單元起始訓示符、傳輸優先、包識别(PID-Packet Identification)、傳輸加擾控制、自适應區控制和連續計數器8個部分組成。
其中,可用同步位元組位串的自動相關特性,檢測資料流中的包限制,建立包同步;傳輸誤碼訓示符,是指有不能消除誤碼時,采用誤碼校正解碼器可表示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。下圖很好地概述了其思想。
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流即可以進
入調制,傳輸階段。過程可參見下圖:
解碼過程要面對的問題是:解複用,視音頻的同步,解碼緩存器無上下溢。解複用即是将TS在同一信道裡不同時序進行傳輸的節目分離出來;視音頻同步由DTS,
PTS和PCR三者協調完成,并且PCR是重建系統時間基準的絕對時标,而DTS和PTS是解碼和重制時刻的相對時标;對解碼緩存器無上下溢的問題,必須
借助于系統目标解碼器(STD)模型來對其進行實作,基本思想如下:
- TS流進入解碼器後,首先由換向器,按照一定的時序關系,将各種ES流分解出來(其中也包括PSI資訊流)。
- 分解過後的ES流會進入各自的傳輸緩存器,通過之後,其PES流進入各自的主存儲器,注意的是:PSI資訊流會進入系統緩存器,最後也到達主存儲器。
- 最後,解碼器根據DTS資訊,從各個主存儲器分别提取媒體或系統資訊,進行解碼,并根據PTS資訊,将媒體内容進行顯示處理。
其過程可參見下圖:
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号。
TS分組也就是傳輸流資料形成的資料包。每個TS分組長度為188位元組,包括“分組首部”和“有效負載,前4個位元組是分組首部,包含了這個分組的一些資訊。有些情況下需要更多的資訊時,需在後面添加“調整字段(adaption field)”。
兩者之間的關系:
P ES 分組是插入到 TS 分組中的,每個 PES 分組首部的第一位元組就是 TS 分組有效負載的第一位元組。 一個 PID 值的 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。
l PAT (Program Association Table ) 節目關聯表
l PAT 所在分組的 PID=0
PAT 中列出了傳輸流中存在的節目流
l
l PAT 指定了傳輸流中每個節目對應 PMT 所在分組的 PID
l PAT 的第一條資料指定了 NIT 所在 分組的 PID ,其他資料指定了PMT所在分組的PID,如下圖所示:
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分組,擷取原始流的資料,然後就可以送入解碼器解碼了。
二、資料結構
(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 對應的類型:
還是舉個例子,下述是一個包含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系統等,還需要繼續的學習和實踐。