H264編碼原理以及I幀B幀P幀

轉(zhuǎn)載只為記錄些阅,方便查閱龟劲,原文:http://blog.sina.com.cn/s/blog_4ad7c2540101me90.html

前言

H264是新一代的編碼標(biāo)準(zhǔn),以高壓縮高質(zhì)量和支持多種網(wǎng)絡(luò)的流媒體傳輸著稱有决,在編碼方面拼余,我理解的他的理論依據(jù)是:參照一段時間內(nèi)圖像的統(tǒng)計(jì)結(jié)果表明污桦,在相鄰幾幅圖像畫面中,一般有差別的像素只有10%以內(nèi)的點(diǎn),亮度差值變化不超過2%匙监,而色度差值的變化只有1%以內(nèi)凡橱。所以對于一段變化不大圖像畫面,我們可以先編碼出一個完整的圖像幀A亭姥,隨后的B幀就不編碼全部圖像稼钩,只寫入與A幀的差別,這樣B幀的大小就只有完整幀的1/10或更写锫蕖坝撑!B幀之后的C幀如果變化不大,我們可以繼續(xù)以參考B的方式編碼C幀粮揉,這樣循環(huán)下去巡李。這段圖像我們稱為一個序列(序列就是有相同特點(diǎn)的一段數(shù)據(jù)),當(dāng)某個圖像與之前的圖像變化很大扶认,無法參考前面的幀來生成侨拦,那我們就結(jié)束上一個序列,開始下一段序列辐宾,也就是對這個圖像生成一個完整幀A1狱从,隨后的圖像就參考A1生成,只寫入與A1的差別內(nèi)容叠纹。

在H264協(xié)議里定義了三種幀季研,完整編碼的幀叫I幀,參考之前的I幀生成的只包含差異部分編碼的幀叫P幀吊洼,還有一種參考前后的幀編碼的幀叫B幀训貌。

H264采用的核心算法是幀內(nèi)壓縮和幀間壓縮,幀內(nèi)壓縮是生成I幀的算法,幀間壓縮是生成B幀和P幀的算法递沪。

序列的說明

在H264中圖像以序列為單位進(jìn)行組織豺鼻,一個序列是一段圖像編碼后的數(shù)據(jù)流,以I幀開始款慨,到下一個I幀結(jié)束儒飒。

一個序列的第一個圖像叫做 IDR 圖像(立即刷新圖像),IDR 圖像都是 I 幀圖像檩奠。H.264 引入 IDR 圖像是為了解碼的重同步桩了,當(dāng)解碼器解碼到 IDR 圖像時,立即將參考幀隊(duì)列清空埠戳,將已解碼的數(shù)據(jù)全部輸出或拋棄井誉,重新查找參數(shù)集,開始一個新的序列整胃。這樣颗圣,如果前一個序列出現(xiàn)重大錯誤,在這里可以獲得重新同步的機(jī)會屁使。IDR圖像之后的圖像永遠(yuǎn)不會使用IDR之前的圖像的數(shù)據(jù)來解碼在岂。

一個序列就是一段內(nèi)容差異不太大的圖像編碼后生成的一串?dāng)?shù)據(jù)流。當(dāng)運(yùn)動變化比較少時蛮寂,一個序列可以很長蔽午,因?yàn)檫\(yùn)動變化少就代表圖像畫面的內(nèi)容變動很小,所以就可以編一個I幀酬蹋,然后一直P幀及老、B幀了。當(dāng)運(yùn)動變化多時除嘹,可能一個序列就比較短了写半,比如就包含一個I幀和3、4個P幀尉咕。

三種幀的說明

1叠蝇、I幀

I幀:幀內(nèi)編碼幀 ,I幀表示關(guān)鍵幀年缎,你可以理解為這一幀畫面的完整保留悔捶;解碼時只需要本幀數(shù)據(jù)就可以完成(因?yàn)榘暾嬅妫?/p>

I幀特點(diǎn):

1)它是一個全幀壓縮編碼幀。它將全幀圖像信息進(jìn)行JPEG壓縮編碼及傳輸;

2)解碼時僅用I幀的數(shù)據(jù)就可重構(gòu)完整圖像;

3)I幀描述了圖像背景和運(yùn)動主體的詳情;

4)I幀不需要參考其他畫面而生成;

5)I幀是P幀和B幀的參考幀(其質(zhì)量直接影響到同組中以后各幀的質(zhì)量);

6)I幀是幀組GOP的基礎(chǔ)幀(第一幀),在一組中只有一個I幀;

