Android 音視頻開發(fā)三 編碼(H264)

概述

  • 問:音視頻處理主要以解碼、特效寸莫、音視頻合成等為主捺萌,為什么先介紹編碼?
    答:只有對(duì)編碼原理和碼流理解得足夠徹底膘茎,才能做好開發(fā)工作桃纯,視頻的開發(fā)不是簡(jiǎn)單地調(diào)用api,理解不透徹的話披坏,遇到問題可能會(huì)毫無頭緒慈参,很可能連api都不知道怎么用,編碼可以直接理解為壓縮刮萌,將原始的yuv數(shù)據(jù)壓縮為體積更小的數(shù)據(jù)
  • 問:什么是H264驮配?
    答:提到視頻編碼,不得不提到大名鼎鼎的H.264着茸。目前常見的編碼標(biāo)準(zhǔn)有H264壮锻、H265、VP8涮阔、VP9 和 AV1猜绣,而其中用的最普遍的視頻編碼就是H.264(所以本文主要就來詳細(xì)介紹一下它)。H264和H265都是國(guó)際標(biāo)準(zhǔn)化組織(ISO)和國(guó)際電信聯(lián)盟(ITU)開發(fā)的編碼標(biāo)準(zhǔn)敬特,而VP8掰邢、VP9 和 AV1是谷歌開發(fā)的編碼標(biāo)準(zhǔn)

編碼的思路

大家都知道編碼的目的是壓縮原始數(shù)據(jù),方便保存和傳輸伟阔,如何壓縮辣之?大體可以從一下3個(gè)方面來著手

    1. 幀內(nèi)預(yù)測(cè)壓縮,一張圖像相鄰的兩個(gè)像素顏色可能很相似皱炉,那么它們的數(shù)據(jù)也就很相似怀估,那么就產(chǎn)生了冗余數(shù)據(jù),幀內(nèi)壓縮主要解決這部分冗余問題
    1. 幀間預(yù)測(cè)壓縮合搅,相鄰的兩幀圖像往往很相似多搀,同理,這里也產(chǎn)生了冗余數(shù)據(jù)灾部,幀間壓縮主要解決這部分冗余問題
    1. 整數(shù)離散余弦變換(DCT)康铭,將空間上的相關(guān)性變?yōu)轭l域上無關(guān)的數(shù)據(jù)然后進(jìn)行量化,圖像中人眼不敏感的信息會(huì)產(chǎn)生一些視覺上的冗余數(shù)據(jù)赌髓,DCT主要解決視覺冗余問題
    1. 熵編碼从藤,真正的編碼開始了催跪,將上面三部分得到的數(shù)據(jù),進(jìn)行編碼算法的到最終的碼流

預(yù)測(cè)編碼

預(yù)測(cè)編碼(Predictive Coding)是統(tǒng)計(jì)冗余數(shù)據(jù)壓縮理論三個(gè)重要分支之一呛哟,它的理論基礎(chǔ)是現(xiàn)代統(tǒng)計(jì)學(xué)和控制論,用預(yù)測(cè)編碼可以減少數(shù)據(jù)時(shí)間和空間的相關(guān)性匿沛,它廣泛地用于時(shí)間序列圖像數(shù)據(jù)和語音數(shù)據(jù)的壓縮編碼扫责。預(yù)測(cè)編碼的方法是從相鄰象素之間有較強(qiáng)的相關(guān)性特點(diǎn)考慮,比如當(dāng)前象素的灰度或顏色信號(hào)逃呼,數(shù)值上與其相鄰象素總是比較接近鳖孤,除非處于邊界狀態(tài),那么抡笼,當(dāng)前象素的灰度或顏色信號(hào)的數(shù)值苏揣,可用前面已出現(xiàn)的象素的值進(jìn)行預(yù)測(cè)(估計(jì)),得到一個(gè)預(yù)測(cè)值(估計(jì)值)推姻,將實(shí)際值與預(yù)測(cè)值求差平匈,對(duì)這個(gè)差值信號(hào)進(jìn)行編碼、傳送藏古,這種編碼方法稱為預(yù)測(cè)編碼方法增炭。預(yù)測(cè)編碼方分線性預(yù)測(cè)和非線性預(yù)測(cè)編碼兩種。

幀內(nèi)預(yù)測(cè)

