PSISI理解入門_第1頁
PSISI理解入門_第2頁
PSISI理解入門_第3頁
PSISI理解入門_第4頁
PSISI理解入門_第5頁
已閱讀5頁,還剩39頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領

文檔簡介

1、psi/si理解入門一、mpeg-2系統(tǒng)原理 第一章mpeg-2簡介什么是mpeg和mpeg-2?mpeg是movingpictureexpertsgroup的簡稱,mpeg-2是mpeg和iso組織設計的一個數(shù)字視頻壓縮規(guī)范,主要用于dvd和dvb上,當前的標準文檔是iso13818.什么是dvb?dvb是digtalvideobroadcast的簡稱,是歐洲所有國家和其他部分國家和地區(qū)使用的數(shù)字電視標準.其中美國的atsc標準也是在dvb標準的基礎上實現(xiàn)的.什么是ts碼流和ps流?ts是transportstream的簡稱,就是”傳輸流”.dvb數(shù)據(jù)廣播采用的數(shù)據(jù)格式就是ts碼流.ps是p

2、rogramstream的簡稱,就是”節(jié)目流”.dvd中采用的數(shù)據(jù)格式就是ps流.這兩種流的格式是不同的,ts格式具有很強的錯誤校正功能,適合傳輸,而ps格式適合存儲在媒體中.在這里,著重描述的是ts碼流格式.什么是pid?pid是packetidentification的簡稱,就是”包標志符”.dvb系統(tǒng)把不同的數(shù)據(jù)打包成不同的數(shù)據(jù)包,用系統(tǒng)唯一的一個13bits數(shù)字標志該數(shù)據(jù)的類型.例如,pid=0x00 表示是dvb系統(tǒng)中的pat包,而pid=0x10表示是dvb系統(tǒng)的nit包.不同的節(jié)目(包括video和audio)分別采用不同的pid,例如,我們在pmt表中如果檢測到pid=0x01

3、20的pid是video數(shù)據(jù),那么表示包號碼是0x0120的所有包都是video數(shù)據(jù),其他依此類推.什么是pat?pat是programassociationtable的簡稱,即”節(jié)目關(guān)聯(lián)表”.pat屬于dvb系統(tǒng)流中的一個包,包號碼(pid)是0x00.pat表描述了dvb系統(tǒng)流中包含什么樣的pid,主要是描述當前流的nit表格的pid號碼是多少,當前流中有多少個不同類型pmt表,每個pmt表對應的頻道號等信息.什么是pmt?pmt是programmaptable的簡稱,即”節(jié)目影射表”.pmt的 pid是服務器自由定義的(但不會和系統(tǒng)保留的pid沖突).這個pid是在pat表中描述的,比如

4、,如果在pat表中有0x100項的內(nèi)容,那么說明所有pid是0x100的包都是pmt表.不同的頻道有不同的pmt,也就是說,一個不同的pmt代表的是一個不同頻道.pmt表格和pat表格配合在一起,就可以檢測出dvb流中所有存在節(jié)目的所有pid,因此,數(shù)字電視搜臺就是依靠這兩個表格數(shù)據(jù)完成的.什么是cat?cat是conditionalaccesstable的簡稱,即”條件訪問表”,pid是0x01.cat攜帶的是服務器的私有信息(ca系統(tǒng)就需要使用該表格實現(xiàn)節(jié)目的解密).什么是sdt?sdt是servicedescriptiontable的簡稱,即”服務器描述表”,pid是0x11.sdt攜帶

5、的是電視臺名稱和電視節(jié)目名稱.dvb接收系統(tǒng)接收sdt表中的節(jié)目信息,實現(xiàn)比較友好的界面顯示和操作.什么是nit和eit?nit是networkinformationtable的簡稱,即”網(wǎng)絡信息表”.eit是eventinformationtable的簡稱,即”環(huán)境信息表”.nit可以提供當前流的節(jié)目信息,也可以提供和當前流有關(guān)聯(lián)的流的節(jié)目信息.eit提供的是流節(jié)目信息的改變,比如一個節(jié)目已經(jīng)開始,或者已經(jīng)結(jié)束的信息等.什么是epg?epg是electronicprogrammeguides的簡稱,即”電子節(jié)目指南”.該功能可實現(xiàn)預告近段時間即將播放的節(jié)目內(nèi)容,同時支持基于內(nèi)容的檢索.什么是

6、teletext?teletext就是我們常說的”圖文電視”,當然在mpeg-2中,圖文電視已經(jīng)數(shù)字化,也就是說,圖文信息已經(jīng)做為數(shù)字化信息在ts流中傳播.但最終,數(shù)字化的圖文信息都將轉(zhuǎn)化為模擬的vbi信息插入到正常的電視信號中實現(xiàn)圖文電視的顯示.圖文電視有很多標準,比如closecaption,wss等,歐洲的 dvb使用的teletext標準是itu-rsystembteletext規(guī)格.該規(guī)格支持歐洲多種語言,支持簡單圖象和文本的混合顯示.第二章dvb系統(tǒng)的構(gòu)成本文不詳細描述dvb系統(tǒng)的硬件構(gòu)成,只是根據(jù)iso13818中的描述,詳細解釋ts碼流的格式和解復用原理.(夠了,夠了呵呵)dv

