TS視頻知識基礎_第1頁
TS視頻知識基礎_第2頁
TS視頻知識基礎_第3頁
TS視頻知識基礎_第4頁
TS視頻知識基礎_第5頁
已閱讀5頁,還剩5頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、視頻知識基礎:什么是ts、ps流2010-07-28 09:42在mpeg-2系統(tǒng)中,信息復合/分離的過 程稱為系統(tǒng)復接/分接,由視頻,咅頻的es流和輔助數(shù)據(jù)復接生成的用于實際傳輸?shù)臉藴市?息流稱為mpeg-2傳送流(ts: transportstream)0據(jù)傳輸媒體的質量不同,mpeg-2中定 義了兩種復合信息流:傳送流(ts)和節(jié)目流(ps: programstrearn) ts流與ps流的區(qū)別 在于ts流的包結構是固定長度的,而ps流的包結構是可變長度的。ps包與ts包在結構上的這種差界,導致了它們對傳輸誤碼貝有不同的抵抗能力,因而應用 的環(huán)境也冇所不同。ts碼流由于采用了固定長度的包

2、結構,當傳輸誤碼破壞了某一 ts包的 同步信息時,接收機可在同定的位置檢測它示血包屮的同步信息,從而恢復同步,避免了信 息丟失。而ps包山于長度是變化的,一旦某一 ps包的同步信息丟失,接收機無法確定下一 包的同步位置,就會造成失步,導致嚴重的信息丟失。因此,在信道環(huán)境較為惡劣,傳輸 誤碼較高時,一般采用ts碼流;而在信道環(huán)境較好,傳輸誤碼較低時,一般采用ps碼流如 dvd等等。由于ts碼流具冇較強的抵抗傳輸誤碼的能力,因此冃前在傳輸媒體中進行傳輸 的mpeg-2碼流基木上都采用了 ts碼流。ts/pes是mpeg定義的標準格式,無論是mpeg1還是mpeg2都給出了包含比特流句法在內的 定義

3、,我們所說的ts/ps都是在這里定義的。因此談到ts/ps時仍然離不了 mpeg,雖然avs 及ip的數(shù)據(jù)也吋以封裝在ts中,因為mpeg中給ts/pes的定義中允許封裝其他數(shù)據(jù)。雖然也許可以不經(jīng)改變的將不同編碼格式的碼流經(jīng)由ts/ps傳送,但這事實上這是對mpeg 的利用或擴充。通常情況下,封裝不同類型數(shù)據(jù)的時候我們需要在ts/pes添加標準的(如果 有的話)或口定義的描述,并且在有些情況下原則上必須使用mpeg已經(jīng)定義的特殊描述, ts/pes并非總是透明的。簡單說就是ps流(主要用在dvd上)如是中間丟了一斷碼流,后面的都沒法播了;而ts流 (dvb-t, dmb-th等)如果斷了碼流,

4、后面的隨時可以再開始解碼怎么看都行。ps流:dvd節(jié)目中的mpeg2格式,是mpeg2-ps,全稱是program stream,簡稱ps流。ts的全稱則 是transport stream。mpeg2-ps主要應用于存儲的具有固定時長的節(jié)目,如dvd電影,而 mpeg-ts則主要應用于實時傳送的節(jié)目,比如實時廣播的電視節(jié)目。這兩種格式的主要區(qū)別是什么呢?你將dvd上的vob文件的前面一截剪掉(或者t脆就是數(shù) 據(jù)損壞),那么就會導致整個文件無法解碼,而電視節(jié)口是你任何吋候打開電視機都能解碼 (收看)的,所以,mpeg2-ts格式的特點就是要求從視頻流的任一片段開始都是可以獨立 解碼的。ts流:

