H.264 AVC 编解码标准
一、H264 概述
H.264,通常也被稱之為H.264/AVC(或者H.264/MPEG-4 AVC或MPEG-4/H.264 AVC)
H.264的出現(xiàn)就是為了創(chuàng)建比以前的視頻壓縮標(biāo)準(zhǔn)更高效的壓縮標(biāo)準(zhǔn),使用更好高效的視頻壓縮算法來(lái)壓縮視頻的占用空間,提高存儲(chǔ)和傳輸?shù)男?#xff0c;在獲得有效的壓縮效果的同時(shí),使得壓縮過(guò)程引起的失真最小。MPEG-4 AVC和H.264 是目前較為主流的編碼標(biāo)準(zhǔn)。主要定義了兩方面的內(nèi)容:視頻數(shù)據(jù)壓縮形式的編碼表示和用重建視頻信息的語(yǔ)法來(lái)描述編碼方法。目的是為了保證兼容的編碼器能夠成功的交互工作,同時(shí)也允許制造廠商自由的開(kāi)發(fā)具有競(jìng)爭(zhēng)力的創(chuàng)新產(chǎn)品。制造廠商只需要注意的事情就是能夠獲得和標(biāo)準(zhǔn)中采用的方法同樣的結(jié)果。
提到H.264編解碼,我們先簡(jiǎn)單說(shuō)一下視頻壓縮算法。視頻壓縮算法是通過(guò)去除時(shí)間、空間的冗余來(lái)實(shí)現(xiàn)的。在一段時(shí)間內(nèi),相鄰的圖像的像素、亮度與色溫的差別很小,我們沒(méi)比要對(duì)每一個(gè)圖像進(jìn)行完成的編碼,而是可以選取這段時(shí)間的第一張圖(也就是第一幀)作為完整的編碼,而后面一段時(shí)間的圖像只需要記錄與第一張圖(第一幀)在像素、亮度、色溫等方面的差別數(shù)據(jù)即可。通過(guò)去除不同類(lèi)型的冗余,可以明顯的壓縮數(shù)據(jù),代價(jià)就是一部分信息失真。
H.264編解碼在整個(gè)視頻數(shù)據(jù)處理過(guò)程中,屬于視頻數(shù)據(jù)處理的編解碼層,具體的可以查看本人總結(jié)的編解碼流程圖中的解碼部分:Thinking-in-AV/音視頻編解碼/音視頻解碼流程概覽.png。編碼部分將流程反過(guò)來(lái)進(jìn)行理解即可。
二、H.264相關(guān)概念
在H.264定義的結(jié)構(gòu)中,一個(gè)視頻圖像編碼后的數(shù)據(jù)叫做一幀。 一幀是由一個(gè)或多個(gè)片(slice)組成的,一個(gè)片是由一個(gè)或多個(gè)宏塊(MB)組成的(宏塊是H264編碼的基本單位),一個(gè)宏塊是由16x16的yuv數(shù)據(jù)組成的。
在H.264的協(xié)議中,定義了三類(lèi)幀,分別是I幀、B幀和P幀。其中I幀就是之前我們所說(shuō)的一個(gè)完整的圖像幀,而B(niǎo)幀和P幀對(duì)應(yīng)的就是之前說(shuō)的不對(duì)全部圖像做編碼的幀。B幀和P幀的差別在于,P幀是參考之前的I幀生成的,B幀是參考前后的圖像幀生成的。
在視頻畫(huà)面播放過(guò)程中,若I幀丟失了,則后面的P幀也就隨著解不出來(lái),就會(huì)出現(xiàn)視頻畫(huà)面黑屏的現(xiàn)象;若P幀丟失了,則視頻畫(huà)面會(huì)出現(xiàn)花屏、馬賽克等現(xiàn)象。
一個(gè)GOP(Group Of Picture)就是一組連續(xù)的畫(huà)面。GOP結(jié)構(gòu)一般有兩個(gè)數(shù)字,其中一個(gè)是GOP的長(zhǎng)度(即兩個(gè)I幀之間的B幀和P幀數(shù)),另一個(gè)數(shù)字為I幀和P幀之間的間隔距離(即B幀數(shù))。在一個(gè)GOP內(nèi)I幀解碼不依賴任何的其它幀,P幀解碼則依賴前面的I幀或P幀,B幀解碼依賴前面的I幀或P幀及其后最近的一個(gè)P幀。
注意:在碼率不變的前提下,GOP值越大,P、B幀的數(shù)量會(huì)越多,平均每個(gè)I、P、B幀所占用的字節(jié)數(shù)就越多,也就更容易獲取較好的圖像質(zhì)量;Reference越大,B幀的數(shù)量越多,同理也更容易獲得較好的圖像質(zhì)量。但是通過(guò)提高GOP值來(lái)提高圖像質(zhì)量是有限度的。H264編碼器在遇到場(chǎng)景切換的情況時(shí),會(huì)自動(dòng)強(qiáng)制插入一個(gè)I幀,此時(shí)實(shí)際的GOP值被縮短了。另一方面,在一個(gè)GOP中,P、B幀是由I幀預(yù)測(cè)得到的,當(dāng)I幀的圖像質(zhì)量比較差時(shí),會(huì)影響到一個(gè)GOP中后續(xù)P、B幀的圖像質(zhì)量,直到下一個(gè)GOP開(kāi)始才有可能得以恢復(fù),所以GOP值也不宜設(shè)置過(guò)大。同時(shí),由于P、B幀的復(fù)雜度大于I幀,所以過(guò)多的P、B幀會(huì)影響編碼效率,使編碼效率降低。另外,過(guò)長(zhǎng)的GOP還會(huì)影響Seek操作的響應(yīng)速度,由于P、B幀是由前面的I或P幀預(yù)測(cè)得到的,所以Seek操作需要直接定位,解碼某一個(gè)P或B幀時(shí),需要先解碼得到本GOP內(nèi)的I幀及之前的N個(gè)預(yù)測(cè)幀才可以,GOP值越長(zhǎng),需要解碼的預(yù)測(cè)幀就越多,seek響應(yīng)的時(shí)間也越長(zhǎng)。
GOP中的I幀又分為普通I幀和IDR幀,IDR幀就是GOP的第一個(gè)I幀,這樣區(qū)分視為了方便控制編碼和解碼的流程。 IDR幀一定是I幀,但是I幀不一定是IDR幀。
IDR幀因?yàn)楦綆PS、PPS等信息,解碼器在收到 IDR?幀時(shí),需要做的工作就是:把所有的?PPS?和?SPS?參數(shù)進(jìn)行更新。
可以看出來(lái)IDR幀的作用是讓解碼器立刻刷新相關(guān)數(shù)據(jù)信息,避免出現(xiàn)較大的解碼錯(cuò)誤問(wèn)題。
引入IDR幀機(jī)制是為了解碼的重同步,當(dāng)解碼器解碼到 IDR幀時(shí),立即將參考幀隊(duì)列清空,將已解碼的數(shù)據(jù)全部輸出或拋棄,重新查找參數(shù)集,開(kāi)始一個(gè)新的序列。這樣,如果前一個(gè)序列出現(xiàn)錯(cuò)誤,在這里可以獲得重新同步的機(jī)會(huì)。IDR幀之后的幀永遠(yuǎn)不會(huì)使用IDR幀之前的數(shù)據(jù)來(lái)解碼。
三、H.264 壓縮方式
H264 的核心壓縮算法是幀內(nèi)壓縮和幀間壓縮,幀內(nèi)壓縮是生成I幀的算法,幀間壓縮是生成B幀和P幀的算法。
幀內(nèi)(Intraframe)壓縮的原理是:當(dāng)壓縮一幀圖像時(shí),僅考慮本幀的數(shù)據(jù)而不考慮相鄰幀之間的冗余信息,一般采用有損壓縮算法,由于幀內(nèi)壓縮是編碼一個(gè)完整的圖像,所以可以獨(dú)立的解碼、顯示。幀內(nèi)壓縮率一般不高。
幀間(Interframe)壓縮的原理是:相鄰幾幀的數(shù)據(jù)有很大的相關(guān)性,或者說(shuō)前后兩幀信息變化很小的特點(diǎn)。連續(xù)的視頻其相鄰幀之間具有冗余信息,根據(jù)這一特性,壓縮相鄰幀之間的冗余量就可以進(jìn)一步提高壓縮量,減小壓縮比。
而幀間壓縮也稱為時(shí)間壓縮(Temporalcompression),它通過(guò)比較時(shí)間軸上不同幀之間的數(shù)據(jù)進(jìn)行壓縮。幀間壓縮是無(wú)損的,它通過(guò)比較本幀與相鄰幀之間的差異,僅記錄本幀與其相鄰幀的差值,這樣可以大大減少數(shù)據(jù)量。
H.264壓縮視頻數(shù)據(jù)時(shí)的具體方式如下:
a). 分組,也就是將一系列變換不大的圖像歸為一個(gè)組,即一個(gè)GOP;
b). 定義幀,將每組的圖像幀歸分為I幀、P幀和B幀三種類(lèi)型;
c). 預(yù)測(cè)幀, 以I幀做為基礎(chǔ)幀,以I幀預(yù)測(cè)P幀,再由I幀和P幀預(yù)測(cè)B幀;
d). 數(shù)據(jù)傳輸, 最后將I幀數(shù)據(jù)與預(yù)測(cè)的差值信息進(jìn)行存儲(chǔ)和傳輸。
四、H.264 分層結(jié)構(gòu)
H.264的主要目標(biāo)是為了有高的視頻壓縮比和良好的網(wǎng)絡(luò)親和性,H264將系統(tǒng)框架分為兩個(gè)層面,分別是視頻編碼層面(VCL)和網(wǎng)絡(luò)抽象層面(NAL)。
VLC層:包括核心壓縮引擎和塊,宏塊和片的語(yǔ)法級(jí)別定義,設(shè)計(jì)目標(biāo)是盡可能地獨(dú)立于網(wǎng)絡(luò)進(jìn)行高效的編碼;
NAL層:負(fù)責(zé)將VCL產(chǎn)生的比特字符串適配到各種各樣的網(wǎng)絡(luò)和多元環(huán)境中,覆蓋了所有片級(jí)以上的語(yǔ)法級(jí)別。
H.264原始碼流(裸流)是由一個(gè)接一個(gè)NALU組成,結(jié)構(gòu)如下圖,一個(gè)NALU = 一組對(duì)應(yīng)于視頻編碼的NALU頭部信息 + 一個(gè)原始字節(jié)序列負(fù)荷(RBSP,Raw Byte Sequence Payload)。
一個(gè)原始的H.264 NALU 單元常由 [StartCode] [NALU Header] [NALU Payload] 三部分組成。
3.1 Start Code
Start Code 用于標(biāo)示這是一個(gè)NALU 單元的開(kāi)始,必須是”00 00 00 01” 或”00 00 01”。
3.2. NAL Header
NAL Header由三部分組成,forbidden_bit(1bit),nal_reference_bit(2bits)(優(yōu)先級(jí)),nal_unit_type(5bits)(類(lèi)型)。
3.3?RBSP(Raw Byte Sequence Payload))
下圖是RBSP的序列的樣例及相關(guān)類(lèi)型參數(shù)的描述表:
SPS是序列參數(shù)集,包含的是針對(duì)一連續(xù)編碼視頻序列的參數(shù),如標(biāo)識(shí)符 seq_parameter_set_id、幀數(shù)及 POC 的約束、參考幀數(shù)目、解碼圖像尺寸和幀場(chǎng)編碼模式選擇標(biāo)識(shí)等等。?
PPS是圖像參數(shù)集,對(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ù)集是一個(gè)獨(dú)立的數(shù)據(jù)單位,不依賴于參數(shù)集之外的其他句法元素。一個(gè)參數(shù)集不對(duì)應(yīng)某一個(gè)特定的圖像或者序列,同一個(gè)序列參數(shù)集可以被一個(gè)或者多個(gè)圖像參數(shù)集引用。同理,一個(gè)圖像參數(shù)集也可以被一個(gè)或者多個(gè)圖像引用。只有在編碼器認(rèn)為需要更新參數(shù)集的內(nèi)容時(shí),才會(huì)發(fā)出新的參數(shù)集。?
五、H.264 局限性
隨著數(shù)字視頻應(yīng)用產(chǎn)業(yè)鏈的快速發(fā)展,視頻應(yīng)用向以下幾個(gè)方向發(fā)展的趨勢(shì)愈加明顯:
(1)?高清晰度(HigherDefinition):數(shù)字視頻的應(yīng)用格式從720P向1080P全面升級(jí),而且現(xiàn)在4K的數(shù)字視頻格式也已經(jīng)成為常見(jiàn)。
(2)?高幀率(Higherframe rate ):數(shù)字視頻幀率從30fps向60fps、120fps甚至240fps的應(yīng)用場(chǎng)景升級(jí);
(3)?高壓縮率(HigherCompression rate ):傳輸帶寬和存儲(chǔ)空間一直是視頻應(yīng)用中最為關(guān)鍵的資源,因此,在有限的空間和管道中獲得最佳的視頻體驗(yàn)一直是用戶的不懈追求。
但是面對(duì)視頻應(yīng)用不斷向高清晰度、高幀率、高壓縮率方向發(fā)展的趨勢(shì),當(dāng)前主流的視頻壓縮標(biāo)準(zhǔn)協(xié)議H.264的局限性不斷凸顯。主要體現(xiàn)在:
(1)?宏塊個(gè)數(shù)的爆發(fā)式增長(zhǎng),會(huì)導(dǎo)致用于編碼宏塊的預(yù)測(cè)模式、運(yùn)動(dòng)矢量、參考幀索引和量化級(jí)等宏塊級(jí)參數(shù)信息所占用的碼字過(guò)多,用于編碼殘差部分的碼字明顯減少。
(2)?由于分辨率的大大增加,單個(gè)宏塊所表示的圖像內(nèi)容的信息大大減少,這將導(dǎo)致相鄰的4 x 4或8 x 8塊變換后的低頻系數(shù)相似程度也大大提高,導(dǎo)致出現(xiàn)大量的冗余。
(3)?由于分辨率的大大增加,表示同一個(gè)運(yùn)動(dòng)的運(yùn)動(dòng)矢量的幅值將大大增加,H.264中采用一個(gè)運(yùn)動(dòng)矢量預(yù)測(cè)值,對(duì)運(yùn)動(dòng)矢量差編碼使用的是哥倫布指數(shù)編碼,該編碼方式的特點(diǎn)是數(shù)值越小使用的比特?cái)?shù)越少。因此,隨著運(yùn)動(dòng)矢量幅值的大幅增加,H.264中用來(lái)對(duì)運(yùn)動(dòng)矢量進(jìn)行預(yù)測(cè)以及編碼的方法壓縮率將逐漸降低。
(4) H.264的一些關(guān)鍵算法例如采用CAVLC和CABAC兩種基于上下文的熵編碼方法、deblock濾波等都要求串行編碼,并行度比較低。針對(duì)GPU/DSP/FPGA/ASIC等并行化程度非常高的CPU,H.264的這種串行化處理越來(lái)越成為制約運(yùn)算性能的瓶頸。
于是面向更高清晰度、更高幀率、更高壓縮率視頻應(yīng)用的HEVC(H.265)協(xié)議標(biāo)準(zhǔn)應(yīng)運(yùn)而生。H.265在H.264標(biāo)準(zhǔn)2~4倍的復(fù)雜度基礎(chǔ)上,將壓縮效率提升一倍以上。
(注意:實(shí)際使用過(guò)程中,不能忽視265專利費(fèi)用這個(gè)重要的問(wèn)題。專利問(wèn)題參考:H.265成超級(jí)提款機(jī) 一場(chǎng)圍繞專利授權(quán)的戰(zhàn)爭(zhēng)已經(jīng)爆發(fā))
總結(jié)
以上是生活随笔為你收集整理的H.264 AVC 编解码标准的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 西班牙语基础必备词汇(动物和食物)
- 下一篇: H.264/AVC的编码格式