7、b的分類dvb根據(jù)應用的不同,主要分為dvb-s,dvb-c,dvb-t,dvb-h等多種規(guī)格.不同的規(guī)格基本原理都是相同的,不同的主要是調(diào)制方式不同:dvb-s,s是satelite的首字母,應用于數(shù)字電視衛(wèi)星廣播,調(diào)制方式是qpsk.dvb-c,c是cable的首字母,應用于城市有線廣播.調(diào)制方式是qam所有格式:16qam,32qam,64qam,128qam,256qam.dvb-t,t是terrestrial的首字母,應用于陸地無線廣播,調(diào)制方式是qpsk或者16qam和64qam.dvb-h,h是handheld的首字母,應用于手持無線廣播,調(diào)制方式和dvb-t相同.總的來說,不同

8、的dvb系統(tǒng)只有前端系統(tǒng)是不同的,最終的數(shù)字信息都是相同的,也就是都是采用iso13818描述的規(guī)格.前端系統(tǒng)主要是指調(diào)制方法和發(fā)射方法等.因此,這里所敘述的內(nèi)容,全部適用于所有的dvb系統(tǒng),同時因為美國的atsc系統(tǒng)也是在dvb系統(tǒng)上的小量更改和小部分功能增加,因此也適用于atsc標準.基本系統(tǒng)描述如下:(1)編碼系統(tǒng):假設信號源有6個節(jié)目,則dvb系統(tǒng)先對這6個節(jié)目的所有數(shù)據(jù)(video,audio)進行壓縮處理,然后經(jīng)過一個叫做復用的程序進行節(jié)目的復用(pid分配,即對6個節(jié)目分別分配不同的pid號碼)形成叫做pes的包,然后再經(jīng)過ts流處理程序,把這些pes包全部封裝成ts碼流格式,

9、最后把獲得的ts格式的數(shù)字信號經(jīng)過調(diào)制(實現(xiàn)的是頻率的復用),然后經(jīng)過d/a轉(zhuǎn)換成模擬信號,再次調(diào)制成高頻信號,經(jīng)傳輸系統(tǒng)發(fā)送出去.(2)解碼系統(tǒng)接收系統(tǒng)接收到高頻信號,先轉(zhuǎn)化為中頻信號,然后再經(jīng)過一個高速的a/d轉(zhuǎn)換成數(shù)字信號,接著經(jīng)過一個反調(diào)制程序,這樣就得到了ts碼流.ts碼流進入一個稱為解復用的程序,該程序?qū)崿F(xiàn)自動分析ts流中的表格信息,讀取所有可用的pid信息等,然后提取一個用戶指定的pid(用戶選擇的節(jié)目),把該節(jié)目的數(shù)字信號全部接收而忽略其他不需要的信號,然后video,audio信號分別進入不同的解壓縮程序,分別對video,audio信號進行解壓縮和顯示,如果該節(jié)目包含了te

10、letext和epg,也有可能同時處理teletext和epg,并且把處理的結(jié)果和video信號一起疊加到屏幕上.packet的概念(1)ts流是基于packet的位流格式,每個包是188字節(jié)或者204字節(jié)(一般是188字節(jié),204字節(jié)的格式僅僅是在188字節(jié)的packet后部加上16字節(jié)的crc數(shù)據(jù),其他格式是一樣的),整個ts流組成如下所示:packet1packet2.packetn在實際使用中,因為ts流已經(jīng)內(nèi)部具有很強的錯誤處理能力,所以一般使用較多的是188字節(jié)一個包的格式,204字節(jié)一個包的格式據(jù)說一般在高清節(jié)目中使用較多.所有的packet格式都是統(tǒng)一的,包括一個packeth

