MPEG2-TS的小结 [1]
1. 簡(jiǎn)述
MPEG2 TS和數(shù)字電視是緊密不可分割的,值得總結(jié)一下其中的一些關(guān)系。
ISO/IEC-13818-1:系統(tǒng)部分;
ISO/IEC-13818-2:視頻;
ISO/IEC-13818-3:音頻;
ISO/IEC- 13818-4:一致性測(cè)試;
ISO/IEC-13818-5:軟件部分;
ISO/IEC-13818-6:數(shù)字存儲(chǔ)媒體命令與控制;
ISO/IEC- 13818-7:高級(jí)音頻編碼;
ISO/IEC-13818-8:系統(tǒng)解碼實(shí)時(shí)接口;
MPEG2系統(tǒng)任務(wù)包括:
1. 規(guī)定以包傳輸數(shù)據(jù)的協(xié)議;
2. 規(guī)定收發(fā)兩端數(shù)據(jù)流同步的協(xié)議;
3. 提供多個(gè)數(shù)據(jù)流的復(fù)用和解復(fù)用協(xié)議;
3. 提供數(shù)據(jù)流加密的協(xié)議。
以包形式存儲(chǔ)和傳送數(shù)據(jù)流是MPEG2系統(tǒng)之要點(diǎn)。
?
2. ES數(shù)據(jù)流
ES是直接從編碼器出來(lái)的數(shù)據(jù)流,可以是編碼過(guò)的視頻數(shù)據(jù)流,音頻數(shù)據(jù)流,或其他編碼數(shù)據(jù)流的統(tǒng)稱。ES流經(jīng)過(guò)PES打包器之后,被轉(zhuǎn)換成PES包。PES包由包頭和payload組成,具體格式摘錄如下:
<!--[if !vml]--><!--[endif]-->
在PES層,主要是在PES包頭信息中加入PTS(顯示時(shí)間標(biāo)簽)和DTS(解碼時(shí)間標(biāo)簽)用于視頻、音頻同步。
其實(shí),Mpeg-2用于視音頻同步以及系統(tǒng)時(shí)鐘恢復(fù)的時(shí)間標(biāo)簽分別在ES,PES和TS這3個(gè)層次中。在ES層,與同步有關(guān)的主要是視頻緩沖驗(yàn)證VBV(Video Buffer Verifier),用以防止解碼器的緩沖器出現(xiàn)上溢或下溢;在PES層,主要是在PES頭信息里出現(xiàn)的顯示時(shí)間標(biāo)簽PTS(Presentation Time Stamp)和解碼時(shí)間標(biāo)簽DTS(Decoding Time Stamp);在TS層中,TS頭信息包含了節(jié)目時(shí)鐘參考PCR(Program Clock Reference),用于恢復(fù)出與編碼端一致的系統(tǒng)時(shí)序時(shí)鐘STC(System Time Clock)。
我們先看看從ES到PES的過(guò)程:
<!--[if !vml]--><!--[endif]-->
基本流程如下:首先MPEG-2壓縮編碼得到的ES基本流,這個(gè)數(shù)據(jù)流很大,并且只是I,P,B的這些視頻幀或音頻取樣信息,然后加入一些同步信息,打包成長(zhǎng)度可變長(zhǎng)度的數(shù)據(jù)包PES,原來(lái)是流的格式,現(xiàn)在成了數(shù)據(jù)包的分割形式。同時(shí)要注意的是,ES是只包含一種內(nèi)容的數(shù)據(jù)流,如只含視頻,或只含音頻等,打包之后的PES也是只含一種性質(zhì)的ES,如只含視頻ES的PES,只含音頻ES的PES等??梢灾?#xff0c;ES是編碼視頻數(shù)據(jù)流或音頻數(shù)據(jù)流,每個(gè)ES都由若干個(gè)存取單元(AU)組成,每個(gè)視頻AU或音頻AU都是由頭部和編碼數(shù)據(jù)兩部分組成,1個(gè)AU相當(dāng)于編碼的1幅視頻圖像或1個(gè)音頻幀,也可以說(shuō),每個(gè)AU實(shí)際上是編碼數(shù)據(jù)流的顯示單元,即相當(dāng)于解碼的1幅視頻圖像或1個(gè)音頻幀的取樣。PEG-2對(duì)視頻的壓縮產(chǎn)生I幀、P幀、B幀。把幀順序I1,P4,B2,B3,P7,B5,B6幀的編碼ES,通過(guò)打包并在每個(gè)幀中插入 PTS/DTS標(biāo)志,變成PES。在插入PTS/DTS標(biāo)志時(shí),由于在B幀PTS和DTS相等,所以無(wú)須在B幀多插入DTS。而對(duì)于I幀 和P幀,由于經(jīng)過(guò)復(fù)用后數(shù)據(jù)包的順序會(huì)發(fā)生變化,顯示前一定要存儲(chǔ)于視頻解碼器的從新排序緩存器中,經(jīng)過(guò)從新排序后再顯示,所以一定要同時(shí)插入PTS和 DTS作為從新排序的依據(jù)。
?
其中,有否PTS/DTS標(biāo)志,是解決視音頻同步顯示、防止解碼器輸入緩存器上溢或下溢的關(guān)鍵所在。PTS表明顯示單元出現(xiàn)在系統(tǒng)目標(biāo)解碼器(STD- System?Target?Decoder)的時(shí)間,?DTS表明將存取單元全部字節(jié)從STD的ES解碼緩存器移走的時(shí)刻。視頻編碼圖像幀次序?yàn)?/span> I1,P4,B2,B3,P7,B5,B6,I10,B8,B9的ES,加入PTS/DTS后,打包成一個(gè)個(gè)視頻PES包。每個(gè)PES包都有一個(gè)包頭,用于定義PES內(nèi)的數(shù)據(jù)內(nèi)容,提供定時(shí)資料。每個(gè)I、P、B幀的包頭都有一個(gè)PTS和DTS,但PTS與DTS對(duì)B幀都是一樣的,無(wú)須標(biāo)出B幀的DTS。對(duì)I幀和P幀,顯示前一定要存儲(chǔ)于視頻解碼器的重新排序緩存器中,經(jīng)過(guò)延遲(重新排序)后再顯示,一定要分別標(biāo)明PTS和DTS。例如,解碼器輸入的圖像幀次序?yàn)?/span>I1,P4,B2,B3,P7,B5,B6,I10,B8,B9,依解碼器輸出的幀次序,應(yīng)該P4比B2、B3在先,但顯示時(shí)P4一定要比B2、B3在后,即P4要在提前插入數(shù)據(jù)流中的時(shí)間標(biāo)志指引下,經(jīng)過(guò)緩存器重新排序,以重建編碼前視頻幀次序I1,B2,B3,P4,B5,B6,P7,B8,B9,I10。顯然,PTS/DTS標(biāo)志表明對(duì)確定事件或確定信息解碼的專用時(shí)標(biāo)的存在,依靠專用時(shí)標(biāo)解碼器,可知道該確定事件或確定信息開(kāi)始解碼或顯示的時(shí)刻。例如,PTS/DTS標(biāo)志可用于確定編碼、多路復(fù)用、解碼、重建的時(shí)間。
?
3. PS數(shù)據(jù)流
上節(jié)說(shuō)過(guò),ES首先需打包成PES流包,然后PES根據(jù)需要打包成PS或TS包進(jìn)行存儲(chǔ)或傳輸。其每路ES只包含一路信源的編碼數(shù)據(jù)流,所以每路PES也只包含相對(duì)應(yīng)信源的數(shù)據(jù)流。
對(duì) PS流而言,每個(gè)PES包頭含有PTS和DTS,流識(shí)別碼,用于區(qū)別不同性質(zhì)ES。然后通過(guò)PS復(fù)用器將PES包復(fù)用成PS包。實(shí)際上是將PES 包分解為更細(xì)小的PS包。在解碼的時(shí)候,解復(fù)用器將PS分解成一個(gè)個(gè)PES包,拆包器然后將PES包拆成視頻和音頻的ES,最后輸入至各自解碼器進(jìn)行解碼。一個(gè)問(wèn)題是:各個(gè)ES在解碼時(shí),如何保證視音頻的同步呢?除了PTS和DTS的配合工作外,還有一個(gè)重要的參數(shù)是SCR(system clock reference)。在編碼的時(shí)候,PTS,DTS和SCR都是由STC(system time clock)生成的,在解碼時(shí),STC會(huì)再生,并通過(guò)鎖相環(huán)路(PLL-phase lock loop),用本地SCR相位與輸入的瞬時(shí)SCR相位鎖相比較,以確定解碼過(guò)程是否同步,若不同步,則用這個(gè)瞬時(shí)SCR調(diào)整27MHz的本地時(shí)鐘頻率。最后,PTS,DTS和SCR一起配合,解決視音頻同步播放的問(wèn)題。PS格式摘錄如下:
| byte 0 | byte 1 | byte 2 | byte 3 | ||||||||||||||||||||||||||||
| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| 0000 0000 0000 0000 0000 0001
start code | 1011 1010 PACK identifier | ||||||||||||||||||||||||||||||
?
| byte 4 | byte 5 | byte 6 | byte 7 | byte 8 | byte 9 | ||||||||||||||||||||||||||||||||||||||||||
| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| 01 | SCR 32..30 | 1 | SCR 29..15 | 1 | SCR 14..00 | 1 | SCR_ext | 1 | |||||||||||||||||||||||||||||||||||||||
?
| byte 10 | byte 11 | byte 12 | byte 13 | ||||||||||||||||||||||||||||
| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| Program_Mux_Rate | 1 | 1 | reserved | pack_stuffing_length | |||||||||||||||||||||||||||
PS包的長(zhǎng)度比較長(zhǎng)且可變,主要用于無(wú)誤碼環(huán)境里,因?yàn)樵介L(zhǎng)的話,同步越困難,且在丟包的情況下,重組也越困難。所以,PS適合于節(jié)目信息的編輯和本地內(nèi)容應(yīng)用的application。
?
4. TS數(shù)據(jù)流
TS流也是由一個(gè)或多個(gè)PES組合而來(lái)的,他們可以具有相同的時(shí)間基準(zhǔn),也可以不同。其基本的復(fù)用思想是,對(duì)具有相同時(shí)間基準(zhǔn)的多個(gè)PES現(xiàn)進(jìn)行節(jié)目復(fù)用,然后再對(duì)相互有獨(dú)立時(shí)間基準(zhǔn)的各個(gè)PS進(jìn)行傳輸復(fù)用,最終產(chǎn)生出TS。TS包由包頭和包數(shù)據(jù)2部分組成,其中包頭還可以包括擴(kuò)展的自適用區(qū)。包頭長(zhǎng)度占4bytes,自使用區(qū)和包數(shù)據(jù)共占184bytes,整個(gè)TS包長(zhǎng)度相當(dāng)于4個(gè)ATM包長(zhǎng)。TS包的包頭由如下圖摘錄所示的同步字節(jié)、傳輸誤碼指示符、有效載荷單元起始指示符、傳輸優(yōu)先、包識(shí)別(PID-Packet Identification)、傳輸加擾控制、自適應(yīng)區(qū)控制和連續(xù)計(jì)數(shù)器8個(gè)部分組成。
<!--[if !vml]--><!--[endif]-->
對(duì)上面的各個(gè)字段簡(jiǎn)單說(shuō)明一下:
| Partial Transport Stream Packet Format | ||
| Name | Number | Description |
| sync byte | 8 | 0x47 |
| Transport Error Indicator (TEI) | 1 | Set by demodulator if can't correct errors in the stream[2] |
| Payload Unit Start Indicator | 1 | 1 means start of PES data or PSI otherwise zero only . |
| Transport Priority | 1 | One means higher priority than other packets with the same PID. |
| PID | 13 | Packet ID |
| Scrambling control | 2 | '00' = Not scrambled. ? The following per DVB spec [3]: ? '01' = Reserved for future use, ? '10' = Scrambled with even key, ? '11' = Scrambled with odd key |
| Adaptation field exist | 1 | 1 means presence of the adaptation field |
| Payload data exist | 1 | 1 means presence of data |
| Continuity counter | 4 | ? |
| ? | ? | Note: the total number of bits above is 32 and is called the transport stream 4-byte prefix. |
| Adaptation field | 0 or more | Depends on flags |
| Payload Data | 0 or more | Depends on flags |
| Adaptation Field Format | ||
| Name | Number | Description |
| Adaptation Field Length | 8 | Number of bytes in the adaptation field immediately following this byte |
| Discontinuity indicator | 1 | Set to 1 if a discontinuity occurred in the continuity counter of the TS packet |
| Random Access indicator | 1 | Set to 1 if the PES packet in this TS packet starts a video/audio sequence |
| Elementary stream priority indicator | 1 | 1 = higher priority |
| PCR flag | 1 | 1 means adaptation field does contain a PCR field |
| OPCR flag | 1 | ? |
| Splicing point flag | 1 | 1 means presence of splice countdown field in adaptation field |
| Transport private data flag | 1 | 1 means presence of private data bytes in adaptation field |
| Adaptation field extension flag | 1 | 1 means presence of adaptation field extension |
| Below fields are optional | variable | Depends on flags |
| PCR | 33+9 | Program clock reference |
| OPCR | 33+9 | Original Program clock reference. Helps when one TS is copied into another |
| Splice countdown | 8 | Indicates how many TS packets from this one a splicing point occurs (may be negative) |
| stuffing bytes | variable | ? |
其中,在包頭中:
同步字節(jié)(sync byte)的自動(dòng)相關(guān)特性,檢測(cè)數(shù)據(jù)流中的包限制,建立包同步;
傳輸誤碼指示符(Transport Error Indicator),指有不能消除誤碼時(shí),采用誤碼校正解碼器可表示1bit 的誤碼,但無(wú)法校正;
有效載荷單元起始指示符(Payload Unit Start Indicator),表示該數(shù)據(jù)包是否存在確定的起始信息;
傳輸優(yōu)先級(jí)(Transport Priority),是給TS包分配優(yōu)先權(quán);PID值是由用戶確定的,解碼器根據(jù)PID將TS上從不同ES來(lái)的TS包區(qū)別出來(lái),以重建原來(lái)的ES;
傳輸加擾控制(Scrambling control),可指示數(shù)據(jù)包內(nèi)容是否加擾,但包頭和自適應(yīng)區(qū)永遠(yuǎn)不加擾;
自適應(yīng)區(qū)控制存在字段(Adaptation field exist),用2 bit表示有否自適應(yīng)區(qū),即(01)表示有有用信息無(wú)自適應(yīng)區(qū),(10)表示無(wú)有用信息有自適應(yīng)區(qū),(11)表示有有用信息有自適應(yīng)區(qū),(00)無(wú)定義;
載荷存在標(biāo)記字段(Payload data exist),1一位著存在載荷;
連續(xù)計(jì)數(shù)器(Continuity counter)可對(duì)PID包傳送順序計(jì)數(shù),據(jù)計(jì)數(shù)器讀數(shù),接收端可判斷是否有包丟失及包傳送順序錯(cuò)誤。顯然,包頭對(duì)TS包具有同步、識(shí)別、檢錯(cuò)及加密功能。
??? TS包自適應(yīng)區(qū)由自適應(yīng)區(qū)長(zhǎng)、各種標(biāo)志指示符、與插入標(biāo)志有關(guān)的信息和填充數(shù)據(jù)4部分組成。其中標(biāo)志部分由間斷指示符、隨機(jī)存取指示符、ES優(yōu)化指示符、PCR標(biāo)志、接點(diǎn)標(biāo)志、傳輸專用數(shù)據(jù)標(biāo)志、原始PCR標(biāo)志、自適應(yīng)區(qū)擴(kuò)展標(biāo)志8個(gè)部分組成。重要的是標(biāo)志部分的PCR字段,可給編解碼器的27MHz時(shí)鐘提供同步資料,進(jìn)行同步。其過(guò)程是,通過(guò)PLL,用解碼時(shí)本地用PCR相位與輸入的瞬時(shí)PCR相位鎖相比較,確定解碼過(guò)程是否同步,若不同步,則用這個(gè)瞬時(shí)PCR調(diào)整時(shí)鐘頻率。因?yàn)?#xff0c;數(shù)字圖像采用了復(fù)雜而不同的壓縮編碼算法,造成每幅圖像的數(shù)據(jù)各不相同,使直接從壓縮編碼圖像數(shù)據(jù)的開(kāi)始部分獲取時(shí)鐘信息成為不可能。為此,選擇了某些(而非全部)TS包的自適應(yīng)區(qū)來(lái)傳送定時(shí)信息。于是,被選中的TS包的自適應(yīng)區(qū),可用于測(cè)定包信息的控制bit和重要的控制信息。自適應(yīng)區(qū)無(wú)須伴隨每個(gè)包都發(fā)送,發(fā)送多少主要由選中的TS包的傳輸專用時(shí)標(biāo)參數(shù)決定。標(biāo)志中的隨機(jī)存取指示符和接點(diǎn)標(biāo)志,在節(jié)目變動(dòng)時(shí),為隨機(jī)進(jìn)入I幀壓縮的數(shù)據(jù)流提供隨機(jī)進(jìn)入點(diǎn),也為插入當(dāng)?shù)毓?jié)目提供方便。自適應(yīng)區(qū)中的填充數(shù)據(jù)是由于PES包長(zhǎng)不可能正好轉(zhuǎn)為TS包的整數(shù)倍,最后的TS包保留一小部分有用容量,通過(guò)填充字節(jié)加以填補(bǔ),這樣可以防止緩存器下溢,保持總碼率恒定不變。
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/moonvan/archive/2011/10/22/2221268.html
總結(jié)
以上是生活随笔為你收集整理的MPEG2-TS的小结 [1]的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 利用 sys.sysprocesses
- 下一篇: Delphi 写服务程序