Android音視頻【一】H264編碼基礎(chǔ)

人間觀察

歲月催人绷蹲,時間過的太快了

音視頻編碼解碼就是指通過特定的壓縮/解壓技術(shù)汹族,將某個音視頻格式的數(shù)據(jù)轉(zhuǎn)換為另一種音視頻格式數(shù)據(jù)。目前在Android中的音視頻用的最多的就是H264+aac的方式進(jìn)行編碼和解碼暇昂,其實不止Android笋妥,H264在整個音視頻領(lǐng)域都是使用最廣泛的編碼方式。H264是新一代的編碼標(biāo)準(zhǔn)毡们,以高壓縮高質(zhì)量和支持多種網(wǎng)絡(luò)的流媒體傳輸迅皇。當(dāng)然還有比H264更好的H265編碼,H265是基于H264優(yōu)化的衙熔。

1.H264標(biāo)準(zhǔn)的演進(jìn)

國際上主流制定視頻編解碼技術(shù)的組織有兩個登颓,一個是國際電聯(lián)(ITU-T),它制定的標(biāo)準(zhǔn)有H.261红氯、H.263框咙、H.263+咕痛、H.264等。
一個是國際標(biāo)準(zhǔn)化組織(ISO)它制定的標(biāo)準(zhǔn)有MPEG-1扁耐、MPEG-2暇检、MPEG-4等。他們各自發(fā)展婉称,隨著時間的推移這兩個基友融在一起了块仆,推出了H.264/MPEG-4 AVC,他們都保留了各自的叫法王暗,在ITU-T這邊叫做H.264悔据,在ISO那邊叫MPEG-4 AVC。所以你在電腦上看視頻文件(如果是h264編碼的話)的簡介都是H.264/MPEG-4 AVC俗壹。但是在代碼中不是h264而是avc科汗,哈哈。簡單了解下h264標(biāo)準(zhǔn)的形成就行绷雏。

2.前提

我們?yōu)槭裁匆M(jìn)行編碼呢头滔?這個要搞清楚,因為原始數(shù)據(jù)太大了涎显,舉個例子比如android 攝像頭采集視頻的分辨率是720*1280坤检,幀率是30fps,YCbCr_420_SP(NV21) 期吓,那1s的數(shù)據(jù)大小是:
720 *1280*1.5byte(12 bits per pixel)*30(張圖片)/1024/1024=40mb早歇。如果這1s的數(shù)據(jù)進(jìn)行網(wǎng)絡(luò)傳輸和磁盤保存是非常不合理的,除非電影院的視頻讨勤,電影院的視頻都是原始的箭跳,一部電影上1000G,好家伙潭千,簡直就是在放高清圖片谱姓。666

所以我們要經(jīng)過壓縮,其中就是h264的壓縮刨晴,編碼的時候經(jīng)過去掉圖像內(nèi)的冗余和保留圖像之間的差異的數(shù)據(jù)進(jìn)行傳輸/保存逝段,解碼的時候進(jìn)行還原即可。這就是我們的先輩們努力了10多年的成果割捅。

這篇是理論,盡可能的保留所謂的官方概念帚桩。也會加入自己的理解亿驾。

3.H264相關(guān)概念

h264中有很多很多的概念,這些很重要账嚎。下面的3個幀的總結(jié)來自有關(guān)書籍也加入了自己的理解莫瞬,如果我只寫自己的理解可能會導(dǎo)致真正意義上的丟失儡蔓,所以我這里還是保留了,大家可以細(xì)細(xì)品讀這3個幀的描述疼邀。

3.1 幀 Frame

簡單的理解幀就是為視頻或者動畫中的每一張畫面喂江,而視頻和動畫特效就是由無數(shù)張畫面組合而成,每一張畫面都是一幀旁振。

3.2 三種視頻幀

分為I 幀 B幀 P幀获询,當(dāng)然是編碼后數(shù)據(jù)。

3.2.1 I 幀