一幀圖像中相鄰像素的亮度和色度信息是比較接近的拧晕,并且亮度和色度信息也是逐漸變化的隙姿,不太會(huì)出現(xiàn)突變。也就是說厂捞,圖像具有空間相關(guān)性输玷。 利用這種相關(guān)性,視頻壓縮就可以去除空間冗余信息靡馁。 幀內(nèi)預(yù)測(cè)欲鹏,通過已編碼的像素來預(yù)測(cè)待編碼的像素值,最后達(dá)到減少空間冗余的目的臭墨,具體思路詳看上述預(yù)測(cè)編碼章節(jié)貌虾,具體步驟如下:

    1. 劃分宏塊
      為了通過已編碼的像素來預(yù)測(cè)尚未編碼的像素,需要將一幀圖像劃分為若干個(gè)區(qū)域裙犹, 每個(gè)區(qū)域叫做宏塊尽狠,宏塊是編碼標(biāo)準(zhǔn)的基本處理單元,通常它的大小為 16x16 像素(H264 默認(rèn)是使用 16X16 大小的區(qū)域作為一個(gè)宏塊叶圃,也可以劃分成 8X8 大小的宏塊)
    1. 劃分子塊(圖像中細(xì)節(jié)復(fù)雜的地方)
      16X16 的宏塊上可以劃分出更小的子塊袄膏。子塊的大小可以是 8X16? 16X8? 8X8? 4X8? 8X4? 4X4。
    1. 對(duì)每個(gè)宏塊進(jìn)行預(yù)測(cè)
      預(yù)測(cè)模式多達(dá)九種掺冠,預(yù)測(cè)模式就不在本文詳解了沉馆,預(yù)測(cè)后找出與原圖最接近的一種模式码党,然后計(jì)算差值(殘差值),將差值和預(yù)測(cè)模式一起保存下來斥黑,就可以還原原始圖像了

幀間預(yù)測(cè)

    1. 幀分組
      對(duì)于視頻數(shù)據(jù)主要有兩類數(shù)據(jù)冗余揖盘,一類是時(shí)間上的數(shù)據(jù)冗余,另一類是空間上的數(shù)據(jù)冗余锌奴。.其中時(shí)間上的數(shù)據(jù)冗余是最大的兽狭。下面我們就先來說說視頻數(shù)據(jù)時(shí)間上的冗余問題。
      為什么說時(shí)間上的冗余是最大的呢鹿蜀?假設(shè)攝像頭每秒抓取30幀箕慧,這30幀的數(shù)據(jù)大部分情況下都是相關(guān)聯(lián)的。也有可能不止30幀的的數(shù)據(jù)茴恰,可能幾十幀颠焦,上百幀的數(shù)據(jù)都是關(guān)聯(lián)特別密切的。
      對(duì)于這些關(guān)聯(lián)特別密切的幀往枣,其實(shí)我們只需要保存一幀的數(shù)據(jù)伐庭,其它幀都可以通過這一幀再按某種規(guī)則預(yù)測(cè)出來,所以說視頻數(shù)據(jù)在時(shí)間上的冗余是最多的分冈。
      為了達(dá)到相關(guān)幀通過預(yù)測(cè)的方法來壓縮數(shù)據(jù)似忧,就需要將視頻幀進(jìn)行分組。那么如何判定某些幀關(guān)系密切丈秩,可以劃為一組呢盯捌?
      分組即 H264 中的 序列(GOP)。其算法是:在相鄰幾幅圖像畫面中蘑秽,一般有差別的像素只有 10% 以內(nèi)的點(diǎn)饺著,亮度差值變化不超過 2%,而色度差值的變化只有 1% 以內(nèi)肠牲,我們認(rèn)為這樣的圖可以分到一組幼衰,在這樣一組幀中,經(jīng)過編碼后缀雳,我們只保留第一帖的完整數(shù)據(jù)渡嚣,其它幀都通過參考上一幀計(jì)算出來。我們稱第一幀為 IDR/I幀肥印,其它幀我們稱為 P/B幀识椰,這樣編碼后的數(shù)據(jù)幀組我們稱為 GOP。
      所以如果場(chǎng)景一直沒什么變化深碱,則一系列視頻幀中 I 幀的數(shù)量會(huì)很少腹鹉。如果場(chǎng)景變換很復(fù)雜,一直在場(chǎng)景變換大的場(chǎng)景切換時(shí)就會(huì)有 I 幀出現(xiàn)敷硅。
    1. 幀間預(yù)測(cè)(運(yùn)動(dòng)估計(jì)與運(yùn)動(dòng)補(bǔ)償)
      H264 編碼器先按順序從編碼緩沖區(qū)取出兩幀圖像數(shù)據(jù)功咒,然后進(jìn)行宏塊掃描愉阎。當(dāng)發(fā)現(xiàn)其中一幀圖像中有物體時(shí),就在另一幀的鄰近位置進(jìn)行匹配力奋。如果此時(shí)在另一幀圖像中匹配了該物體榜旦,那么就可以計(jì)算出物體的運(yùn)動(dòng)矢量了,運(yùn)動(dòng)矢量計(jì)算出來以后景殷,將兩幀圖像相同部分的數(shù)據(jù)減掉溅呢,就得到了補(bǔ)償數(shù)據(jù),通過補(bǔ)償數(shù)據(jù)即可還原圖像了
      我們把運(yùn)動(dòng)矢量與補(bǔ)償稱為幀間壓縮技術(shù)滨彻,它解決的是視頻幀在時(shí)間上的數(shù)據(jù)冗余藕届。在這一步我們獲取了 P/B 幀