7)I幀不需要考慮運(yùn)動矢量;

8)I幀所占數(shù)據(jù)的信息量比較大单芜。

2蜕该、P幀

P幀:前向預(yù)測編碼幀。P幀表示的是這一幀跟之前的一個關(guān)鍵幀(或P幀)的差別洲鸠,解碼時需要用之前緩存的畫面疊加上本幀定義的差別堂淡,生成最終畫面馋缅。(也就是差別幀,P幀沒有完整畫面數(shù)據(jù)绢淀,只有與前一幀的畫面差別的數(shù)據(jù))

P幀的預(yù)測與重構(gòu):P幀是以I幀為參考幀,在I幀中找出P幀“某點(diǎn)”的預(yù)測值和運(yùn)動矢量,取預(yù)測差值和運(yùn)動矢量一起傳送萤悴。在接收端根據(jù)運(yùn)動矢量從I幀中找出P幀“某點(diǎn)”的預(yù)測值并與差值相加以得到P幀“某點(diǎn)”樣值,從而可得到完整的P幀。

P幀特點(diǎn):

1)P幀是I幀后面相隔1~2幀的編碼幀;

2)P幀采用運(yùn)動補(bǔ)償?shù)姆椒▊魉退c前面的I或P幀的差值及運(yùn)動矢量(預(yù)測誤差);

3)解碼時必須將I幀中的預(yù)測值與預(yù)測誤差求和后才能重構(gòu)完整的P幀圖像;

4)P幀屬于前向預(yù)測的幀間編碼皆的。它只參考前面最靠近它的I幀或P幀;

5)P幀可以是其后面P幀的參考幀,也可以是其前后的B幀的參考幀;

6)由于P幀是參考幀,它可能造成解碼錯誤的擴(kuò)散;

7)由于是差值傳送,P幀的壓縮比較高覆履。

3、B幀

B幀:雙向預(yù)測內(nèi)插編碼幀费薄。B幀是雙向差別幀硝全,也就是B幀記錄的是本幀與前后幀的差別(具體比較復(fù)雜,有4種情況楞抡,但我這樣說簡單些)伟众,換言之,要解碼B幀拌倍,不僅要取得之前的緩存畫面赂鲤,還要解碼之后的畫面,通過前后畫面的與本幀數(shù)據(jù)的疊加取得最終的畫面柱恤。B幀壓縮率高,但是解碼時CPU會比較累找爱。

B幀的預(yù)測與重構(gòu)

B幀以前面的I或P幀和后面的P幀為參考幀,“找出”B幀“某點(diǎn)”的預(yù)測值和兩個運(yùn)動矢量,并取預(yù)測差值和運(yùn)動矢量傳送梗顺。接收端根據(jù)運(yùn)動矢量在兩個參考幀中“找出(算出)”預(yù)測值并與差值求和,得到B幀“某點(diǎn)”樣值,從而可得到完整的B幀。

B幀特點(diǎn)

1)B幀是由前面的I或P幀和后面的P幀來進(jìn)行預(yù)測的;

2)B幀傳送的是它與前面的I或P幀和后面的P幀之間的預(yù)測誤差及運(yùn)動矢量;

3)B幀是雙向預(yù)測編碼幀;

4)B幀壓縮比最高,因?yàn)樗环从潮麉⒖紟g運(yùn)動主體的變化情況,預(yù)測比較準(zhǔn)確;

5)B幀不是參考幀,不會造成解碼錯誤的擴(kuò)散车摄。

注:I寺谤、B、P各幀是根據(jù)壓縮算法的需要吮播,是人為定義的,它們都是實(shí)實(shí)在在的物理幀变屁。一般來說,I幀的壓縮率是7(跟JPG差不多)意狠,P幀是20粟关,B幀可以達(dá)到50』犯辏可見使用B幀能節(jié)省大量空間闷板,節(jié)省出來的空間可以用來保存多一些I幀,這樣在相同碼率下院塞,可以提供更好的畫質(zhì)遮晚。

壓縮算法的說明

h264的壓縮方法:

1.分組:把幾幀圖像分為一組(GOP,也就是一個序列),為防止運(yùn)動變化,幀數(shù)不宜取多拦止。

2.定義幀:將每組內(nèi)各幀圖像定義為三種類型,即I幀县遣、B幀和P幀;

3.預(yù)測幀:以I幀做為基礎(chǔ)幀,以I幀預(yù)測P幀,再由I幀和P幀預(yù)測B幀;