I 幀是幀內(nèi)編碼幀拐袜,I 幀是完整幀吉嚣,可以理解為一副畫面的完整保留,當(dāng)然也不是保留最原始數(shù)據(jù)蹬铺,刪掉了人眼不敏感的數(shù)據(jù)(人眼對色度不敏感對亮度敏感)尝哆,解碼時只需要本幀數(shù)據(jù)就可以完成,就可以出來畫面甜攀,直播秒開就是這個原理秋泄,首幀為I幀,配合云端緩存最近的I幀规阀。

I 幀特點:

  • 它是一個全幀壓縮編碼幀恒序,它將全幀的圖像進(jìn)行jpeg壓縮編碼
  • 既然是完整的圖像那所占數(shù)據(jù)的信息量比較大
  • 解碼時僅用I幀的數(shù)據(jù)就可以重構(gòu)完整圖像
  • 不需要參考其他畫面進(jìn)行編碼生成
  • I 幀是序列g(shù)op的基礎(chǔ)幀(第一幀),在一個gop里只有一個I 幀
  • I 幀是P幀和B幀的參考幀(其質(zhì)量直接影響到同組中以后各幀的質(zhì)量)姥敛,如果I幀質(zhì)量不行奸焙,那這個序列質(zhì)量都不行。
  • I 幀描述了圖像背景和運動主體的詳情

總之彤敛,I 幀很nb与帆,I 幀越多說明該視頻畫面變換多越復(fù)雜。

3.2.2 P幀-前向預(yù)測編碼幀

P幀表示的是這一幀跟之前的一個關(guān)鍵幀(或P幀)的差別墨榄,解碼時需要之前緩存的畫面疊加上本幀定義的差別玄糟,生成最終畫面。(也就是差別幀袄秩,P幀沒有完整畫面數(shù)據(jù)阵翎,只有與前一幀的畫面差別的數(shù)據(jù))。

? P幀的預(yù)測與重構(gòu):P幀是以 I 幀為參考幀之剧,在 I 幀中找出P幀“某點”的預(yù)測值和運動矢量郭卫,取預(yù)測差值和運動矢量一起傳送。在接收端根據(jù)運行矢量從 I 幀找出P幀“某點”的預(yù)測值并與差值相加以得到P幀“某點”樣值背稼,從而可得到完整的P幀贰军。
?
P幀的特點:

  • P幀是 I 幀后面相隔1~2幀的編碼幀
  • P幀采用運動補(bǔ)償?shù)姆椒▊魉退c前面的I或P幀的差值及運動矢量(預(yù)測誤差)
  • 解碼時必須將i幀中的預(yù)測值與預(yù)測誤差求和后才能重構(gòu)完整的P幀圖像
  • P幀屬于前向預(yù)測的幀間編碼。它只參考前面最靠近它的 I 幀或P幀
  • 由于P幀是參考幀蟹肘,它可能造成解碼錯誤的擴(kuò)散词疼。也就是說如果p幀解碼失敗了俯树,一組內(nèi)的gop后面的b幀/p幀失敗。它最多也就影響一個gop序列贰盗。
  • 由于是差值傳送许饿,P幀的壓縮比較高。

總之舵盈,p幀就是差別幀陋率,p幀越多,說明畫面變化不多书释。

3.2.3 B幀-雙向預(yù)測內(nèi)插編碼幀

B幀是雙向差別幀翘贮,也就是B幀記錄的是本幀與前后幀的差別,要解碼B幀爆惧。不僅要取得之前的緩存畫面狸页,還要解碼之后的畫面,通過前后畫面的與本幀數(shù)據(jù)的疊加取得最終的畫面扯再。B幀壓縮率高芍耘,但是解碼時費時間,如果是軟解碼就耗cpu了熄阻。

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

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

B幀的特點:

  • B幀是由前面的 I 或P幀和后面的P幀進(jìn)行預(yù)測的
  • B幀傳送的是它與前面的 I 或P幀和后面的P幀之間的預(yù)測誤差及運動矢量
  • B幀是雙向預(yù)測編碼幀
  • B幀壓縮比最高鳄袍,因為它只反映并參考幀間運動主體的變化情況,預(yù)測比較準(zhǔn)確
  • B幀不是參考幀吏恭,不會造成解碼錯誤的擴(kuò)散