11、eader和packetdatas.其中packetheader包含了同步字節(jié)(該字節(jié)固定是0x47,表示這個包的數(shù)據(jù)開始是正確的),該packet的唯一號碼(即pid)和其他一些信息.格式如下(用c格式表示)typedefstructunsignedsync_byte:8;/*8bits的同步字節(jié)*/unsignedtransport_error_indicator:1;/*1bit的錯誤指示信息,1表示當前packet至少有1bit的傳輸錯誤,0表示所有數(shù)據(jù)都正確*/unsignedpayload_unit_start_indicator:1;/*負載單元開始標志,請參考iso13818-

12、1了解該標志作用*/unsignedtransport_priority:1;/*1bit的傳輸優(yōu)先級標志,1表示高優(yōu)先級,0表示低優(yōu)先級*/unsignedpid:13;/*13bits的packetid號碼,唯一的號碼對應不同的包*/unsignedtransport_scrambling_control:2;/*2bits的加密標志,00表示沒有加密,其他表示已被加密*/unsignedadaptation_field_control:2;/*2bits的附加區(qū)域控制,請參考iso13818-1了解該標志作用*/unsignedcontinuity_counter:4;/*4bits的包

13、遞增計數(shù)器*/packet_header;以上結(jié)構(gòu)剛好占用32bits,即4個字節(jié),因此一個ts流的packet頭部的4字節(jié)是header信息,分析該header信息就可以知道當前packet的屬性.剩下的184字節(jié)有可能是video數(shù)據(jù),也有可能是audio數(shù)據(jù),也有可能是dvbsi信息,怎么區(qū)分呢?其實很簡單,就是利用header中的pid信息.上一章說了pat是節(jié)目關(guān)聯(lián)表,它的pid是0x0000.這個pid就是對應這里header的pid.換句話就是說,如果我們發(fā)現(xiàn)一個packet的pid等于0x0000,那么說明這個packet是dvb的pat表格而不是video數(shù)據(jù)或者audio數(shù)

14、據(jù).實際上,在信號編碼成ts碼流的時候,不同節(jié)目的video,audio等數(shù)據(jù)都分配了不同的pid.例如,一個節(jié)目有兩路video,三路audio, 那么分配pid的時候可能是 video1=0x100,video2=0x101,audio1=0x102,audio2=0x103,audio3=0x104, 這樣傳輸?shù)膖s碼流中的pid就可能有以上的pid.因此,如果我們需要在程序中過濾出第一路video和第二路audio就可以這樣處理了(偽代碼描述):voidprocess_packet(unsignedchar*buff)intpid=getpid(buff);/*從當前的188字節(jié)緩沖區(qū)

15、中獲取pid信息*/if(pid=0x100)/*pid等于第一路video的pid,說明當前數(shù)據(jù)是video數(shù)據(jù)*/savetovideobuffer(buff+4);/*把header后部的數(shù)據(jù)存到video緩沖區(qū),待后部處理*/elseif(pid=0x103)/*pid等于第二路audio的pid,說明當前數(shù)據(jù)是audio數(shù)據(jù)*/savetoaudiobuffer(buff+4);/*把header后部的數(shù)據(jù)存到audio緩沖區(qū)*/else/*其他pid則丟棄,當然如果pid是dvb系統(tǒng)保留的pid如pat,pmt則必須處理*/printf(unknownpid!n);現(xiàn)在的問題是,編

16、碼的時候分配好的pid,在解碼的時候是怎么知道什么pid對應什么數(shù)據(jù)呢?這就是dvbsi表格的分析與處理了,請參考第三章.這里先看一個實際的ts碼流的例子.這里的數(shù)據(jù)是用ultraedit用16進制格式打開ts碼流文件得到的.文件是taiwan-551.ts.這里僅僅截取了3個packet的信息,請注意圖中用紅色標注的部分,這就是ts流packet的4個字節(jié)的頭信息.這個ts流是采用每個包共188字節(jié)的格式,因為兩個頭信息的間隔是188個字節(jié)(第一個0x47到第二個0x47的間隔).以后的所有的packet都將是188字節(jié)的格式,這是dvbts標準規(guī)定的固定大小.那么這三個包分別包含的是什么數(shù)

17、據(jù),下面我們可以自己分析一下.先看第一個包,頭信息數(shù)據(jù)是0x470x070xe50x12,剛才已經(jīng)知道了,header信息都是按位操作的(這就是為什么ts碼流也可以叫做位流的原因),特別要注意的是定義和傳輸?shù)臅r候都是msbfirst,也就是說,先出現(xiàn)的位是數(shù)據(jù)的最高位.先轉(zhuǎn)化成2進制格式:01000111000001111110010100010010請對照上面的packet_header結(jié)構(gòu):typedefstructunsignedsync_byte:8;unsignedtransport_error_indicator:1;unsignedpayload_unit_start_indic

18、ator:1;unsignedtransport_priority:1;unsignedpid:13;unsignedtransport_scrambling_control:2;unsignedadaptation_field_control:2;unsignedcontinuity_counter:4;packet_header;那么對照一下,我們可以發(fā)現(xiàn):sync_byte=01000111,就是0x47,這是dvbts規(guī)定的同步字節(jié),固定是0x47.transport_error_indicator=0,表示當前包沒有發(fā)生傳輸錯誤.payload_unit_start_indicato

19、r=0,含義請參考iso13818-1標準文檔transport_priority=0,表示當前包是低優(yōu)先級.pid=0011111100101即0x07e5,這代表是什么呢,暫時還不知道(實際上是videopid,參考下圖)transport_scrambling_control=00,表示節(jié)目沒有加密adaptation_field_control=01即0x01,具體含義請參考iso13818-1continuity_counte=0010即0x02,表示當前傳送的相同類型的包是第3個依此類推,再看一下第二個包0x470x070xe50x13,2進制是010001110000011111