5、 ts流是由很多不同種類的包所組成的,這些數(shù)據(jù)包都是188個字節(jié)人小,這188個字節(jié)包含 兩部分,包頭和負載,包頭包括同步信息,包信息等等,而負載則是傳輸?shù)臄?shù)據(jù),而這些負載則 可以組成pes流或者私有流等等數(shù)據(jù)流.舉例說,一個ts流包括100個包,其中psi信息包占20個,pes數(shù)據(jù)包80個,此ts流中只冇 一套廿目流,不含有私有流,所以從這80個pes包屮的負載連接在一起,就是2個pes流(視 頻,音頻),如果每個pes包的負載長度為100字節(jié),則這兩個pes流一共長度為8000個字節(jié).假設其中視頻的prs流長度為6000字節(jié).則視頻的6000字節(jié)的pes流,是由pes包組成 的.pes包沒

6、有固定的長度,而是由包頭部的數(shù)據(jù)給出.而ps也是類似ts流分解的方式,逆向 的lilpes包封裝成包,其中要添加packet_head, system_head等信息.所以上次所做的程序, 并不是ts->ps的轉換,而是從一個復雜的ts流屮,過濾去一套節(jié)冃,構造出一個簡單的ts 流的過程.mpeg-ts, mpeg-ps 的轉換mpeg2文件都是以數(shù)據(jù)包傳遞的,同樣都是188個字節(jié)為一個包,但是作為傳輸流和節(jié)目流, 包的組織結構還是不太一樣的,作為傳輸流來說,其包含的包的種類比較多(其實不是包的 種類,而是包含不同用途的數(shù)據(jù)的種類比較多),比如有ptd為0x0000的pat, ett,

7、tdt, tot, 還冇pmt,等等 不同的表或包.而節(jié)冃流所包含的就比較少,只要包含pat, pmt,以及包含音 頻,視頻的pes包就可以了.所以在ts, ps的轉換中,ts->ps的轉換比較簡單,只耍去掉相對 沒有作用的包,在修改一下pat, pmt表就可以了.例如現(xiàn)在我所做的dvb-t的mpeg2存儲,就是先得到mpeg2壓縮的數(shù)據(jù)包(完整的包,包含同 步等等所侑信息,共188個字節(jié)),其屮包含咅頻,視頻兩種數(shù)據(jù)包(兩者以pid不同,相區(qū)分). 那么作為ps流存儲時,就要虛構出新的pat, pmt表假如到ps流中,-其中pat, pmt中需要修改 的就是pmt中指向音頻,視頻流的p

8、id值必須是要存儲的音頻,視頻數(shù)據(jù)包的pid.這樣就完 成了 ts-ps的轉換.簡言z:先對ts進行過濾,保留要存儲的節(jié)口所對應的音頻,視頻流,刪除所有其他的包.然 麻虛構一個新的pat, pmt表,其中咅頻,視頻流的指針必須指向存儲的咅,視頻流的ptd.這樣 就完成了轉換.問題:1.音頻,視頻同步問題,這兩個包應該以什么樣的比例交叉?zhèn)鬏斈?也就是多少個視頻 包中間發(fā)送一個音頻包呢?如果這個比例控制不好,那么就容易造成音,視頻不同步.2. 對于我們所虛構的pat, pmt表應該以什么樣的頻率發(fā)送呢?也就是說發(fā)送多少pes包后, 發(fā)送一次psi包呢?這個問題似乎影響不大.好象還沒有出現(xiàn)播放吋的問

9、題.3. 我現(xiàn)在所采用的這種做法,雖然解決了存儲,然后播放的問題,但是似乎并沒有實現(xiàn) ts->ps的轉換,實現(xiàn)的是對ts流的過濾,即是把一個含有多套節(jié)0的ts流,轉換成一個只含 有一套節(jié)目的ts流,不知道這樣說對不對?4. 還有一個主要問題就是對于ts流小傳輸pes信息的包來說,其負載信息屮的數(shù)據(jù),如何組 成pes流的呢?應該是通過包頭部分的控制信息來明確的,還的好好看看文檔.數(shù)字電視與傳統(tǒng)模擬電視節(jié)目選擇的方式完全不同,傳統(tǒng)電視的每一個頻道對應一個節(jié)目, 只要調到相應的頻率,就可以看到節(jié)目。而在數(shù)字電視信號屮,-路碼流對應多路節(jié)目, 使用復用技術就可以做到了。一個物理的頻道只能給出包含

