點(diǎn)擊左上方藍(lán)色“一口Linux”,選擇“設(shè)為星標(biāo)”

H264,通常也被稱之為H264/AVC(或者H.264/MPEG-4 AVC或MPEG-4/H.264 AVC)

對(duì)攝像頭采集的每一幀視頻需要進(jìn)行編碼,由于視頻中存在空間和時(shí)間的冗余,需要用算法來(lái)去除這些冗余。H264是專門去除這些冗余的算法,我們把這種算法稱為H264編碼。
H264的出現(xiàn)就是為了創(chuàng)建比以前的視頻壓縮標(biāo)準(zhǔn)更高效的壓縮標(biāo)準(zhǔn),使用更好高效的視頻壓縮算法來(lái)壓縮視頻的占用空間,提高存儲(chǔ)和傳輸?shù)男剩讷@得有效的壓縮效果的同時(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)品。
提到H264編解碼,先簡(jiǎn)單說(shuō)一下視頻壓縮算法。視頻壓縮算法是通過(guò)去除時(shí)間、空間的冗余來(lái)實(shí)現(xiàn)的。在一段時(shí)間內(nèi),相鄰的圖像的像素、亮度與色溫的差別很小,我們沒(méi)必要對(duì)每一個(gè)圖像進(jìn)行完整的編碼,而是可以選取這段時(shí)間的第一張圖(也就是第一幀)作為完整的編碼,而后面一段時(shí)間的圖像只需要記錄與第一張圖(第一幀)在像素、亮度、色溫等方面的差別數(shù)據(jù)即可。通過(guò)去除不同類型的冗余,可以明顯的壓縮數(shù)據(jù),代價(jià)就是一部分信息失真。
像大多數(shù)看到的視頻,如rmvb、avi、mp4、flv大多數(shù)是由h264進(jìn)行編碼,當(dāng)然也會(huì)有不同的,如mpeg4、vp9這樣冷門的編碼
無(wú)論是H264、mpeg4、vp9都是基于宏塊的方式進(jìn)行編碼,原理都是一樣的,只不過(guò)實(shí)現(xiàn)的算法不一樣罷了。
H264視頻編碼發(fā)展歷程

封裝格式(也叫容器),就是將已經(jīng)編碼壓縮好的視頻軌和音頻軌按照一定的格式放到一個(gè)文件中,也就是說(shuō)僅僅是一個(gè)外殼,或者把它當(dāng)成一個(gè)放視頻軌和音頻軌的文件夾也可以。說(shuō)得通俗點(diǎn),視頻軌相當(dāng)于飯,而音頻軌相當(dāng)于菜,封裝格式就是一個(gè)碗,或者一個(gè)鍋,用來(lái)盛放飯菜的容器。 下面是幾種常用的視頻文件后綴類型與其相對(duì)應(yīng)的封裝格式。

視頻編碼的作用: 將視頻像素?cái)?shù)據(jù)(RGB,YUV 等)壓縮成視頻碼流,從而降低視頻的數(shù)據(jù)量。常用的音頻編碼方式有以下幾種:

音頻編碼的作用: 將音頻采樣數(shù)據(jù)(PCM 等)壓縮成音頻碼流,從而降低音頻的數(shù)據(jù)量。 常用的音頻編碼方式有以下幾種:

1 MP3 MP3,英文全稱 MPEG-1 or MPEG-2 Audio Layer III,是曾經(jīng)非常流行的一種數(shù)字音頻編碼和有損壓縮格式,它被設(shè)計(jì)來(lái)大幅降低音頻數(shù)據(jù)量。它是在 1991 年,由位于德國(guó)埃爾朗根的研究組織 Fraunhofer-Gesellschaft 的一組工程師發(fā)明和標(biāo)準(zhǔn)化的。MP3 的普及,曾對(duì)音樂(lè)產(chǎn)業(yè)造成極大的沖擊與影響。
2 AAC AAC,英文全稱 Advanced Audio Coding,是由 Fraunhofer IIS、杜比實(shí)驗(yàn)室、AT&T、Sony 等公司共同開(kāi)發(fā),在 1997 年推出的基于 MPEG-2 的音頻編碼技術(shù)。2000 年,MPEG-4 標(biāo)準(zhǔn)出現(xiàn)后,AAC 重新集成了其特性,加入了 SBR 技術(shù)和 PS 技術(shù),為了區(qū)別于傳統(tǒng)的 MPEG-2 AAC 又稱為 MPEG-4 AAC。 AAC 比 MP3 有更高的壓縮比,同樣大小的音頻文件,AAC 的音質(zhì)更高。
3 WMA WMA,英文全稱 Windows Media Audio,由微軟公司開(kāi)發(fā)的一種數(shù)字音頻壓縮格式,本身包括有損和無(wú)損壓縮格式。
我們播放的視頻文件一般都是用一種封裝格式封裝起來(lái)的,封裝格式的作用是什么呢?一般視頻文件里不光有視頻,還有音頻,封裝格式的作用就是把視頻和音頻打包起來(lái)。 所以我們先要解封裝格式,看有哪些視頻流和哪些音頻流,此時(shí)的音頻流和視頻流都還是壓縮數(shù)據(jù),不能直接用于顯示的,這就需要解碼。下面是播放一個(gè)視頻文件時(shí)的流程圖。