20、10010100010011sync_byte=01000111,就是0x47,這是dvbts規(guī)定的同步字節(jié),固定是0x47.transport_error_indicator=0,表示當前包沒有發(fā)生傳輸錯誤.payload_unit_start_indicator=0,含義請參考iso13818-1標準文檔transport_priority=0,表示當前包是低優(yōu)先級.pid=0011111100101即0x07e5,這代表是什么呢,暫時還不知道(實際上是videopid,參考下圖)transport_scrambling_control=00,表示節(jié)目沒有加密adaptation_fiel

21、d_control=01即0x01,具體含義請參考iso13818-1continuity_counte=0011即0x03,表示當前傳送的相同類型的包是第4個(注意到了吧,以上兩個包的pid都是0x07e5,所以這里的continuity_counte就遞增一次)第三個包是0x470x070xf10x18,2進制是01000111000001111111000100011000.sync_byte=01000111,就是0x47,這是dvbts規(guī)定的同步字節(jié),固定是0x47.transport_error_indicator=0,表示當前包沒有發(fā)生傳輸錯誤.payload_unit_star

22、t_indicator=0,含義請參考iso13818-1標準文檔transport_priority=0,表示當前包是低優(yōu)先級.pid=0011111100101即0x07f1,這代表是什么呢,暫時還不知道(實際上是audiopid,參考下圖)transport_scrambling_control=00,表示節(jié)目沒有加密adaptation_field_control=01即0x01,具體含義請參考iso13818-1continuity_counte=1000即0x08,表示當前傳送的相同類型的包是第9個請看解碼程序讀取該文件的結(jié)果:上圖我們可以發(fā)現(xiàn),taiwan-551.ts有一個節(jié)目

23、叫dimo,它的videopid是0x07e5,audiopid是0x07e6還有一個節(jié)目叫service1,沒有videopid,它的audiopid是0x07f1(說明是一個廣播節(jié)目而非電視節(jié)目)這個數(shù)據(jù)剛好和我們剛才的分析是吻合的.但是我想大家還有疑問,為什么0x07e5代表videopid,0x07e6代表其中一個audiopid呢?這就是剛才提到的,這是ts流在編碼的時候就分配好了的.但是,在解碼的時候是怎么知道0x07e5就代表的是video而不是audio呢?這就是第三章的內(nèi)容:dvbsi/psi分析和處理.第三章dvbsi/psi分析和處理si是 specificinforma

24、tion的簡稱,psi是programspecificinformation該機制允許傳送各種各樣的訊息,比如節(jié)目名稱,電視臺名稱,各種,私有信息,甚至單獨傳送數(shù)據(jù)實現(xiàn)數(shù)據(jù)通信等這些功能的實現(xiàn)都歸功于si/psi.在 dvb標準中,定義了一個標準的pid用來實現(xiàn)si/psi.這些pid是系統(tǒng)保留的,因此編碼的時候并不會用這些做為videopid 或者audiopid或者其他在一個簡單的解復用程序中,只需要提供處理pat,pmt表格的程序即可實現(xiàn)解復用,當然如果需要更友好的界面和實現(xiàn)更復雜的功能(如)則必須處理其他的表在這里僅僅分析pat,pmt,sdt表格,其他si表格的分析,請參考 iso1

25、3818-1(mpeg-2系統(tǒng)層標準)和en300468(dvbsi標準)文檔dvb定義的si保留的pid分別是:上表格的pid就是保留的,分配的其他一定不會占用這些解復用程序需要使用到的表格只有pat,pmt,sdt,而應用還需要使用cat,epg應用還需要使用nit,eit,tdt,tot等表格.所以在需要解復用的時候,偽代碼需要這樣寫:voidprocess_packet(unsignedchar*buff)intpid=getpid(buff);if(pid=0x0000)/*這是pat表*/process_pat(buff+4);/*處理pa表*/elseif(pid=.)/*vid

26、eo或者audio*/else/*其他不支持的pid*/printf(unknownpid!);所有的表格都開始于packet中的184字節(jié)的數(shù)據(jù)部分,但有的時候一個表格沒有184字節(jié),這時在packet中就可能插入一些無效信息用來填充使整個packet依然保持是188字節(jié)也可能用頭信息中的payload_unit_start_indicator標志表格有個偏移位置(當payload_unit_start_indicator=0表示表格數(shù)據(jù)直接從packet區(qū)的第四個字節(jié)開始,否則表示有一個偏移量位置開始,具體請參考iso13818-1,第4字節(jié)到偏移量間的數(shù)據(jù)是系統(tǒng)填充的無效數(shù)據(jù))下面針對解

27、復用程序詳細分析一下pat,pmt和sdt三類表格的格式pat,programassociationtable,節(jié)目關(guān)聯(lián)表pat表攜帶以下信息:(1)ts流-transport_stream_id,該標志唯一的流(2)節(jié)目頻道號-program_number,該號碼標志流中的一個頻道,該頻道可以包含很多的節(jié)目(即可以包含多個videopid和audiopid)(3)pmt的pid-program_map_pid,表示本頻道使用的哪個pid做為pmt的,因為可以有很多的頻道,因此規(guī)定pmt的pid可以由用戶自己定義pat表定義如下:各字段含義如下:table_id:8bits,標志本表格的類型,