總之拗小,b幀數(shù)據(jù)較小,b幀越多樱哼,視頻越小哀九。

注:I、B搅幅、P幀是根據(jù)壓縮算法是人為定義的阅束,一般來說,幀的壓縮率是7(跟JPG差不多)茄唐,P幀是20息裸,B幀可以達(dá)到50。

3.3 GOP/序列

Group of picture(圖像組)。
在相鄰幾幅圖像畫面中界牡,一般有差別的像素只有10%以內(nèi)的點,亮度差值變化不超過2%,而色度差值的變化只有1%以內(nèi)漾抬,我們認(rèn)為這樣的圖可以分到一組宿亡。在這樣一組幀中,經(jīng)過h264編碼后纳令,只保留第一幀的完整數(shù)據(jù)挽荠,其它幀都通過參考上一幀計算出來。我們稱第一幀為IDR/I幀平绩,其它幀我們稱為P/B幀圈匆,這樣編碼后的數(shù)據(jù)幀組我們稱為GOP。GOP如下捏雌,圖片來源網(wǎng)絡(luò):

gop.png

當(dāng)視頻的元素運動變化比較少時跃赚,一個序列可以很長,因為運動變化少就代表圖像畫面內(nèi)容的變動很小性湿,所以就可以是一個I幀纬傲,然后是P幀B幀。如果變化很大肤频,比如圖片形成的視頻叹括,一個序列可能就比較短了,可能就包含一個i幀宵荒,幾個P幀B幀了汁雷。

3.4 IDR圖像

1個序列的第一個圖像叫做IDR圖像(立刻刷新圖像),IDR圖像都是I幀圖像报咳。h264引入IDR圖像是為了解碼的重新同步侠讯,當(dāng)解碼器解碼到IDR圖像時,立刻將參考幀隊列清空少孝,將已經(jīng)解碼的全部輸出或者拋棄继低,重新查找下一個參數(shù)集,開始解碼下一個新的序列稍走。這樣當(dāng)錢一個序列出現(xiàn)重大錯誤袁翁,在這里可以重新獲得同步的機(jī)會。IDR圖像之后的圖像不會使用IDR之前圖像的數(shù)據(jù)進(jìn)行解碼婿脸。

所以說IDR圖像都是I幀粱胜,但是I幀不一定是IDR圖像。

3.5 DTS和PTS

DTS: Decode Time Stamp,表示讀入內(nèi)存的比特流在什么時候開始送入解碼器中進(jìn)行解碼狐树。解碼的順序

PTS: Presentation Time Stamp,表示解碼后的視頻幀什么時候被顯示出來焙压,顯示順序。

圖片來源網(wǎng)絡(luò):

gop解碼.jpg

因為B幀需要前后的幀(前面的 I 或P幀和后面的P幀)才能解出圖像。也就是說一組GOP必須解碼出I幀P幀后才能解碼出來B幀涯曲,并不是B幀的數(shù)據(jù)先到了就先解碼b幀的數(shù)據(jù)

3.6 宏塊/MB(Macroblock)

就是圖像中的一小塊區(qū)域野哭。h264位了壓縮而采用的一種劃分方法。
H264編碼器為每一幅圖片劃分宏塊幻件,默認(rèn)是使用 16X16 大小的區(qū)域作為一個宏塊拨黔,也可以劃分成 8X8 大小。一般比較平坦的圖像使用 16X16 大小的宏塊绰沥,為了更高的壓縮率在在16X16 的宏塊上分出更小的子塊篱蝇。子塊的大小可以是 8X16? 16X8? 8X8? 4X8? 8X4? 4X4

4.H264的壓縮原理

我個人理解這個代碼實現(xiàn)是很復(fù)雜的,發(fā)展了10幾年才穩(wěn)定成熟徽曲。不用你手寫實現(xiàn)也不用關(guān)注特別細(xì)的實現(xiàn)零截,但是需要了解下它的基本原理,壓縮的過程秃臣,采用的方法進(jìn)行的視頻壓縮涧衙。

4.1壓縮技術(shù)