10、多路節(jié)目的一路傳輸流。要觀看 其中的某一路節(jié)冃,還必須從該傳輸流中提取出該路節(jié)冃的壓縮包,然后再進行解碼。所 以怎樣從眾多的傳輸流中,選中一路節(jié)f1播放,就變得很復雜。在mpeg-2的傳輸流 (transport stream)中,節(jié)目專用信息 psi (program specific information),就是規(guī)定 不同節(jié)冃和節(jié)冃中的不同成分如何復用成一個統(tǒng)一的碼流。以pst為基礎可以提供一個碼流 的構成,從而幫助用戶對節(jié)目進行選擇。dvb屮的服務信息si (service information)則對 此進行了進-步的擴展,加入了一些對用戶有用的信息,標示節(jié)目的類型,服務商,節(jié)目的

11、相互關系等。正確的了解mpeg-2的psi以及dvb的si的結構,及其在節(jié)冃組織,選擇中的 應用,可以正確理解service information在dvb解碼中的地位。對于我們做好対數(shù)了節(jié)目 的復用,也能起到幫助作用。1 mpeg-2 ts 中的 psips1信息主要包括以下的表:pat (program association table):節(jié)目群叢表,該表的pid是固定的0x0000,它的 主要作用是指出該傳輸流id,以及該路傳輸流屮所對應的幾路節(jié)目流的map表和網(wǎng)絡信息 表的ptdopmt (program map table):節(jié)目映射表,該表的pid是由pat提供給出的。通過該表可

12、 以得到一路節(jié)目中包含的信息,例如,該路節(jié)目山哪些流構成和這些流的類型(視頻,音頻, 數(shù)據(jù)),指定節(jié)目中各流對應的pid,以及該節(jié)目的pcr所對應的p1d。ntt (network information table):網(wǎng)絡信息表,該表的pid是由pat提供給出的。nit 的作用主要是對多路傳輸流的識別,nit提供多路傳輸流,物理網(wǎng)絡及網(wǎng)絡傳輸?shù)南嚓P的一 些信息,如用于調諧的頻率信息以及編碼方式。調制方式等參數(shù)方而的信息。cat (conditional access table):條件訪問表,pid 0x0001。除了上述的兒種表外,mpcg-2還提供了私有字段,用于實現(xiàn)對mpeg-2的擴充

13、。2 dvb中的stmpeg-2的pst中提供了不少的相關節(jié)目組成和相互關系的信息,從而使得在接收端可以正 確的對多路傳輸流進行分解。但是這些信息在實際使用時仍顯得不夠,為此在dvb中采用 si對psi信息進行了進一步的擴展。除了在ps1中的信息之外,dvb還定義了一些其他的一些表。si的主耍用途有:根據(jù)nit, pat, pmt等信息可以進行自動的頻道調諧;b、更方便的對節(jié)目進行選擇和定位;c 實現(xiàn)電 了節(jié)目指南 epg (electronic program guide),等等。ps1屮的信息基本上都是與當前碼流相關的,即它們所涉及的內容都與當前碼流小的部分信 息相關。與psi不同的是,s

14、i的信息可以包括不在當前碼流中的一些服務和事件,允許用 八進行更多的選擇和了解更多的英他服務信息。dvb規(guī)定攜帶s1信息的傳輸包必須用指定的p1d,指定的p1d如下表:table typepid valuepat0x0000cat0x0001tsdt0x0002reserved0x0003 to oxooofnit, st0x0010sdt, bat, st0x0011e1t, st0x0012rst, st0x0013tdt, tot, st0x0014network synchroniztion0x0015reserved for future use0x0016 to 0x001binb