28、應該是0x00section_syntax_indicator:1bit,段語法標志,應該是10:固定的0,這是為了防止和iso13818video流格式中的控制字沖突而設置的reserved:保留的2bits,保留位一般都是0section_length:12bits的段大小,單位是bytes.transport_stream_id:16bits的當前流,內(nèi)唯一.(事實上很多都是自定義的tsid)version_number:5bits版本號碼,標注當前節(jié)目的版本這是個非常有用的參數(shù),當檢測到這個字段改變時,說明流中的節(jié)目已經(jīng)變化了,程序必須重新搜索節(jié)目current_next_indica

29、tor:1bit:當前還是未來使用標志符,一般情況下為0section_number:8bits當前段號碼last_section_number:8bits最后段號碼(section_number和last_section_number的功能是當pat內(nèi)容184字節(jié)時,pat表會分成多個段(sections),解復用程序必須在全部接收完成后再進行pat的分析)從for()開始,就是描述了當前流中的頻道數(shù)目(n),每一個頻道對應的pmtpid是什么解復用程序需要和上圖類似的循環(huán)來接收所有的頻道號碼和對應的pmtpid,并把這些信息在緩沖區(qū)中保存起來在后部的處理中需要使用到pmtpid.crc_3

30、2:本段的crc校驗值,一般是會忽略的n是一個變量,計算方法是n=(section_length-9)/4.從以上分析我們可以發(fā)現(xiàn),pat表主要包含頻道號碼和每一個頻道對應的pmt的pid號碼,這些信息我們在處理pat表格的時候會保存起來,以后會使用到這些數(shù)據(jù).例如我們可以定義這樣的數(shù)據(jù)結(jié)構(gòu)保存這些信息:typedefstructintchannel_number;/*頻道號*/intpmt_pid;/*對應channel_number頻道號的pmt的pid*/pmt_item;pmt_itempmt64;/*定義最多64個頻道,這個結(jié)構(gòu)在分析pat表格的時候會更新*/pmt,programm

31、aptable,節(jié)目影射表如果一個ts流中含有多個頻道,那么就會包含多個pid不同的pmt表.檢測是否pmt的偽代碼如下:voidprocess_packet(unsignedchar*buff)inti;intpid=getpid(buff);if(pid=0x0000)/*pat表格*/process_pat(buff+4);elseif(pid=.)/*videopid或者audiopid*/else/*在這里檢測pid是否是pmt的pid*/for(i=0;i64;i+)if(pid=pmti.pmt_pid)/*pid等于在pat檢測到的pmtpid相同*/process_pmt(b

32、uff+4);/*說明當前packet是pmt,進入處理*/break;pmt表中包含的數(shù)據(jù)如下:(1)當前頻道中包含的所有video數(shù)據(jù)的pid(2)當前頻道中包含的所有audio數(shù)據(jù)的pid(3)和當前頻道關(guān)聯(lián)在一起的其他數(shù)據(jù)的pid(如數(shù)字廣播,數(shù)據(jù)通訊等使用的pid)pmt定義如下:各字段含義如下:table_id:8bits的id,應該是0x02section_syntax_indicator:1bit的段語法標志,應該是10:固定是0,如果不是說明數(shù)據(jù)有錯.reserved:2bits保留位,應該是00section_length:16bits段長度,從program_number

33、開始,到crc_32(包含)的字節(jié)總數(shù).program_number:16bits的頻道號碼,表示當前的pmt關(guān)聯(lián)到的頻道.換句話就是說,當前描述的是program_number頻道的信息.reserved:2bits保留位,應該是00version_number:版本號碼,如果pmt內(nèi)容有更新,則version_number會遞增1通知解復用程序需要重新接收節(jié)目信息,否則version_number是固定不變的.current_next_indicator:當前未來標志符,一般是0section_number:當前段號碼last_section_number:最后段號碼,含義和pat中的對應

34、字段相同,請參考pat部分.reserved:3bits保留位,一般是000.pcr_pid:13bits的pcrpid,具體請參考iso13818-1,解復用程序不使用該參數(shù).reserved:4bits保留位,一般是0000program_info_length:節(jié)目信息長度(之后的是n個描述符結(jié)構(gòu),一般可以忽略掉,這個字段就代表描述符總的長度,單位是bytes)緊接著就是頻道內(nèi)部包含的節(jié)目類型和對應的pid號碼了.stream_type:8bits流類型,標志是video還是audio還是其他數(shù)據(jù).reserved:3bits保留位.elementary_pid:13bits對應的數(shù)據(jù)p