簡單點說就是:視頻數(shù)據(jù)主要分為兩類數(shù)據(jù)冗余,一個是時間上的冗余甜刻,一個是空間上的冗余绍撞。分別對其進(jìn)行壓縮,壓縮技術(shù)我們分別叫做幀間壓縮技術(shù)和幀內(nèi)壓縮技術(shù)得院。

時間上: 將一定時間內(nèi)視頻圖像運動變化不大關(guān)聯(lián)性性很強(qiáng)的進(jìn)行分組(GOP)傻铣,然后對這組序列進(jìn)行編碼,只保留第一幀的完整數(shù)據(jù)祥绞,其它幀都通過參考上一幀計算出來非洲。那第一幀為IDR/I幀,其它幀為P/B幀蜕径,這樣編碼后的數(shù)據(jù)幀組我們稱為GOP两踏。壓縮過程中有運動矢量與補(bǔ)償算法和劃分宏塊(MB)以及對宏塊的處理壓縮。當(dāng)下一組視頻內(nèi)的圖像變化很大的時候又是一組新的GOP兜喻,反復(fù)循環(huán)梦染。這種我們就叫幀間壓縮技術(shù),解決的是時域數(shù)據(jù)冗余問題朴皆。

空間上:對視頻圖像劃分宏塊帕识,H264對比較平坦的圖像使用 16X16 大小的宏塊,可以在16x16的基礎(chǔ)上更細(xì)粒度的劃分遂铡,這樣再經(jīng)過幀內(nèi)壓縮肮疗,得到更高效的數(shù)據(jù)。這種我們就叫幀內(nèi)壓縮技術(shù)扒接,解決的是空域數(shù)據(jù)冗余問題伪货。

幀間壓縮和幀內(nèi)壓縮后還需要進(jìn)行壓縮们衙,比如:
還有編碼上冗余:根據(jù)不同像素值出現(xiàn)的概率不同進(jìn)行算法處理
還有視覺冗余:人的視覺系統(tǒng)對某些細(xì)節(jié)不敏感就可以適當(dāng)?shù)膭h減

基本原理參考這篇文章https://zhuanlan.zhihu.com/p/31056455

介紹了些h264的基本知識和有關(guān)概念,h264的知識遠(yuǎn)遠(yuǎn)不止這些碱呼。如有描述不準(zhǔn)確歡迎指正蒙挑。下篇介紹h264數(shù)據(jù)流格式以及如何在Android中硬解碼播放h264碼流。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末愚臀,一起剝皮案震驚了整個濱河市脆荷,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌懊悯,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件梦皮,死亡現(xiàn)場離奇詭異炭分,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)剑肯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進(jìn)店門捧毛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人让网,你說我怎么就攤上這事呀忧。” “怎么了溃睹?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵而账,是天一觀的道長。 經(jīng)常有香客問我因篇,道長泞辐,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任竞滓,我火速辦了婚禮咐吼,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘商佑。我一直安慰自己锯茄,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布茶没。 她就那樣靜靜地躺著肌幽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪礁叔。 梳的紋絲不亂的頭發(fā)上牍颈,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天,我揣著相機(jī)與錄音琅关,去河邊找鬼煮岁。 笑死讥蔽,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的画机。 我是一名探鬼主播冶伞,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼步氏!你這毒婦竟也來了响禽?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤荚醒,失蹤者是張志新(化名)和其女友劉穎芋类,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體界阁,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡侯繁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了泡躯。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片贮竟。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖较剃,靈堂內(nèi)的尸體忽然破棺而出咕别,到底是詐尸還是另有隱情,我是刑警寧澤写穴,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布惰拱,位于F島的核電站,受9級特大地震影響啊送,放射性物質(zhì)發(fā)生泄漏弓颈。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一删掀、第九天 我趴在偏房一處隱蔽的房頂上張望翔冀。 院中可真熱鬧,春花似錦披泪、人聲如沸纤子。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽控硼。三九已至,卻和暖如春艾少,著一層夾襖步出監(jiān)牢的瞬間卡乾,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工缚够, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留幔妨,地道東北人鹦赎。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像误堡,于是被迫代替她去往敵國和親古话。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,490評論 2 348