15、and signaling0x001cmeasurement 0x00 iddit0x001esit 0x00if在該表中可以看到同一個ptd可以對應不同的表,要把這樣的表區(qū)分開來,需要進一步找到 tableld進行識別。tableld表如下:value description0x00 program association section0x01 conditioneil access section0x02 program map sect i on0x03 transport_stream_description_section0x04 to 0x3f reserved0x40 netw

16、ork information section-actual nctwork0x41 network information section-other network0x42 servicedescriptionsection-actual transport_stream0x43 to 0x45 reserved for future use0x46 service_description_section-other_transport_stream0x47 to 0x49 reserved for future use 0x4a bouquet association section0x

17、4b to 0x4d reserved for future use0x4e evenl_information_scction-actual_transport_strcam, p/f0x4f event_informati on section-other tmnsport streani,p/f0x50 to 0x5f event_information_section-actuql_tmnsport_stre0nb schedule0x60 to 0x6f event_infonnation_section-other_tnmsport_streanb schedule0x70 tim

18、e_data_section0x71 running_status_section0x72 stuffing section0x73 time offset sect i on0x74 to 0x7d reserved for future use0x7e discontinuity_information_section0x7f selection_information_section0x80 to oxfe user definedoxff reserved冇了這兩個td我們nj以在碼流中找到我們想要的任何一張表。si主要包括以下一些信息表:nit (network informatio

19、n table): nit的作用主要是對多路傳輸流的識別,nit 提供多路傳輸流,物理網(wǎng)絡及網(wǎng)絡傳輸?shù)南嚓P的一些信息,如用于調諧的頻率信息以 及編碼方式。調制方式等參數(shù)方面的信息。根據(jù)此信息設置ird (integrated receiver decoder)可以進行多路傳輸流z間的切換。sdt (service description table):用于描述系統(tǒng)中各路節(jié)目的名稱,該節(jié)目的提 供者,是否有相應的吋間描述表等方而的信息。該表可以描述當前傳輸流,也可以描 述其他的傳輸流,這由tableld進行區(qū)分。ett (event information table):該表示對某路節(jié)目的更進一

20、步的描述。它提供 事件的的名稱,開始時間,時間長度,運行狀態(tài)等。tdt (time and data table):該表提供當前的時間信息,該表用來對ird的解碼 吋鐘進行更新bat (bouquet association table):該表提供一-系列類似節(jié)目的集合。這些節(jié)目 可以不在同一個傳輸流中,利用該表可以很方便的進行相關節(jié)u或某一類節(jié)h的瀏覽 和選擇。rst (running status table):該表提供某一具體事件的的運行狀態(tài),可用于按時 自動的切換到指定的事件tot (time offset table):該表提供當?shù)貢r間與tdt之間的關系,該表與tdt 配合使用。ts

21、dt (transport stream description table): |l| ptd0x0002 標識,提供傳輸流的一 些參數(shù).st (stuffing table):該表表明其內容是無效的,只是作為填充字節(jié)。那么,我們如何運用dvb中的s1信息表呢?dvb si的使用1、網(wǎng)絡信息表(nit)網(wǎng)絡信息表捉供一紐傳輸流以及相應的調諧信息。n1t在ird (整合接收解碼器)啟動程序 屮用到,并且調諧信息可以存儲到不變的存儲器屮。nit述可以用來標志調諧信息的變化。 nit遵從如下規(guī)定:紙當前的傳輸系統(tǒng)必須包含nit。b、當且僅當nit包含可用的傳輸系統(tǒng)描述符,當前傳輸系統(tǒng)才是有效的。這

