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