35、id號碼(如果stream_type是video,那么這個pid就是videopid,如果stream_type標志是audio,那么這個pid就是audiopid)reserved:4bits保留位.es_info_length:和program_info_length類似的信息長度(其后是n2個描述符號)crc_32:32bits段末尾是本段的crc校驗值,一般忽略.從以上的分析可以看出,只要我們處理了pmt,那么我們就可以獲取頻道中所有的pid信息,例如當前頻道包含多少個video,共多少個audio,和其他數(shù)據(jù),還能知道每種數(shù)據(jù)對應的pid分別是什么.這樣如果我們要選擇其中一個vide

36、o和audio收看,那么只需要把要收看的節(jié)目的videopid和audiopid保存起來,在處理packet的時候進行過濾即可實現(xiàn).比較全面實現(xiàn)解復用的偽代碼如下:intvideo_pid=0x07e5,audio_pid=0x07e6;/*一般是在pmt檢索后由用戶自己設置這兩個全局值*/voidprocess_packet(unsignedchar*buff)inti;intpid=getpid(buff);/*獲取當前packet的pid*/if(pid=0x0000)/*0x0000表示是pat*/process_pat(buff+4);elseif(pid=video_pid)/*和

37、video_pid相等,說明當前packet是一個videopacket*/savetovideobuffer(buff+4);/*保存到video緩沖區(qū)*/elseif(pid=audio_pid)/*和audio_pid相等,說明當前packet是一個audiopacket*/savetoaudiobuffer(buff+4);/*保存到audio緩沖區(qū)*/elsefor(i=0;i64;i+)if(pid=pmti.pmt_pid)process_pmt(buff+4);break;以上偽代碼可以實現(xiàn)基本的解復用:檢測所有的頻道,檢測所有stream的pid,選擇特定的節(jié)目進行播放.只要

38、讀取每個packet的188字節(jié)的內(nèi)容,然后每次都調(diào)用process_packet()即可實現(xiàn)簡單的解復用.介紹到這里,我們就可以總結(jié)一下dvb搜臺的原理了.(好!洗耳恭聽!)機頂盒先調(diào)整高頻頭到一個固定的頻率(如498mhz),如果此頻率有數(shù)字信號,則cofdm芯片(如mt352)會自動把ts流數(shù)據(jù)傳送給 mpeg-2decoder.mpeg-2decoder先進行數(shù)據(jù)的同步,也就是等待完整的packet的到來.然后循環(huán)查找是否出現(xiàn) pid=0x0000的packet,如果出現(xiàn)了,則馬上進入分析pat的處理,獲取了所有的pmt的pid.接著循環(huán)查找是否出現(xiàn)pmt,如果發(fā)現(xiàn)了,則自動進入pmt

39、分析,獲取該頻段所有的頻道數(shù)據(jù)并保存.如果沒有發(fā)現(xiàn)pat或者沒有發(fā)現(xiàn)pmt,說明該頻段沒有信號,進入下一個頻率掃描.從以上描述可以看出,機頂盒搜索頻率是隨機發(fā)生的,要使每次機頂盒都能搜索到信號,則要求ts流每隔一段時間就發(fā)送一次pat和pmt.事實上dvb傳輸系統(tǒng)就是這么做的.因此無論何時接入終端系統(tǒng),系統(tǒng)都能馬上搜索到節(jié)目并正確解復用實現(xiàn)播放.不僅僅如此,其他數(shù)據(jù)也都是交替?zhèn)魉偷?比如第一個packet可能是pat,第二個packet可能是pmt,而第三個packet可能是video1,第四個packet可能是video2,只要系統(tǒng)傳輸速度足夠快(就是稱之為碼率的東東),實現(xiàn)實時播放是沒有任

40、何問題的.到這里雖然實現(xiàn)了解復用,但可以看出,使用的pid都是枯燥的數(shù)字,如果調(diào)臺要用戶自己輸入數(shù)字那可是太麻煩了,而且還容易輸入錯誤,操作非常不直觀,即使做成一個菜單讓用戶選擇也是非常的呆板.針對這個問題,dvb系統(tǒng)提出了一個sdt表格,該表格標志一個節(jié)目的名稱,并且能和pmt中的pid聯(lián)系起來,這樣用戶就可以通過直接選擇節(jié)目名稱來選擇節(jié)目了.sdt,servicedescriptionsection,服務描述段sdt可以提供的信息包括:(1)該節(jié)目是否在播放中(2)該節(jié)目是否被加密(3)該節(jié)目的名稱sdt定義如下:各字段定義如下:table_id:8bits的id,可以是0x42,表示描述

41、的是當前流的信息,也可以是0x46,表示是其他流的信息(epg使用此參數(shù))section_syntax_indicator:段語法標志,一般是1reserved_future_used:2bits保留未來使用reserved:1bit保留位,防止控制字沖突,一般是0,也有可能是1section_length:12bits的段長度,單位是bytes,從transport_stream_id開始,到crc_32結(jié)束(包含)transport_stream_id:16bits當前描述的流idreserved:2bits保留位version_number:5bits的版本號碼,如果數(shù)據(jù)更新則此字段遞增