22、就指定了 ntt 包含冇效信息的條件。在一些廣播傳輸系統(tǒng)邊界,ts中的nit也被允許用來描述廣播頻道 屮的早期的網(wǎng)絡。ird不得不選擇一個不同的機制來獲得當前傳輸系統(tǒng)的相應的調諧信息。 例如,一個衛(wèi)星ird接受到當前傳輸系統(tǒng)的一個衛(wèi)星傳輸系統(tǒng)描述符,那么這個描述符被視 為有效,如果一個電纜ird接收到當前傳輸系統(tǒng)的一個電纜傳輸系統(tǒng)描述符也是有效的,但 是,如果電纜ird接收到當前傳輸系統(tǒng)的一個衛(wèi)星傳輸系統(tǒng)描述符,那么這個描述符對于這 個i rd就是無效的。c、如果當前傳輸系統(tǒng)一個有效的nit在si比特流中出現(xiàn),那么這個nit應當列出當前傳輸 系統(tǒng)中所有的tsod、st流每10秒鐘應當至少包含8

23、個ts包來傳輸ntt或者空包。這個規(guī)定簡化了廣播傳輸 邊界屮nit的復位(replacement )o使用這樣的復位機制,使得木地頻率控制使用低廉設備 成為可能。si使用兩個標志來描述傳輸系統(tǒng)。它們分別是network id和original network id。后者 用來作為一個ts中的一個服務的唯一標志符,即使這個ts被傳送到了其他的傳輸系統(tǒng)之中。 一個 ts 可以被 path: original_network_id/transport_stream_i d 一標識。一個服務可 以被 path: original_network_id/transport_stream_id/servi

24、ce_id 唯一標識。顯然, network_id不在這個path之內。另外,每個original_network_id中都有不同的 service.ido當一個服務(同一個ts內)被傳送到另一個傳輸系統(tǒng)后,只有network_id 改變了,original network id 不受影響。下面舉個例了,考慮如下情況:有兩個服務(a和b),它們源于兩個不同的傳輸系統(tǒng)并r碰 巧有相同的service_id和transport_stream_id,它們被傳輸?shù)揭粋€新的傳輸系統(tǒng)。在這個例子中,這兩個服務被安排在新network中的不同的ts中。如果這兩個服務被放在 同一個ts中,那么必須修改服務的i

25、d號,因為在同一個ts中_個service_id不能夠分配 給多個服務,并且一個ts僅僅可以對應一個original_network_ido2、bat信息bat提供一組服務,這些服務提供了一個基礎,ird在這些基礎z上向用戶展示有效的服務。 bat的傳輸是可選的。下而的規(guī)則提髙了 s1比特流的連貫性并且簡化了 1rd的工作。s1比特流應當在每個bat子表中列出集錦的所有服務。注意:一個服務可以屬于多個bouqueto這一規(guī)定使得trd可以通過不同的ts得到一個服 務。如果ird將bouquet中服務信息提供給用戶,那么列在bouquet中的服務就得到保證,否則 一些服務將會丟失。一個bouqu

26、et可以把不同網(wǎng)絡傳輸?shù)亩鄠€ts屮的服務集屮起來。如果 bat中所有服務都被列在sdt中,1rd對bouquet '|所有服務信息的訪問將會變得容易。同 樣的,如果nit信息給出所有ts中service的容量,ird對service的訪問將會變得容易。3、sdt信息sdt用來羅列ts中service的名稱以及其他參數(shù)。每一個ts中都有一個獨立的sdt子表。 為了提高對service的采集,定義了下列規(guī)則: 強制傳輸當前ts的sdt。sdt列出的si比特流至少包括ts中所有服務。另外:當前ts (例如table_id=0x46)中sdt描述其他ts時,應當列出這個ts的所有service

27、。 強烈推薦service_id,在f network屮一旦把一個service_id分配給了一個特定的服務, 那么這個service_id將不再變化,以便于i rd實現(xiàn)收藏頻道列表z類的功能。4、eit信息事件信息表用來傳遞當前的,將來的英至更遠的未來的事件的信息。每個service都有白己 獨立的eit子表。4. 1 eit present/fol lowing 信息(一下簡稱 eit p/f)卜列規(guī)則簡化了 eit p/f信息的獲得。st規(guī)范規(guī)定ett段最大部超過4096字節(jié)。s1 流中的每個 service 都有兩段來描述 eit present/following, section_