4.數(shù)據(jù)傳輸:最后將I幀數(shù)據(jù)與預(yù)測的差值信息進(jìn)行存儲和傳輸糜颠。

幀內(nèi)(Intraframe)壓縮也稱為空間壓縮(Spatial compression)。當(dāng)壓縮一幀圖像時萧求,僅考慮本幀的數(shù)據(jù)而不考慮相鄰幀之間的冗余信息括蝠,這實(shí)際上與靜態(tài)圖像壓縮類似。幀內(nèi)一般采用有損壓縮算法饭聚,由于幀內(nèi)壓縮是編碼一個完整的圖像忌警,所以可以獨(dú)立的解碼、顯示秒梳。幀內(nèi)壓縮一般達(dá)不到很高的壓縮法绵,跟編碼jpeg差不多。

幀間(Interframe)壓縮的原理是:相鄰幾幀的數(shù)據(jù)有很大的相關(guān)性酪碘,或者說前后兩幀信息變化很小的特點(diǎn)朋譬。也即連續(xù)的視頻其相鄰幀之間具有冗余信息,根據(jù)這一特性,壓縮相鄰幀之間的冗余量就可以進(jìn)一步提高壓縮量兴垦,減小壓縮比徙赢。幀間壓縮也稱為時間壓縮(Temporal compression),它通過比較時間軸上不同幀之間的數(shù)據(jù)進(jìn)行壓縮探越。幀間壓縮一般是無損的狡赐。幀差值(Frame differencing)算法是一種典型的時間壓縮法,它通過比較本幀與相鄰幀之間的差異钦幔,僅記錄本幀與其相鄰幀的差值枕屉,這樣可以大大減少數(shù)據(jù)量。

順便說下有損(Lossy )壓縮和無損(Lossy less)壓縮鲤氢。無損壓縮也即壓縮前和解壓縮后的數(shù)據(jù)完全一致搀擂。多數(shù)的無損壓縮都采用RLE行程編碼算法。有損壓縮意味著解壓縮后的數(shù)據(jù)與壓縮前的數(shù)據(jù)不一致卷玉。在壓縮的過程中要丟失一些人眼和人耳所不敏感的圖像或音頻信息,而且丟失的信息不可恢復(fù)哨颂。幾乎所有高壓縮的算法都采用有損壓縮,這樣才能達(dá)到低數(shù)據(jù)率的目標(biāo)。丟失的數(shù)據(jù)率與壓縮比有關(guān),壓縮比越小相种,丟失的數(shù)據(jù)越多,解壓縮后的效果一般越差威恼。此外,某些有損壓縮算法采用多次重復(fù)壓縮的方式,這樣還會引起額外的數(shù)據(jù)丟失。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蚂子,一起剝皮案震驚了整個濱河市沃测,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌食茎,老刑警劉巖蒂破,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異别渔,居然都是意外死亡附迷,警方通過查閱死者的電腦和手機(jī)惧互,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來喇伯,“玉大人喊儡,你說我怎么就攤上這事〉揪荩” “怎么了艾猜?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長捻悯。 經(jīng)常有香客問我匆赃,道長,這世上最難降的妖魔是什么今缚? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任算柳,我火速辦了婚禮,結(jié)果婚禮上姓言,老公的妹妹穿的比我還像新娘瞬项。我一直安慰自己,他們只是感情好何荚,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布囱淋。 她就那樣靜靜地躺著,像睡著了一般兽泣。 火紅的嫁衣襯著肌膚如雪绎橘。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天唠倦,我揣著相機(jī)與錄音,去河邊找鬼涮较。 笑死稠鼻,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的狂票。 我是一名探鬼主播候齿,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼闺属!你這毒婦竟也來了慌盯?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤掂器,失蹤者是張志新(化名)和其女友劉穎亚皂,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體国瓮,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡灭必,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年狞谱,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片禁漓。...
    茶點(diǎn)故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡跟衅,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出播歼,到底是詐尸還是另有隱情伶跷,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布秘狞,位于F島的核電站叭莫,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏谒撼。R本人自食惡果不足惜食寡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望廓潜。 院中可真熱鬧抵皱,春花似錦、人聲如沸辩蛋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽悼院。三九已至伤为,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間据途,已是汗流浹背绞愚。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留颖医,地道東北人位衩。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像熔萧,于是被迫代替她去往敵國和親糖驴。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評論 2 349

推薦閱讀更多精彩內(nèi)容