42、1current_next_indicator:當前未來標志,一般是0,表示當前馬上使用.original_netword_id:16bits的原始網(wǎng)絡id號reserved_future_use:8bits保留未來使用位接下來是n個節(jié)目信息的循環(huán):service_id:16bits的服務器id,實際上就是pmt段中的program_number.reserved_future_used:6bits保留未來使用位eit_schedule_flag:1bit的eit信息,1表示當前流實現(xiàn)了該節(jié)目的eit傳送eit_present_following_flag:1bits的eit信息,1表示當前流

43、實現(xiàn)了該節(jié)目的eit傳送running_status:3bits的運行狀態(tài)信息:1-還未播放2-幾分鐘后馬上開始,3-被暫停播出,4-正在播放,其他-保留free_ca_mode:1bits的加密信息,1表示該節(jié)目被加密.緊接著的是描述符,一般是servicedescriptor,分析此描述符可以獲取servive_id指定的節(jié)目的節(jié)目名稱.具體格式請參考en300468中的servicedescriptor部分.分析完畢,則節(jié)目名稱和節(jié)目號碼已經(jīng)聯(lián)系起來了.機頂盒程序就可以用這些節(jié)目名稱代替pid讓用戶選擇,從而實現(xiàn)比較友好的用戶界面!下面參考一下中的界面和顯示信息.上圖是打開三個不同的碼流

44、文件(*.ts)形成的pid信息和節(jié)目名稱.用戶可以通過切換節(jié)目名稱的下拉列表框切換節(jié)目,也可以通過視頻流和音頻流下拉列表框切換video和audio!這些數(shù)據(jù)都是通過分析 pat,pmt和sdt得到的.第四章teletext原理歐洲采用的teletext標準叫做itu-rsystembteletext,標準文檔是en300472和en300706.該標準支持以下特性:(1)24x40的文本字符顯示,也支持簡單的圖象信息的顯示.(2)支持多頁碼,應用程序可以自由切換到任意選定的頁.(3)支持多語言,可以在teletext中指定所使用的語言.(4)文本支持自定義背景色,自定義前景色.支持長度,寬

45、度加倍(doublewidth,doubleheight)(5)所有數(shù)據(jù)采用了奇偶校驗和漢明碼編碼,具有比較強的錯誤處理功能.(6)格式基本兼容模擬ttx,支持vbi插入teletext數(shù)據(jù).teletext數(shù)據(jù)是在ts流中和video,audio數(shù)據(jù)一起傳送的.en300472規(guī)定采用以下方法識別teletext數(shù)據(jù)的pid:如果pmt段中的stream_type=0xbd(private_stream_1),那么這個數(shù)據(jù)流就是teletext或者subtitle數(shù)據(jù)(統(tǒng)稱為 vbi數(shù)據(jù),具體區(qū)分還需要在teletext分析中處理),vbi數(shù)據(jù)開始于pes包的數(shù)據(jù)部分.teletext在pe

46、s包中的格式如下:各字段含義:data_identifier:數(shù)據(jù)標志符,如果是teletext必須等于0x100x1f.data_unit_id:用來標志是teletext數(shù)據(jù)還是subtitle數(shù)據(jù).0x02表示是teletext,0x03表示是subtitle.data_field()是標準的teletext格式的數(shù)據(jù)包,參考下圖.實際上,一個data_field就是teletext的一行數(shù)據(jù).data_field()的格式如下:各字段含義如下:reserved_future_use:2bits保留未來使用field_parity:1bit的奇偶標志,1表示是偶數(shù)場(下半場),0表示奇數(shù)

47、場(上半場)line_offset:5bits,在vbi插入時指定的場線數(shù)據(jù).(以上兩個參數(shù)在使用vbi硬件插入才需要使用)framing_code:8bits的幀同步代碼,必須是0xe4.magazine_and_packet_address:16bits,指定當前傳送的雜志號碼和包號碼,采用的是漢明8/4編碼.其中的包號碼(packetaddress)實際上代表的是ttx頁面的行號碼(0-24).data_block:320bits,40bytes的數(shù)據(jù)塊,全部采用奇偶校驗,對應ttx頁面的40列,范圍是0x00-0x7f(最高位是奇偶校驗位).把這部分的數(shù)據(jù)全部提取出來,就可以獲得一個行