三、H264相關(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é)議中,定義了三類幀,分別是I幀、B幀和P幀。其中I幀就是一個(gè)完整的圖像幀,而B(niǎo)幀和P幀對(duì)應(yīng)的就是之前說(shuō)的不對(duì)全部圖像做編碼的幀。B幀和P幀的差別在于,P幀是參考之前的I幀生成的,B幀是參考前后的圖像幀生成的。
在視頻畫面播放過(guò)程中,若I幀丟失了,則后面的P幀也就隨著解不出來(lái),就會(huì)出現(xiàn)視頻畫面黑屏的現(xiàn)象;若P幀丟失了,則視頻畫面會(huì)出現(xiàn)花屏、馬賽克等現(xiàn)象。
一個(gè)GOP(Group Of Picture)就是一組連續(xù)的畫面。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)解碼。
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í)的具體方式如下:
1). 分組,也就是將一系列變換不大的圖像歸為一個(gè)組,即一個(gè)GOP;
2). 定義幀,將每組的圖像幀歸分為I幀、P幀和B幀三種類型;
3). 預(yù)測(cè)幀, 以I幀做為基礎(chǔ)幀,以I幀預(yù)測(cè)P幀,再由I幀和P幀預(yù)測(cè)B幀;
4). 數(shù)據(jù)傳輸, 最后將I幀數(shù)據(jù)與預(yù)測(cè)的差值信息進(jìn)行存儲(chǔ)和傳輸。
H264的主要目標(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組成,NALU通常由[StartCode] [NALU Header] [NALU Payload] 三部分組成,其中 Start Code 用于標(biāo)示這是一個(gè)NALU 單元的開(kāi)始,必須是"00 00 00 01" 或"00 00 01"。

Start Code 用于標(biāo)示這是一個(gè)NALU 單元的開(kāi)始,必須是”00 00 00 01” 或”00 00 01”。
NAL Header由三部分組成,forbidden_bit(1bit),nal_reference_bit(2bits)(優(yōu)先級(jí)),nal_unit_type(5bits)(類型)。
禁止位,初始為0,當(dāng)網(wǎng)絡(luò)發(fā)現(xiàn)NAL單元有比特錯(cuò)誤時(shí)可設(shè)置該比特為1,以便接受方糾錯(cuò)或丟掉該單元。
NAL重要性,值越大,越重要,解碼器在解碼處理不過(guò)來(lái)的時(shí)候,可以丟掉重要性為0的NALU。

下圖是RBSP的序列的樣例及相關(guān)類型參數(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í)等等。

為了使NALU主體不包括起始碼,在編碼時(shí)每遇到兩個(gè)字節(jié)(連續(xù))的0,就插入一字節(jié)0x03,以和起始碼相區(qū)別。解碼時(shí),則將相應(yīng)的0x03刪除掉。

NAL單元解碼的流程為:首先從NAL單元中提取出RBSP語(yǔ)法結(jié)構(gòu),然后按照上圖所示的流程處理RBSP語(yǔ)法結(jié)構(gòu)。輸入的是NAL單元,輸出結(jié)果是經(jīng)過(guò)解碼的當(dāng)前圖像的樣值點(diǎn)。 NAL單元中分別包含了序列參數(shù)集和圖像參數(shù)集。圖像參數(shù)集和序列參數(shù)集在其他NAL單元傳輸過(guò)程中作為參考使用,在這些數(shù)據(jù)NAL單元的片頭中,通過(guò)語(yǔ)法元素pic_parameter_set_id設(shè)置它們所使用的圖像參數(shù)集編號(hào);而相應(yīng)的每個(gè)圖像參數(shù)集中,通過(guò)語(yǔ)法元素seq_paramter_set_id設(shè)置他們使用的序列參數(shù)集編號(hào)。
隨著數(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ā))
end
一口Linux?
關(guān)注,回復(fù)【1024】海量Linux資料贈(zèng)送
精彩文章合集
文章推薦