DCT(離散余弦變換)

  • 首先說說圖像頻率是什么挪蹭。圖像可以看做是一個(gè)定義為二維平面上的信號(hào)亭饵,該信號(hào)的幅值對(duì)應(yīng)于像素的灰度值(對(duì)于彩色圖像則是RGB三個(gè)分量),如果我們僅僅考慮圖像上某一行像素梁厉,則可以將之視為一個(gè)定義在一維空間上的信號(hào)辜羊,這個(gè)信號(hào)在形式上與傳統(tǒng)的信號(hào)處理領(lǐng)域的時(shí)變信號(hào)是相似的,時(shí)變信號(hào)是有一定頻率成分的词顾,圖像的頻率又稱為空間頻率八秃,它反映了圖像的像素灰度在空間中變化的情況。
  • 一般圖片的高頻信息多但是幅值比較小肉盹。高頻信息主要描述圖片的邊緣或者細(xì)節(jié)信息昔驱,對(duì)于快速空間變化的圖像來說,比如充滿溝壑的山脈上忍,其高頻成分會(huì)相對(duì)較強(qiáng)骤肛,低頻則較弱。而低頻主要是圖像的整體輪廓信息窍蓝。由于人眼的視覺敏感度是有限的腋颠,有的時(shí)候我們?nèi)コ艘徊糠指哳l信息之后,人眼看上去感覺區(qū)別并不大吓笙。這就是去除視覺冗余淑玫。
  • 因此,我們可以先將圖片通過 DCT(離散余弦變換) 變換到頻域面睛,然后再去除一些高頻信息絮蒿。這樣我們就可以減少信息量,從而達(dá)到壓縮的目的

熵編碼

  • 主要去除信息熵冗余叁鉴。而前面說的去除空間歌径、時(shí)間、視覺冗余亲茅,其實(shí)都是為這一步做準(zhǔn)備的回铛。
  • 前面的幀內(nèi)幀間預(yù)測(cè)得到的殘差以及后面的變換量化狗准,都是將數(shù)據(jù)盡量轉(zhuǎn)換為連續(xù)的0更多的表現(xiàn)形式,然后再利用合理的編碼算法去編碼形成最終的碼流茵肃。
  • 視頻內(nèi)容部分使用的是內(nèi)容自適應(yīng)的(CABAC或CAVLC)算術(shù)編碼腔长。具體編碼算法這里就不深入了,不過核心思想都是利用了連續(xù)的‘0’盡可能去進(jìn)行壓縮

不喜勿噴

視頻編解碼技術(shù)太過復(fù)雜验残,本人也在學(xué)習(xí)中捞附,本文寫的很淺顯,內(nèi)容也大部分參考網(wǎng)上內(nèi)容您没,有錯(cuò)誤的地方還請(qǐng)指正鸟召,不喜勿噴,謝謝氨鹏!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末欧募,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子仆抵,更是在濱河造成了極大的恐慌跟继,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,651評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件镣丑,死亡現(xiàn)場(chǎng)離奇詭異舔糖,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)莺匠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門金吗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人趣竣,你說我怎么就攤上這事摇庙。” “怎么了期贫?”我有些...
    開封第一講書人閱讀 162,931評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵跟匆,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我通砍,道長(zhǎng)玛臂,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,218評(píng)論 1 292
  • 正文 為了忘掉前任封孙,我火速辦了婚禮崇败,結(jié)果婚禮上苞尝,老公的妹妹穿的比我還像新娘鲫售。我一直安慰自己椿疗,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,234評(píng)論 6 388
  • 文/花漫 我一把揭開白布膜蠢。 她就那樣靜靜地躺著堪藐,像睡著了一般莉兰。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上礁竞,一...
    開封第一講書人閱讀 51,198評(píng)論 1 299
  • 那天糖荒,我揣著相機(jī)與錄音,去河邊找鬼模捂。 笑死捶朵,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的狂男。 我是一名探鬼主播综看,決...
    沈念sama閱讀 40,084評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼岖食!你這毒婦竟也來了红碑?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,926評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤县耽,失蹤者是張志新(化名)和其女友劉穎句喷,沒想到半個(gè)月后镣典,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體兔毙,經(jīng)...
    沈念sama閱讀 45,341評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,563評(píng)論 2 333
  • 正文 我和宋清朗相戀三年兄春,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了澎剥。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,731評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡赶舆,死狀恐怖哑姚,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情芜茵,我是刑警寧澤叙量,帶...
    沈念sama閱讀 35,430評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站九串,受9級(jí)特大地震影響绞佩,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜猪钮,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,036評(píng)論 3 326
  • 文/蒙蒙 一品山、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧烤低,春花似錦肘交、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽凉驻。三九已至,卻和暖如春复罐,著一層夾襖步出監(jiān)牢的瞬間沿侈,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工市栗, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留缀拭,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,743評(píng)論 2 368
  • 正文 我出身青樓填帽,卻偏偏與公主長(zhǎng)得像蛛淋,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子篡腌,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,629評(píng)論 2 354