48、的全部數(shù)據(jù)(ttx是24行x40列).因此,解teletext的軟件一般采用這樣的流程:(1)分析pmt表,獲取代表teletext的pid,標注為ttx_pid;(2)在解復用程序中過濾pid=ttx_pid的數(shù)據(jù),解出pes的數(shù)據(jù)部分.(3)把第二步得到的數(shù)據(jù)部分全部保存到一個緩沖區(qū),直到所有的數(shù)據(jù)全部緩沖完畢.(4)解出packetaddress,該數(shù)據(jù)代表當前的行號(0-24).如果是0,則本個datablock包含的是主頁面代碼和子頁面代碼.如果不是0(1-24),則說明datablock是對應頁的列數(shù)據(jù)(40個字節(jié)的ascii),把這些數(shù)據(jù)解出保存到緩沖區(qū).(這里必須和pid過濾一

49、樣,過濾主頁面號碼和子頁面號碼,即沒有選擇的頁面忽略掉)(5)循環(huán)第(4)步直到所有的列數(shù)據(jù)全部解出.(6)把緩沖區(qū)中的24x40的數(shù)據(jù)顯示出來.一般是在ram中定義一個unsignedcharttx_data2440數(shù)組保存.teletext是如何支持自定義前景色和背景色等特性的呢?實際上非常簡單,就包含在每一行數(shù)據(jù)的40個字節(jié)中.我們知道可顯示ascii的范圍是0x200x7f,小于0x20的代碼在teletext中做為控制字符(需要在顯示程序中處理),具體規(guī)定如下:0x00-0x07:設置前景色,顏色分別是黑,紅,綠,黃,藍,洋青,洋藍,白(設置后生效,也就是說,顯示程序遇到這些代碼,在

50、隨后的顯示中必須改變前景色到對應的顏色)0x08:開始閃爍功能,設置后生效.0x09:結(jié)束閃爍功能,設置后生效0x0a:box結(jié)束,設置后生效.0x0b:box開始,設置后生效.0x0c:正常象素大小,設置后生效.0x0d:寬度加倍,設置后生效.0x0e:長度加倍,設置后生效.0x0f:寬度和長度都加倍,設置后生效.0x10-0x17:設置馬塞克顏色,顏色代碼同0x00-0x07,設置后生效.0x18:以后固定是顯示空,直到遇到其他顏色屬性.設置后生效.0x19-0x1b:請參考en300706標準.0x1c:設置黑背景色.設置后馬上生效.0x1d:設置新的背景色,下一個字符指定背景顏色,代碼

51、同0x0-0x07.0x1e:保持馬塞克功能,設置后生效.0x1f:取消馬塞克功能,設置后生效.以上所描述的控制字符作用范圍僅僅是一行.也就是說如果遇到新行,則設置全部恢復默認設置,ebuteletext的默認設置是:黑背景色,白前景色, 無閃爍,無box,正常的象素大小,無任何馬塞克功能.因此,teletext的顯示程序必須一個字符一個字符的分析數(shù)據(jù),直到所有的數(shù)據(jù)全部顯示完畢.實際上,ebuteletext使用了4個規(guī)格,包括v1.0,v1.5,v2.5,v3.5.v1.0只支持ascii文本和基本屬性,其他規(guī)格還支持簡單圖象和objects,請參考en300706獲取更多的信息.ebut

52、eletext格式使用了漢明編碼方法,具體編碼格式請參考en300706.下面可以參考一下中處理teletext的效果:(1)菜單上的數(shù)字是主頁面,下一級菜單是子頁面:(2)teletext文字疊加在video上的透明顯示效果:(3)teletext文字疊加在video上不透明的顯示效果:(4)切換到其他頁面的顯示效果:第五章epg原理epg就是 電子節(jié)目指南,相當于一個節(jié)目菜單的功能.在一個ts流中,可以提供當前流的所有信息,如頻率,調(diào)制方式,頻道號,所有節(jié)目的pid,名稱等信息,也可以根據(jù)需要提供其他相關(guān)聯(lián)的ts流(例如同一電視臺同步播放的其他頻率的節(jié)目信息)的信息.解碼器接收這些信息,形

53、成一個固定格式的菜單讓用戶選擇需要收看的頻道或節(jié)目,這就是epg.不僅如此,epg還可以對節(jié)目進行分類,比如節(jié)目可以是電影,也可以是新聞,這樣,把屬于電影的節(jié)目歸在一起,把屬于新聞的節(jié)目歸在一起,這樣對用戶來說檢索節(jié)目就變得非常的方便.epg的實現(xiàn)也歸功于dvb的si信息.和epg功能相關(guān)的si有nit(網(wǎng)絡信息表),eit(環(huán)境信息表),sdt(服務描述表),bat(群組關(guān)聯(lián)表),tdt(日期時間表)和tot(時間偏移表).下面簡單分析這些表所攜帶的信息.nit,networkinformationtable,網(wǎng)絡信息表nit提供如網(wǎng)絡名稱(相當于電視臺名稱),傳輸參數(shù)(如頻率,調(diào)制方式等).這個表格一般是解碼器內(nèi)部使用的數(shù)據(jù),當然也可以做為epg的一個顯示數(shù)據(jù)提供給用戶做為參考.nit格式如下:各字段含義如下:table_id:8bits標志,應該是0x40或0x41.當table_id=0x40時候,這個nit描述的是當前流的網(wǎng)絡信息,否則描述的是其他流的網(wǎng)絡信息(一般是電視

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論