28、number 0x00 用 來描述當前事件,section_number 0x01描述下一個事件。這些約束不適用于nv0d引用的 service,這些service在每段中可能有多個事件描述,并且在eit present/eol lowing中 可能有更多的段。推薦提供事件描述event.id的升序排列。在一個section中,st可以用最多4096個字節(jié)來描述一個單獨的事件。対于當前事件有如下規(guī)定:a同一時刻最多只有一個當前事件。b、當存在一個當前事件時,該事件應當被描述在eit prcsent/following的sectiono中。c、當前事件中的running_status應當被給出。

29、如下表:e、在同一時刻,最多有一個following event。f、如果 following event 存在,該事件應當在 ett present/fol lowing 的 sectionl 中。g、如果 following event 不存在,則傳輸一個 sectionl 為空的 eit present/followingoh、following event running_status 應當給出,如下表:事件的持續(xù)吋間和eit持續(xù)時間一樣,必須包含事件被置為“not running"或者“pausing”。 事件的開始時間和eit start_time 樣,應當是整個事件的開

30、始時間,而不是從pause恢 復后的時間。注意:一個事件的開始時間加上它的持續(xù)時間可能比following event的開始時間要小。換 句話說,允許事件之間有間隔。在這種情況下,following event被看作是間隔后的事件。 這個事件應當編在eit present/following的sectionl中。注意:開始時間和持續(xù)時間都是預定的。一些廣播服務提供商可能會更新這些信息。而另一 些則更愿意保持開始時間不變。例如為了避免名為“8點新聞”的事件被誤解,把信息中的 開始時間從8: 01: 23改為8: 00: 00o4.2 eit schedule 信息1) eit schedule

31、結構遵從如下規(guī)則:a、eit/schedule 分配了 16 個 tablejd, 0x500x5f 給當前 ts, 0x600x6f 給其它 ts,這 些id按照時間順序排列;b、子表下的 256 個 section 被分為 32 段(segment),每 8 個 section 一個段(segment ) segment# 1,從 sectiono 到 7, segment#2,從 sections 到 15,等等;c、每段包含三個小吋內開始的事件信息;d、段內事件信息按照時間排列;e、如果一個段(segment)有n節(jié)(section),而nf、如果段中有節(jié)的話,段的 segment_l

32、ast_section_number 應當有值 so + 7;g、完全空的段通過空節(jié)(不含任何loop over事件)表示,段的 vsegment last section number 值為 s0 + 0;h、段中事件的安排遵從一個時間t0ot0 是通用時間坐標(universal time coordinated (utc)的 ulast midnight”。舉個例了: utc-6的下午5點,就是utc-0的下午11點,即從“l(fā)ast midnight"算起23 小時。因此對于utc-6, 10就是前一天的下午6點;i、table.id 0x50 (對其它ts是0x60)的第0段

33、,包含從午夜(utc時間)到“今天” 02: 59: 59 (utc時間)(三個小時)的事件信息。第1段包含從03: 00: 00到05: 59: 59 (utc 時間)的事件信息,依此類推。這就意味著,第一個了表包含從“今天” utc午夜時間算起 前4天的信息:j、1 ast_section number用來指明子表的結束位置;k、last_table_id用來指明整個eit/schedule結構的結束位置;l、與過去事件相關的段可以用空段代替,參見g規(guī)則;m、eit/schedule包含的事件定義中的running_status應當設為"為定義”即0x00;n、eit/sched

34、ule表不適用于nvod涉及的服務,因為這些服務帶有未定義開始吋間的事件;2) ett加密ett schedule表格可以被加密。為了與條件接入相聯(lián)系,必須分配一個service_id( =mpeg-2 program_number)來描述加密的 eit schedule tables,這個 service_id 在 psi 中。eit 在pmt中定義,service_id看成由一個private stream組成的各種電視節(jié)目(the eit is identified in the program map table (pmt) section for this service id as

35、 a programme consisting of one private stream), pmt 包含一個或多個 ca descriptor 來驗證相關的 ca碼流。為達到這個冃的,在dvb應用程序中servicejd的值oxffff被保留。pat、pmt、sdt詳解2010年06月22日星期二12:24下面針對解復用程序詳細分析一下 pat, pmt和sdt三類表格的格式.pat, program association table,節(jié)目關聯(lián)表pat表攜 帶以下信息:(1) ts 流 i d transport_stream_id,該 i d標志唯一的流 i d(2) 節(jié)fi頻道號一p

