1.MPEG2-TS編碼技術 1.1.MPEG-TS簡介
MPEG2-TS(Transport Stream“傳輸流”;又稱TS、TP、MPEG-TS或M2T)是用于音效、圖像與數據的通信協定,最早應用于DVD的實時傳送節目。
區別:
DVD節目中的MPEG2格式,確切地說是MPEG2-PS,全稱是Program Stream(程序流),而TS的全稱則是Transport Stream(傳輸流)。MPEG2-PS主要應用于存儲的具有固定時長的節目,如DVD電影,可添加字幕等一些程序操作。而MPEG-TS則主要應用于實時傳送的節目,比如實時廣播的電視節目。
簡單地說,將DVD上的VOB文件的前面一截cut掉(或者是數據損壞數據)就會導致整個文件無法解碼,而電視節目是任何時候打開電視機都能解碼(收看)的。所以MPEG2-TS格式的特點就是從視頻流的任一片段開始都是可以獨立解碼。
1.2.基本概念及TS流概述
(1)ES流(Elementary Stream,基本流):數字電視各組成部分編碼后所形成的直接表示基本元素內容的流,包含視頻、音頻或數據的連續碼流。
(2)PES流(Paketized Elementary Stream,打包基本碼流):是將基本的碼流ES流根據需要分成長度不等的數據包,并加上包頭就形成了打包的基本碼流PES流。
(3)PS流(Program Stream,節目流):將一個節目的多個組成部分按照它們之間的互相關系進行組織并加入各組成部分關系描述后的碼流。PS流是一種多路復用數字音頻、視頻等的封裝容器,它是一個或多個具有共同的時間基準的PES流合并成一個整體流,主要用于節目存儲。其包長不固定,且較長,一旦失去同步信息,接收機無法確定下一包的同步位置,會造成失步,導致嚴重的信息丟失。PS流適用于誤碼小、信道較好的環境,如演播室、家庭環境和存儲介質中。
(4)TS流(Transport Stream,傳輸流):是將一個節目的多個組成部分按照它們之間的互相關系進行組織并加入各組成部分關系描述和節目組成信息,并進一步封裝成傳輸包后的碼流。TS流是將視頻、音頻、PSI等數據打包成傳輸包進行傳送。主要用于節目傳輸。TS的傳輸包長度固定,一般為188字節。
(5)TS流和PS流是MPEG-2標準中規定的兩種輸出碼流。TS格式中,從視頻流的任意一片斷開始都可以獨立解碼,而PS格式不可以。由于TS流具備較強的抵抗傳輸誤碼的能力,因此目前在傳輸媒體中進行傳輸的MPEG-2碼流基本上都采用了TS流的包格式。
(6)TS流的播放:播放前將TS流文件的后綴名改為.mpg或者.mpeg,用可以直接播放MPEG-TS流的播放器(一般的播放器都可以)打開播放即可。
(7)TS流的優點:
① 動態帶寬分配:由于TS的傳輸包長度是固定的,因此可過PID將規定的信道總頻帶在視頻、音頻和數據信息進行實時的、靈活的分配。利用這一特性,可在廣播付費節目前實時地將解密鑰匙插入到TS流中送給廣大用戶。
② 可分級性:允許一個復用的傳輸碼流與其他視音頻基本碼流進行二次復用,生產占用頻帶給寬的更高一級的TS流。
③ 可擴展性
④ 抗干擾性
⑤ 接收機成本低廉
(8)TS流的形成過程:
① 壓縮【顯示單元】產生【進入單元】,連續的【進入單元】組成一個基本碼流。
② 對ES(基本碼流)進行打包形成PES。
③ 在PES包中加入定時信息(PTS/DTS)。
④ 將PES包內容分配到一系列固定長度的傳輸包中。
⑤ 在傳輸包中加入定時信息(PCR)。
⑥ 在傳輸包中加入節目專用信息(PSI) 。
⑦ 連續輸出傳輸包形成具有恒定比特率的MPEG-TS流。
1.3.基本流程
下圖是在MPEG-2系統中編碼端實現單一碼流的詳細過程:
(1)A/D轉換后,通過MPEG-2壓縮編碼得到ES基本流。該流數據量很大,并且只是I P B幀的取樣信息。
(2)通過PES打包器,打包并在每個幀中插入PTS/DTS標識,編程PES。原來是流的格式,現在成了數據包的分割形式。
(3)PES根據需要打包成PS或者TS包進行存儲。
1.4.TS流傳輸包(簡稱TS包)結構分析
MPEG-2中規定TS傳輸包的長度為188字節。但通信媒介會為包添加錯誤校驗字節,從而有了不同于188字節的包長。例如:
DVB規定中,使用204字節作為包長:① 通過調制器時,在每個傳輸包后增加了16字節的里德所羅門前向糾錯碼,因而形成了204字節的數據包。調制后總存在204字節的數據包。② 調制之前存復用器插入RS碼或虛構的RS碼。
ATSC規定中,使用208字節作為包長:添加20字節的RS(Reed-Solomon)前向糾錯碼。與DVB不同,ATSC規定RS碼只能出現在調制的TS流中。
所有的TS包都分為包頭和凈荷部分。TS包中可以填入很多東西(填入的東西都是填入到凈荷部分),有:視頻、音頻、數據(包括PSI、SI以及其它任何形式的數據)。
包頭信息分析見1.4.1。TS包自適應區由自適應區長、各種標志指示符、與插入標志有關的信息和填充數據4部分組成。其中標志部分由間斷指示符、隨機存取指示符、ES優化指示符、PCR標志、接點標志、傳輸專用數據標志、原始PCR標志、自適應區擴展標志8個部分組成。重要的是標志部分的PCR字段,可給編解碼器的27MHz時鐘提供同步資料,進行同步。其過程是,通過PLL,用解碼時本地用PCR相位與輸入的瞬時PCR相位鎖相比較,確定解碼過程是否同步,若不同步,則用這個瞬時PCR調整時鐘頻率。因為,數字圖像采用了復雜而不同的壓縮編碼算法,造成每幅圖像的數據各不相同,使直接從壓縮編碼圖像數據的開始部分獲取時鐘信息成為不可能。為此,選擇了某些(而非全部)TS包的自適應區來傳送定時信息。于是,被選中的TS包的自適應區,可用于測定包信息的控制bit和重要的控制信息。自適應區無須伴隨每個包都發送,發送多少主要由選中的TS包的傳輸專用時標參數決定。標志中的隨機存取指示符和接點標志,在節目變動時,為隨機進入I幀壓縮的數據流提供隨機進入點,也為插入當地節目提供方便。自適應區中的填充數據是由于PES包長不可能正好轉為TS包的整數倍,最后的TS包保留一小部分有用容量,通過填充字節加以填補,這樣可以防止緩存器下溢,保持總碼率恒定不變。
1.4.1.TS包包頭
TS包的包頭提供關于傳輸方面的信息:同步、有無差錯、有無加擾、PCR(節目參考時鐘)等標志。TS包的包頭長度不固定,前32比特(4個字節)固定,后面可能跟有自適應字段(適配域)。32個比特(4個字節)是最小包頭。包頭的結構固定如下:
typedef struct TS_packet_header { unsigned sync_byte : 8; unsigned transport_error_indicator : 1; unsigned payload_unit_start_indicator : 1; unsigned transport_priority : 1; unsigned PID : 13; unsigned transport_scrambling_control : 2; unsigned adaption_field_control : 2; unsigned continuity_counter : 4; } TS_packet_header;
sync_byte(同步字節):固定為0100 0111 (0x47);該字節由解碼器識別,使包頭和有效負載可相互分離。
transport_error_indicator(傳輸錯誤指示):‘1’表示在相關的傳輸包中至少有一個不可糾正的錯誤位。當被置1后,在錯誤被糾正之前不能重置為0。
payload_unit_start_indicator(開始指示):為1時,在前4個字節之后會有一個調整字節,其數值為后面調整字段的長度length。因此有效載荷開始的位置應再偏移1+[length]個字節。
transport_priority(傳輸優先級):‘1’表明優先級比其他具有相同PID 但此位沒有被置‘1’的分組高。
PID:指示存儲與分組有效負載中數據的類型。PID值0x0000-0x000F保留。其中0x0000為PAT保留;0x0001為CAT保留;0x1fff為分組保留,即空包。
transport_scrambling_control(加擾控制):表示TS流分組有效負載的加密模式??瞻鼮椤?0’,如果傳輸包包頭中包括調整字段,不應被加密。
adaptation_field_control(適配域控制):表示包頭是否有調整字段或有效負載?!?0’為ISO/IEC未來使用保留;‘01’僅含有效載荷,無調整字段;‘10’ 無有效載荷,僅含調整字段;‘11’ 調整字段后為有效載荷,調整字段中的前一個字節表示調整字段的長度length,有效載荷開始的位置應再偏移[length]個字節??瞻鼞獮椤?0’。
continuity_counter(連續性計數器):隨著每一個具有相同PID的TS流分組而增加,當它達到最大值后又回復到0。范圍為0~15。
適配域:
1.4.2.TS包凈荷部分
TS包中凈荷所傳輸的信息包括兩種類型:
① 視頻、音頻的PES包以及輔助數據;
② 節目專用信息PSI。
當然,TS包也可以是空包??瞻脕硖畛銽S流,可能在重新進行多路復用時被插入或刪除。
在系統復用時,視頻、音頻的ES流需進行打包形成視頻、音頻的PES流,輔助數據(如圖文電視信息)不需要打成PES包。PES包非定長,音頻的PES包小于等于64K,視頻的一般為一幀一個PES包。一幀圖象的PES包通常要由許多個TS包來傳輸。MPEG-2中規定,一個PES包必須由整數個TS包來傳輸。如果承載一個PES包的最后一個TS包沒能裝滿,則用填充字節來填滿;當下一個新的PES包形成時,需用新的TS包來開始傳輸。
(1)PES相關
PES是打包過的ES,已經插入PTS和DTS,一般一個PES是一幀圖像。
圖1-2 一個打包基本流(PES)包的組成
PES經過打包成TS或PS流,往往一個PES會分存到多個TS包中。
① PES包的包起始碼:
包起始碼前綴是一個固定的碼字結構,它的值是0x000001,用于收發兩端對PES包進行同步。
② PES包的長度:
PES包的長度是可變的,PES包長度域有兩個字節,共16比特,因此PES包的最大長度是65535字節
③ PES包頭:
PES包頭的功能根據特定的應用場合有所不同,包括加擾控制,優先級,ES流速率和CRC等,其中有兩個重要的工作:PTS和DTS。
可以看到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。
(2)節目專用信息PSI(Program Specific Information)
管理各種類型的TS數據包,需要有些特殊的TS包來確立各個TS數據包之間的關系。這些特殊的TS包里所包含的信息就是節目專用信息。在不同的標準中它有不同的名字:
① MPEG-2中稱為PSI;
② DVB標準根據實際需要,對PSI擴展,稱為SI信息;
③ ATSC標準中為PSIP信息;
MPEG-2中,規定的對PSI信息的描述方法有以下幾種:
- 表Table:節目信息的結構性的描述;
- 節目關聯表Program Association Table(PAT)0x0000
- 節目映射表Program Map Tables(PMT)
- 條件接收表Conditional Access Table(CAT)0x0001
- 網絡信息表Network Information Table(NIT)0x0010
- 傳送流描述表Transport Stream Description Table(TSDT)
- 節Section:將表格的內容映射到TS流中;
專用段Private_ section
- 描述符Descriptor:提供有關節目構成(視頻流、音頻流、語言、層次、系統時鐘和碼率等多方面)的信息;
ITU-T Rec.H.222.0 | ISO/IEC 13818-1中定義的 PSI表可被分成一段或多段置于傳輸流分組中。一段就是一個語法結構,用來將ITU-T Rec.H.222.0 | ISO/IEC 13818-1中定義的PSI表映射到傳輸流分組中。
1)PAT表
TS流中包含一個或者多個PAT表。PAT表由PID為0x0000的TS包傳送,其作用是為復用的每一路傳送流提供所包含的節目和節目編號,以及對應節目的PMT的位置即PMT的TS包的PID值,同時還提供NIT的位置,即NIT的TS包的PID的值。
table_id:固定為0x00,標志該表是PAT表。
section_syntax_indicator:段語法標志位,固定為1。
section_length:表示這個字節后面有用的字節數,包括CRC32。節目套數:(section length-9)/4
transport_stream_id:16位字段,表示該TS流的ID,區別于同一個網絡中其它多路復用流。
version_number:表示PAT的版本號。
current_next_indicator:表示發送的PAT表是當前有效還是下一個PAT有效。
section_number:表示分段的號碼。PAT可能分為多段傳輸,第一段為0,以后每個分段加1,最多可能有256個分段。
last_section_number:表示PAT最后一個分段的號碼。
Program number:節目號
network_PID:網絡信息表(NIT)的PID,節目號為0時對應ID為network_PID。
Program map PID:節目映射表(PMT)的PID號,節目號為大于等于1時,對應的ID為program_map_PID。一個PAT中可以有多個program_map_PID。
CRC_32:32位字段,CRC32校驗碼Cyclic RedundancyCheck。
2)PMT表
PMT在傳送流中用于指示組成某一套節目的視頻、音頻和數據在傳送流中的位置,即對應的TS包的PID值,以及每路節目的節目時鐘參考(PCR)字段的位置。
Table id:固定為0x02,標志該表是PMT表。
Section syntax indicator:對于PMT表,設置為1。
Section length:表示這個字節后面有用的字節數,包括CRC32。
Program number:它指出該節目對應于可應用的Program map PID。
Version number:指出PMT的版本號。
Current next indicator:當該位置‘1’時,當前傳送的Program map section可用;當該位置‘0’時,指示當前傳送的Program map section不可用,下一個TS流的Program map section 有效。
Section number:總是置為0x00(因為PMT表里表示一個service的信息,一個section的長度足夠)。
Last section number:該域的值總是0x00 。
PCR PID:節目中包含有效PCR字段的傳送流中PID。
Program info length:12bit域,前兩位為00。該域指出跟隨其后對節目信息的描述的byte 數。
Stream type:8bit域,指示特定PID的節目元素包的類型。該處PID由elementary PID 指定。下表所示為對應原始流的類型。
原始流的類型
1.5.PS節目流
對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。
2.MPEG-4編碼技術 2.1.MPEG-4概述
MPEG-4全稱為Moving Picture Experts Group 4,是一套用于音頻、視頻信息的壓縮編碼標準,由國際標準化組織(ISO)和國際電工委員會(IEC)下屬的“動態圖像專家組”(Moving Picture Experts Group,即MPEG)制定,第一版在1998年10月通過,第二版在1999年12月通過。MPEG-4格式的主要用途在于網上流、光盤、語音發送(視頻電話),以及電視廣播。
MPEG-4的特點:
(1)對于不同的對象可采用不同的編碼算法,從而進一步提高壓縮效率;
(2)對象各自相對獨立,提高了多媒體數據的可重用性;
(3)允許用戶對單個的對象操作,提供前所未有的交互性;
(4)允許在不同的對象之間靈活分配碼率,對重要的對象可分配較多的字節,對次要的對象可分配較少的字節,從而能在低碼率下獲得較好的效果;
(5)可以方便的集成自然音視頻對象和合成音視頻對象。
2.2.MPEG-4各部分
MPEG-4由一系列的子標準組成,被稱為部,包括以下的部分。對于媒體編解碼,重點關注Part2,Part 3,Part 10。
第一部(ISO/IEC 14496-1):系統
描述視頻和音頻的同步以及混合方式(Multiplexing,簡寫為MUX)。定義了MP4容器格式,支持類似DVD菜單這樣的直觀和互動特性等。
第二部(ISO/IEC 14496-2):視頻
定義了一個對各種視覺信息(包括視頻、靜止紋理、計算機合成圖形等等)的編解碼器。對視頻部分來說,眾多“Profiles”中很常用的一種是Advanced Simple Profile (ASP),例如XviD編碼就屬于MPEG-4Part 2。包括3ivx,DivX4/Project Mayo,DivX 5,Envivio,ffmpeg/ffds,pegable,Nero Digital,QuickTime,Sorenson,XviD等常見的視頻格式, 需要注意的是Divx 3.11,MS MPEG-4,RV9/10,VP6,WMV9并不屬于標準的MPEG-4標準。
第三部(ISO/IEC 14496-3):音頻
定義了一個對各種音頻信號進行編碼的編解碼器的集合。包括高級音頻編碼(Advanced Audio Coding,縮寫為AAC) 的若干變形和其他一些音頻/語音編碼工具。即AAC音頻標準,包括LCAAC,HE AAC等,支持5.1聲道編碼,可以用更低的碼率實現更好的效果(相對于MP3,OGG等)。
第四部(ISO/IEC 14496-4):一致性
定義了對本標準其他的部分進行一致性測試的程序。
第五部(ISO/IEC 14496-5):參考軟件
提供了用于演示功能和說明本標準其他部分功能的軟件。
第六部(ISO/IEC 14496-6):多媒體傳輸集成框架
即DMIF:Delivery Multimedia Integration Framework
第七部(ISO/IEC 14496-7):優化的參考軟件
提供了對實現進行優化的例子(這里的實現指的是第五部分)。
第八部(ISO/IEC 14496-8):在IP網絡上傳輸
定義了在IP網絡上傳輸MPEG-4內容的方式。
第九部(ISO/IEC 14496-9):參考硬件
提供了用于演示怎樣在硬件上實現本標準其他部分功能的硬件設計方案。
第十部(ISO/IEC 14496-10):進階視頻編碼,也即ITU H.264,常寫為H.264/AVC
或稱高級視頻編碼(Advanced Video Coding,縮寫為AVC):定義了一個視頻編解碼器(codec),AVC和XviD都屬于MPEG-4編碼,但由于AVC屬于MPEG-4Part 10,在技術特性上比屬于MPEG-4 Part2的XviD要先進。另外從技術上講,它和ITU-T H.264標準是一致的,故全稱為MPEG-4 AVC/H.264。
第十一部(ISO/IEC 14496-11):場景描述和應用引擎
可用于多種profile(包括2D和3D版本)的互交互媒體。修訂了MPEG-4 Part 1:2001以及Part1的兩個修訂方案。它定義了應用引擎(交付,生命周期,格式,可下載Java字節代碼應用程序的行為),二進制場景格式 (BIFS:Binary Format for Scene),可擴展MPEG-4文本格式(一種使用XML描述MPEG-4多媒體內容的文本格式)系統level表述。也就是MPEG-4 Part21中的BIFS,XMT,MPEG-J。
第十二部(ISO/IEC 14496-12):基于ISO的媒體文件格式
定義了一個存儲媒體內容的文件格式。
第十三部(ISO/IEC 14496-13):IP
知識產權管理和保護(IPMP for Intellectual Property Management and Protection)拓展。
第十四部(ISO/IEC 14496-14):MPEG-4文件格式
定義了基于第十二部分的用于存儲MPEG-4內容的視頻文件格式。
第十五部(ISO/IEC 14496-15):AVC文件格式
定義了基于第十二部分的用于存儲第十部分的視頻內容的文件格式。
第十六部(ISO/IEC 14496-16):動畫框架擴展(AFX : Animation Framework eXtension)。
第十七部(ISO/IEC 14496-17):同步文本字幕格式
第十八部(ISO/IEC 14496-18):字體壓縮和流式傳輸(針對公開字體格式)。
第十九部(ISO/IEC 14496-19):綜合用材質流(Synthesized Texture Stream)。
第二十部(ISO/IEC 14496-20):簡單場景表示(LASeR: Lightweight Scene Representation)。
第二十一部(ISO/IEC 14496-21):用于描繪(Rendering)的MPEG-J拓展
第二十二部分(ISO/IEC 14496-22):開放字體格式(Open Font Format)。
第二十三部分(ISO/IEC 14496-23):符號化音樂表示(Symbolic Music Representation)。
第二十四部分(ISO/IEC 14496-24):音頻與系統交互作用(Audio and systems interaction)。
第二十五部分(ISO/IEC 14496-25):3D圖形壓縮模型(3D Graphics Compression Model)。
第二十六部分(ISO/IEC 14496-26):音頻一致性檢查
定義測試音頻數據與ISO/IEC 14496-3是否一致的方法(Audio conformance)。
第二十七部分(ISO/IEC 14496-27):3D圖形一致性檢查
定義測試3D圖形數據與ISO/IEC 14496-11:2005, ISO/IEC 14496-16:2006, ISO/IEC 14496-21:2006,和ISO/IEC 14496-25:2009是否一致的方法(3D Graphics conformance)。
2.3.MPEG-4層次結構
先來分析它的層次結構,它可以分為5個層次(對應著圖看,非常清楚):
(1)視頻對象序列VOS。
(2)VO(Video Object):視頻對象,它是場景中的某個物體,最簡單的情況下就是矩形框,它是有生命期的,由時間上連續的許多幀構成。
(3)VOL(Video Object Layer):視頻對象層,VO的三種屬性信息在該層進行編碼,該層主要用來擴展VO的時域和空域分辨率,實現分成編碼。
(4)GOV:視頻對象平面組,由視頻平面組合,是可選成分。視頻對象層即可以由VOP直接組合,也可以由GOV組合而成。
(5)VOP(Video Object Plane):視頻對象平面,它可以看作是VO在某一時刻的采樣,即一幀VO。
MPEG4碼流開頭往往如下:
00 00 01 B0 F5 00 00 01 B5 09 00 00 01 00 00 00 01 20 08 86 84 00 3F 18 58 21 20 A3 1F 00 00 01 B2 58 76 69 44 30 30 36 32 00 00 01 B6
根據標準,定義如下:
00 00 01 B0是視頻對象序列開始標志(VISOBJSEQ_START_CODE),其后的數據只有一位F5,表示此視頻對象編碼序列編碼的Profile與Level類型是XVID_PROFILE_AS_L4, Profile類型數值定義于xvid.h。
00 00 01 B5是視頻對象開始標志(VISOBJ_START_CODE),其后只有一位16進制數據09,從這一位數據可以獲得視頻對象版本號、視頻類型和視頻信號類型信息。
00 00 01 00是視頻對象開始標志(VIDOBJ_START_CODE),00 00 01 20是視頻對象層開始標志(VIDOBJLAY_START_CODE),其后的11位16進制數據比較重要,解碼所需要的VOP縱橫比、視頻對象形狀和圖像分辨率等數據都是從這11位數據獲得的。
00 00 01 B2是用戶數據開始標志(USERDATA_START_CODE),十六進制用戶數據共有8位。
00 00 01 B6是VOP開始標志(VOP_START_CODE),每個VOP編碼數據都以VOP標識頭開始,VOP標識頭比較簡單,如果用16進制數據表示其數值為00 00 01 B6。解碼的時候,以00 00 01 B6來判定是不是一個VOP的開始,并從VOP標識頭后的數據讀取編碼類型,量化值等參數后完成一幀VOP的解碼。緊跟著VOP開始的,有一個2bit 的標志,用來表示這個Frame到底是一個 I Frame,P Frame,B Frame抑或是S Frame(GMS-VOP)。
標志如下:
00: I Frame
01: P Frame
10: B Frame
11: S Frame
00 00 01 b6之后的下一個字節的高兩位,00表示I frame, 01表示P frame,10表示B frame??梢院唵文脗€圖說明一下,下圖中,第一個VOS的開頭,第二個是一個I Frame:
3.H.264編碼技術 3.1.H.264概述
國際上制定視頻編解碼技術的組織有兩個,一個是“國際電聯(ITU-T)”,它制定的標準有H.261、H.263、H.263+等,另一個是“國際標準化組織(ISO)”它制定的標準有MPEG-1、MPEG-2、MPEG-4等。而H.264則是由兩個組織(ITU-T視頻編碼專家組(VCEG)和ISO/IEC動態圖像專家組(MPEG))聯合組建的聯合視頻組(JVT,Joint Video Team)共同制定的高度壓縮數字視頻編解碼器標準,所以它既是ITU-T的H.264,又是ISO/IEC的MPEG-4高級視頻編碼(Advanced Video Coding,AVC)的第10 部分。因此,不論是MPEG-4 AVC、MPEG-4 Part 10,還是ISO/IEC 14496-10,都是指H.264。
H264標準各主要部分有Access Unit delimiter(訪問單元分割符),SEI(附加增強信息),primary coded picture(基本圖像編碼),Redundant Coded Picture(冗余圖像編碼)。還有Instantaneous Decoding Refresh(IDR,即時解碼刷新)、Hypothetical Reference Decoder(HRD,假想參考解碼)、Hypothetical Stream Scheduler(HSS,假想碼流調度器)。
優勢:
(1)低碼率(Low Bit Rate):和MPEG2和MPEG4 ASP等壓縮技術相比,在同等圖像質量下,采用H.264技術壓縮后的數據量只有MPEG2的1/8,MPEG4的1/3。
(2)高質量的圖像:H.264能提供連續、流暢的高質量圖像(DVD質量)。
(3)容錯能力強:H.264提供了解決在不穩定網絡環境下容易發生的丟包等錯誤的必要工具。
(4)網絡適應性強:H.264提供了網絡抽象層(Network Abstraction Layer),使得H.264的文件能容易地在不同網絡上傳輸(例如互聯網,CDMA,GPRS,WCDMA,CDMA2000等)。
H.264最大的優勢是具有很高的數據壓縮比率,在同等圖像質量的條件下,H.264的壓縮比是MPEG-2的2倍以上,是MPEG-4的1.5~2倍。舉個例子,原始文件的大小如果為88GB,采用MPEG-2壓縮標準壓縮后變成3.5GB,壓縮比為25∶1,而采用H.264壓縮標準壓縮后變為879MB,從88GB到879MB,H.264的壓縮比達到驚人的102∶1。低碼率(Low Bit Rate)對H.264的高的壓縮比起到了重要的作用,和MPEG-2和MPEG-4 ASP等壓縮技術相比,H.264壓縮技術將大大節省用戶的下載時間和數據流量收費。尤其值得一提的是,H.264在具有高壓縮比的同時還擁有高質量流暢的圖像,正因為如此,經過H.264壓縮的視頻數據,在網絡傳輸過程中所需要的帶寬更少,也更加經濟。
H.264/AVC可工作于多種速率,廣泛應用于Internet/intranet上的多媒體流服務、視頻點播、可視游戲、低碼率移動多媒體通信 (視頻 手機等)、交互式多媒體應用、實時多媒體監控、數字電視與演播電視和虛擬視頻會議等,大有在上述領域一統天下的趨勢,有非常廣泛的開發和應用前景。
3.2.H.264編碼格式解析 3.2.1.名詞解釋
(1)場和幀:視頻的一場或一幀可用來產生一個編碼圖像。在電視中,為減少大面積閃爍現象,把一幀分成兩個隔行的場。
(2)片:每個圖象中,若干宏塊被排列成片的形式。片分為I片、B片、P片和其他一些片。
I片只包含I宏塊,P片可包含P和I宏塊,而B片可包含B和I宏塊。
- I宏塊利用從當前片中已解碼的像素作為參考進行幀內預測。
- P宏塊利用前面已編碼圖象作為參考圖象進行幀內預測。
- B宏塊則利用雙向的參考圖象(前一幀和后一幀)進行幀內預測。
片的目的是為了限制誤碼的擴散和傳輸,使編碼片相互間是獨立的。
某片的預測不能以其它片中的宏塊為參考圖像,這樣某一片中的預測誤差才不會傳播到其它片中去。
(3)宏塊:一個編碼圖像通常劃分成若干宏塊組成,一個宏塊由一個16×16亮度像素和附加的一個8×8 Cb和一個8×8 Cr彩色像素塊組成。
(4)數據之間的關系:
H.264結構中,一個視頻圖像編碼后的數據叫做一幀,一幀由一個片(slice)或多個片組成,一個片由一個或多個宏塊(MB)組成,一個宏塊由16x16的yuv數據組成。宏塊作為H264編碼的基本單位。
(5)H264編碼過程中的三種不同的數據形式:
① SODB數據比特串 —->最原始的編碼數據,即VCL數據;
② RBSP 原始字節序列載荷 —->在SODB的后面填加了結尾比特(RBSP trailing bits:一個bit“1”,若干比特“0”),以便字節對齊;
③ EBSP 擴展字節序列載荷 —- 》 在RBSP基礎上填加了仿校驗字節(0X03)它的原因是:在NALU加到Annexb上時,需要添加每組NALU之前的開始碼StartCodePrefix,如果該NALU對應的slice為一幀的開始則用4位字節表示0x00000001,否則用3位字節表示0x000001(是一幀的一部分)。另外,為了使NALU主體中不包括與開始碼相沖突的,在編碼時,每遇到兩個字節連續為0,就插入一個字節的0x03。解碼時將0x03去掉。也稱為脫殼操作。
3.2.2.H.264/AVC結構分析
H.264從層次來看分為兩層:視頻編碼層(VCL,Video Coding Layer)和網絡提取層(NAL,Network Abstraction Layer)。VCL輸出的是原始數據比特流(SODB,String of data bits),表示H.264的語法元素編碼完成后的實際的原始二進制碼流。SODB通常不能保證字節對齊,故需要補齊為原始字節序列負荷(RBSP,Raw Byte Sequence Payload)。NAL層實際上就是最終輸出的H.264碼流,它是由一個個NALU組成的,每個NALU包括一組對應于視頻編碼數據的NAL頭信息和一個原始字節序列負荷(RBSP,Raw Byte Sequence Payload)。以上名詞之間的關系如下:
RBSP = SODB + RBSP trailing bits NALU = NAL header(1 byte) + RBSP H.264 = Start Code Prefix(3 bytes) + NALU + Start Code Prefix(3 bytes) + NALU +…
所以H.264碼流的結構如下:
H.264碼流層次結構為:
編碼器將每個NALU各自獨立、完整地放入一個分組,因為分組都有頭部,解碼器可以方便地檢測出NALU的分界,并依次取出NALU進行解碼。每個NALU之間由起始碼(Start Code Prefix)分隔,起始碼分為兩種:0x000001(3 bytes)or 0x00000001(4 bytes),解碼器檢測每個起始碼,作為一個NALU的起始標識,當檢測到下一個起始碼時,當前NALU結束。如果NALU 對應的Slice 為一幀的開始,則用4 字節表示,即0x00000001;否則用3 字節表示,0x000001。NALU針對起始碼設計了防止沖突機制,如果編碼器檢測到NALU數據存在0x000000,0x000001,0x000002或0x000003時,編碼器會在最后一個字節前插入一個新的字節0x03,如下:
0x00 00 00 -》 0x00 00 03 00
0x00 00 01 -》 0x00 00 03 01
0x00 00 02 -》 0x00 00 03 02
0x00 00 03 -》 0x00 00 03 03
解碼器檢測到0x000003時,把03拋棄,恢復原始數據(脫殼操作)。解碼器在解碼時,首先逐個字節讀取NALU的數據,統計NALU的長度,然后再開始解碼。
3.2.3.H.264/AVC解碼
一個NALU就是編碼后的一幀數據。每個NAL單元是一個一定語法元素的可變長字節字符串,包括一個字節的頭信息(用來表示數據類型),以及若干整數字節的負荷數據。一個NAL單元可以攜帶一個編碼片、A/B/C型數據分割或一個序列或圖像參數集。NALU頭用來標識后面的RBSP是什么類型的數據,它是否會被其他幀參考以及網絡傳輸是否有錯誤。
NAL的解碼單元的流程如下:
(1)NAL header是一個字節(length = 1byte):
forbidden_bit(1bit) + nal_reference_bit(2bit) + nal_unit_type(5bit)
① forbidden_bit:禁止位,初始為0,當網絡發現NAL單元有比特錯誤時可設置該比特為1,以便接收方糾錯或丟掉該單元。
② nal_reference_bit:nal重要性指示,標志該NAL單元的重要性,取值范圍為0~3,值越大,越重要,解碼器在解碼處理不過來的時候,可以丟掉重要性為0的NALU。H.264規定,如果當前NALU是序列參數集,或是圖像參數等,該值必須大于0。比如nal_unit_type等于5時,nal_reference_bit大于0;nal_unit_type等于6,9,10,11或12時,nal_reference_bit等于0。
不同類型的NALU的重要性指示如下表所示。
Nal_unit_type NAL類型 Nal_reference_bit
0 未使用 0
1 非IDR的片 此片屬于參考幀,則不等于0,不屬于參考幀,則等于0
2 片數據A分區 同上
3 片數據B分區 同上
4 片數據C分區 同上
5 IDR圖像的片 5
6 補充增強信息單元(SEI) 0
7 序列參數集 非0
8 圖像參數集 非0
9 分界符 0
10 序列結束 0
11 碼流結束 0
12 填充 0
13…23 保留 0
24…31 不保留 0
所謂參考幀,就是在其他幀解碼時需要參照的幀。比如一個I幀可能被一個或多個B幀參考,一個B幀可能被某個P幀參考。
從這個表我們也可以看出來,DIR的I幀是非常重要的,它一丟,那么這個序列的所有幀都沒辦法解碼了;序列參數集和圖像參數集也很重要,沒有序列參數集,這個序列的幀就沒法解;沒有圖像參數集,那用到這個圖像參數集的幀都沒法解。
③ nal_unit_type:NALU類型取值如下表所示:
Nal_unit_type NAL類型 C
0 未使用
1 非IDR圖像中不采用數據劃分的片段 2,3,4
2 非IDR圖像中A類數據劃分片段 2
3 非IDR圖像中B類數據劃分片段 3
4 非IDR圖像中C類數據劃分片段 4
5 IDR圖像的片 2,3
6 補充增強信息單元(SEI) 5
7 序列參數集 0
8 圖像參數集 1
9 分界符 6
10 序列結束 7
11 碼流結束 8
12 填充 9
13…23 保留
24…31 不保留(RTP打包時會用到)
RTP打包時的擴展類型
24 STAP-A Single-time aggregation packet
25 STAP-B Single-time aggregation packet
26 MTAP16 Multi-time aggregation packet
27 MTAP24 Multi-time aggregation packet
28 FU-A Fragmentation unit
29 FU-B Fragmentation unit
30-31 undefined
NALU的順序要求:
H.264/AVC標準對送到解碼器的NAL單元順序是有嚴格要求的,如果NAL單元的順序是混亂的,必須將其重新依照規范組織后送入解碼器,否則解碼器不能夠正確解碼。
1)序列參數集NAL單元
必須在傳送所有以此參數集為參考的其他NAL單元之前傳送,不過允許這些NAL單元中間出現重復的序列參數集NAL單元。
所謂重復的詳細解釋為:序列參數集NAL單元都有其專門的標識,如果兩個序列參數集NAL單元的標識相同,就可以認為后一個只不過是前一個的拷貝,而非新的序列參數集。
2)圖像參數集NAL單元
必須在所有以此參數集為參考的其他NAL單元之前傳送,不過允許這些NAL單元中間出現重復的圖像參數集NAL單元,這一點與上述的序列參數集NAL單元是相同的。
3)不同基本編碼圖像中的片段(slice)單元和數據劃分片段(data partition)單元在順序上不可以相互交叉,即不允許屬于某一基本編碼圖像的一系列片段(slice)單元和數據劃分片段(data partition)單元中忽然出現另一個基本編碼圖像的片段(slice)單元片段和數據劃分片段(data partition)單元。
4)參考圖像的影響:如果一幅圖像以另一幅圖像為參考,則屬于前者的所有片段(slice)單元和數據劃分片段(data partition)單元必須在屬于后者的片段和數據劃分片段之后,無論是基本編碼圖像還是冗余編碼圖像都必須遵守這個規則。
5)基本編碼圖像的所有片段(slice)單元和數據劃分片段(data partition)單元必須在屬于相應冗余編碼圖像的片段(slice)單元和數據劃分片段(data partition)單元之前。
6)如果數據流中出現了連續的無參考基本編碼圖像,則圖像序號小的在前面。
7)如果arbitrary_slice_order_allowed_flag置為1,一個基本編碼圖像中的片段(slice)單元和數據劃分片段(data partition)單元的順序是任意的,如果arbitrary_slice_order_allowed_flag置為零,則要按照片段中第一個宏塊的位置來確定片段的順序,若使用數據劃分,則A類數據劃分片段在B類數據劃分片段之前,B類數據劃分片段在C類數據劃分片段之前,而且對應不同片段的數據劃分片段不能相互交叉,也不能與沒有數據劃分的片段相互交叉。
8)如果存在SEI(補充增強信息)單元的話,它必須在它所對應的基本編碼圖像的片段(slice)單元和數據劃分片段(data partition)單元之前,并同時必須緊接在上一個基本編碼圖像的所有片段(slice)單元和數據劃分片段(data partition)單元后邊。假如SEI屬于多個基本編碼圖像,其順序僅以第一個基本編碼圖像為參照。
9)如果存在圖像分割符的話,它必須在所有SEI 單元、基本編碼圖像的所有片段slice)單元和數據劃分片段(data partition)單元之前,并且緊接著上一個基本編碼圖像那些NAL單元。
10)如果存在序列結束符,且序列結束符后還有圖像,則該圖像必須是IDR(即時解碼器刷新)圖像。序列結束符的位置應當在屬于這個IDR圖像的分割符、SEI 單元等數據之前,且緊接著前面那些圖像的NAL單元。如果序列結束符后沒有圖像了,那么它的就在比特流中所有圖像數據之后。
11)流結束符在比特流中的最后。
(2)RBSP
RBSP數據是下表中的一種:
RBSP類型 縮寫 描述
參數集 PS 序列的全局信息,如圖像尺寸、視頻格式等
增強信息 SEI 視頻序列解碼的增強信息
圖像界定符 PD 視頻圖像的邊界
編碼片 SLICE 編碼片的頭信息和數據
數據分割 DP片層的數據,用語錯誤恢復解碼
序列結束符 表明一個序列的結束,下一個圖像為IDR圖像
流結束符 表明該流中已沒有圖像
填充數據 亞元數據,用于填充字節
從前面的分析我們知道,VCL層出來的是編碼完的視頻幀數據,這些幀可能是I、B、P幀,而且這些幀可能屬于不同的序列,再者同一個序列還有相對應的一套序列參數集和圖片參數集等等,所以要完成視頻的解碼,不僅需要傳輸VCL層編碼出來的視頻幀數據,還需要傳輸序列參數集、圖像參數集等數據。
參數集:包括序列參數集 SPS和圖像參數集 PPS。SPS包含的是針對一連續編碼視頻序列的參數,如標識符 seq_parameter_set_id、幀數及 POC 的約束、參考幀數目、解碼圖像尺寸和幀場編碼模式選擇標識等等。PPS對應的是一個序列中某一幅圖像或者某幾幅圖像,其參數如標識符 pic_parameter_set_id、可選的 seq_parameter_set_id、熵編碼模式選擇標識、片組數目、初始量化參數和去方塊濾波系數調整標識等等。
數據分割:組成片的編碼數據存放在3個獨立的DP(數據分割,A、B、C)中,各自包含一個編碼片的子集。分割A包含片頭和片中每個宏塊頭數據。分割B包含幀內和 SI 片宏塊的編碼殘差數據。分割 C包含幀間宏塊的編碼殘差數據。每個分割可放在獨立的 NAL 單元并獨立傳輸。
3.2.4.H.264封裝模式
H.264有兩種封裝模式:
(1)annexb模式:傳統模式,有start code, SPS和PPS是在ES中;
(2)mp4模式:沒有start code,SPS和PPS是封裝在container中,每一個frame前面是這個frame的長度;SPS的頭部是0x67,PPS的頭部是0x68,要保持對數據的敏感性。
4.VC-1編碼技術?
VC-1即Video Codec One(視頻解碼方案一)。它起源于微軟公司的Windows Media Video 9。VC-1是繼MPEG-2 TS和H.264之后,最后被認可的高清編碼標準格式。VC-1雖然是最后被認可的高清編碼格式,不過因為有微軟的后臺,所以這種編碼格式不能小窺。相對于MPEG2,VC-1的壓縮比更高,但相對于H.264而言,編碼解碼的計算則要稍小一些。
總的來說,從壓縮比上來看,H.264的壓縮比率更高一些,也就是同樣的視頻,通過H.264編碼算法壓出來的視頻容量要比VC-1的更小,但是VC-1格式的視頻在解碼計算方面則更小一些,一般通過高性能的CPU就可以很流暢的觀看高清視頻。目前來看,VC-1可能是一個比較好的平衡,輔以微軟的支持,應該是一只不可忽視的力量。一般來說,VC-1多為 “.wmv”后綴,但這都不是絕對的,具體的編碼格式還是要通過軟件來查詢。
5.WMV編碼技術
WMV(Windows Media Video)是微軟開發的一系列視頻編解碼和其相關的視頻編碼格式的統稱,是微軟Windows媒體框架的一部分。WMV包含三種不同的編解碼:作為RealVideo的競爭對手,最初為Internet上的流應用而設計開發的WMV原始的視頻壓縮技術;另一種是為滿足特定內容需要的WMV屏幕和WMV圖像的壓縮技術;在經過SMPTE(Society of Motion Picture and Television Engineers)學會標準化以后,WMV版本9被采納作為物理介質的發布格式,比如高清DVD和藍光光碟,即所謂的VC-1。
微軟也開發了一種稱之為ASF(Advanced Systems Format)的數字容器格式,用來保存WMV的視頻編碼。在同等視頻質量下,WMV格式的文件可以邊下載邊播放,因此很適合在網上播放和傳輸。
6.Divx、Xvid編碼技術
我們還可以經常看的到Divx、Xvid,這兩個也很容易弄混。
其實兩者確實有很大淵源。DivX是一種將影片的音頻由MP3來壓縮、視頻由MPEG-4技術來壓縮的數字多媒體壓縮格式。DivX就是從微軟公司MPEG-4 v3編碼技術中派生出的最為知名以及被廣大DVDRipper廣泛采用的視頻編碼技術。用它編碼的視頻文件不僅最大程度上還原了DVD原本的畫面質量,而且可以允許你選擇幾乎所有格式的音頻。它的視頻部分采用的是微軟的MPEG-4技術進行壓縮,而音頻部分則是采用MP3或WMA進行壓縮,然后把視頻和音頻部分進行完美組合成讓我們耳目一新的AVI文件,就是DivX影片了。DivX最早是由國外的一名電腦游戲玩家和一名黑客制作,他們破解了微軟的MPEG-4視頻壓縮算法而后重新改寫并重新命名為DivX。
XviD是目前世界上最常用的視頻編碼解碼器(codec),而且是第一個真正開放源代碼的,通過GPL協議發布。在很多次的codec比較中,XviD的表現令人驚奇的好,總體來說是目前最優秀、最全能的codec??梢哉fXviD是與Divx一脈相承而又有所加強的。
評論
查看更多