36、rogram_number,該號碼標志t s流中的一個頻道,該頻道吋以包含很多 的節(jié)目(即可以包含多個video pid和audio p1d)(3) pmt的pid- program _map_pld,表示本頻道使用的哪個pid做為pmt的p i d,因為 可以冇很多的頻道,因此d v b規(guī)定pmt的pid可以由用戶自己定義.pat表定義如下:各 字段含義如下:tablejd:8 bits,標志本表格的類型,應該是0x00 section_syntax_indicator: 1 bit,段語法標志,應該是t'' '' 0'':固定的'&#

37、39;0',,這是為 了防止和is013818video流格式屮的控制字沖突而設置的.reserved:保留的2bits,保留 位一般都是'0''section length: 12bits 的段大小,單位是 bytes, transport stream id: 16bits 的當前流 i d , dvb內唯一(事實上很多都是白定義的ts id) version_number:5bits版本號碼, 標注當前節(jié)目的版木.這是個非常有用的參數(shù),當檢測到這個字段改變時,說明ts流屮的 節(jié)目己經(jīng)變化了,程序必須重新搜索節(jié)目.current_ncxt_indicator

38、: lbit:當前還是未來 使用標,忐符,一般情況下為0'' section_number: 8bits當前段號碼 1 ast section_number :8bits 最后段號碼(sect i on_number 和 1 ast sect i on number 的功能 是當pat內容184字節(jié)時,pat表會分成多個段(sections),解復用程序必須在全部接 收完 成示再進行pat的分析)從for()開始,就是描述了當前流屮的頻道數(shù)目(n),每一個頻道對 應的put pid是什么.解復用程序需要和上圖類似的循環(huán)來接收所冇的頻道號碼和對應的 pmt pid,并把這些信息在

39、緩沖區(qū)中保存起來.在后部的處理中需婆使用到pmt pid. crc_32: 木段的crc校驗值,一般是會忽略的.n是一個變最,計算方法是n二(sectionength-9)/4. 從以上分析我們可以發(fā)現(xiàn),pat表主要包含頻道號碼和每一個頻道對應的pmt的pid號碼,這 些信息我們在處理pat表格的時候會保存起來,以后會使用到這些數(shù)據(jù).例如我們可以定義 這樣的數(shù)據(jù)結構保存這些信息:typedef struct int channel_number; int pmt_pid; pmt_item; pmt_item pmt 64; pmt, program map table,節(jié)目影射表 如果一個

40、ts流中含有多個頻道, 那么就會包含多個pid不同的pmt表.檢測是否pmt的偽代碼如下: void process packet(unsigned char*buff) int i; int ptd=getptd(buff); if(ptd=0x0000) process_pat(buff+4); else if(ptd=) else for(i=0;i<64;i+) if (pldpmt i. pmt_pid) process_pmt(buff+4) ; break; pmt表中包含的數(shù)據(jù)如卞:(1)當前頻道中包含的所有video數(shù)據(jù)的ptd (2)當前頻道中包 含的所冇audio數(shù)

41、據(jù)的ptd (3)和當前頻道關聯(lián)在一起的其他數(shù)據(jù)的ptd(如數(shù)字廣播,數(shù)據(jù) 通訊等使用的pid) pmt定義如下:各字段含義如下:table_id:8bits的id,應該是0x02 section_syntax_indicator: lbit的段語法標志,應該是't ' '' 0'':固定是''0'',如果不 是說明數(shù)據(jù)有錯.reserved:2bits保留位,應該是''00'' section_length: 16bits段長度, 從program number開始,到crc 32

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

43、段號碼,含義和pat中的對應字段相同,請參考pat部分. reserved:3bits 保留位,一般是''000''. pcr_pid: 13bits 的 pcr pid,具體請參考 is013818-1,解復用程序不使用該參數(shù).reserved: 4bits保留位,一般是0000'' program_info_length:節(jié)目信息長度(之后的是n個描述符結構,一般可以忽略掉,這個字段 就代表描述符總的長度,單位是bytes)緊接著就是頻道內部包含的節(jié)目類型和對應的p1d 號碼了. stream type:8bits流類型,標志是video還是

44、audio還是其他數(shù)據(jù).reserved:3 bits 保留位.el ementary pid: 13bits 對應的數(shù)據(jù) ptd 號碼(如果 stream type 是 video,那 么這個pid就是video pid,如果stream_type標志是audio,那么這個pid就是audio pid) reserved:4 bits 保留位.es_info_length:和 program_info_length 類似的信息長度(其后 是n2個描述符號)crc_32:32bits段末尾是本段的crc校驗值,一般忽略.從以上的分析可 以看出,只要我們處理了 put,那么我們就可以獲取頻道屮所

45、有的pid信息,例如當前頻道包 含多少個video,共多少個audio,和其他數(shù)據(jù),還能知道每種數(shù)據(jù)對應的ptd分別是什么.這 樣如果我們要選擇具屮一個video和audio收看,那么只需耍把耍收看的節(jié)目的video pid 和audio pid保存起來,在處理packet的時候進行過濾即可實現(xiàn) 比較全而實現(xiàn)解復用的偽 代碼如卜:int video pld=0x07e5, audio pld=0x07c6; void process packet (unsigned char*buff) int i; int pid=getpid(buff); if(pid=0x0000) process p

46、at(buff+4); else if(ptd=video_ptd) savetovideobuffer(buff+4); else if(ptd=audio_ptd) savetoaudiobuffer(buff+4); else for ( i=0;i<64;i+) if(pid=pmti. pmtjpid) process_pmt (buff+4) ; break; 以上偽代碼可以實現(xiàn)基本的解復用:檢測所有的 頻道,檢測所冇stream的pid,選擇特定的節(jié)ii進行播放.只要讀取每個packet的188字節(jié) 的內容,然后每次都調用process_packet ()即可實現(xiàn)簡單的解復

47、用.介紹到這里,我們就町 以總結一下dvb搜臺的原理了.(好!洗耳恭聽!)機 頂盒先調整高頻頭到一個固定的頻率 (如498mhz),如果此頻率冇數(shù)字信號,則cofdm芯片(如mt352)會自動把ts流數(shù)據(jù)傳送給 mpeg- 2 decoder. mpeg-2 decoder先進行數(shù)據(jù)的同步,也就是等待完整的packet的到來. 然后循環(huán)查找是否出現(xiàn)ptd- 0x0000的packet,如果出現(xiàn)了,則馬上進入分析pat的處理, 獲取了所有的pmt的p1d.接著循壞查找是否岀現(xiàn)pmt,如果發(fā)現(xiàn)了,則白動進 入pmt分析, 獲取該頻段所有的頻道數(shù)據(jù)并保存如果沒有發(fā)現(xiàn)pat或者沒有發(fā)現(xiàn)pmt,說明該頻段沒有信 號,進入下一個頻率掃描.從以上描述可以看出,機頂盒搜索頻率是隨機發(fā)生的,要使每次機 頂盒都能搜索到信號,則要求ts流每隔一段吋i'可就發(fā)送一次pat和pmt.事實上dvb傳輸系 統(tǒng)就是這么做的.因此無論何時接

溫馨提示

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

評論

0/150

提交評論