Android 音視頻01 --- H264的基本原理01

一. H264概述

H264壓縮技術(shù)主要采用了以下幾種方法對視頻數(shù)據(jù)進(jìn)行壓縮倘潜。包括:

1.幀內(nèi)預(yù)測壓縮

解決的是空域數(shù)據(jù)冗余問題。

2.幀間預(yù)測壓縮(運動估計與補償

解決的是時域數(shù)據(jù)冗徐問題

3.整數(shù)離散余弦變換(DCT)

將空間上的相關(guān)性變?yōu)轭l域上無關(guān)的數(shù)據(jù)然后進(jìn)行量化惰说。

4.CABAC壓縮匕荸。

經(jīng)過壓縮后的幀分為:I幀,P幀和B幀:

I幀:

關(guān)鍵幀介时,采用幀內(nèi)壓縮技術(shù)狂魔。

P幀:

向前參考幀蒜埋,在壓縮時,只參考前面已經(jīng)處理的幀最楷。采用幀音壓縮技術(shù)整份。

B幀:

雙向參考幀,在壓縮時籽孙,它即參考前而的幀烈评,又參考它后面的幀。采用幀間壓縮技術(shù)蚯撩。
除了I/P/B幀外础倍,還有圖像序列GOP。

GOP:兩個I幀之間是一個圖像序列胎挎,在一個圖像序列中只有一個I幀沟启。如下圖所示:
31.png

二. H264壓縮技術(shù)

H264的基本原理其實非常簡單,下我們就簡單的描述一下H264壓縮數(shù)據(jù)的過程犹菇。通過攝像頭采集到的視頻幀(按每秒 30 幀算)德迹,被送到 H264 編碼器的緩沖區(qū)中。編碼器先要為每一幅圖片劃分宏塊揭芍。

劃分宏塊:

H264默認(rèn)是使用 16X16 大小的區(qū)域作為一個宏塊胳搞,也可以劃分成 8X8 大小。
33.png

劃分好宏塊后,計算宏塊的象素值肌毅。以此類推筷转,計算一幅圖像中每個宏塊的像素值。

劃分子塊:

H264對比較平坦的圖像使用 16X16 大小的宏塊悬而。但為了更高的壓縮率呜舒,還可以在 16X16 的宏塊上更劃分出更小的子塊。子塊的大小可以是 8X16? 16X8? 8X8? 4X8? 8X4? 4X4非常的靈活笨奠。
36.png

上幅圖中袭蝗,紅框內(nèi)的 16X16 宏塊中大部分是藍(lán)色背景,而三只鷹的部分圖像被劃在了該宏塊內(nèi)般婆,為了更好的處理三只鷹的部分圖像到腥,H264就在 16X16 的宏塊內(nèi)又劃分出了多個子塊。
37.png
這樣再經(jīng)過幀內(nèi)壓縮蔚袍,可以得到更高效的數(shù)據(jù)乡范。
宏塊劃分好后,就可以對H264編碼器緩存中的所有圖片進(jìn)行分組了页响。
幀分組:

對于視頻數(shù)據(jù)主要有兩類數(shù)據(jù)冗余篓足,一類是時間上的數(shù)據(jù)冗余,另一類是空間上的數(shù)據(jù)冗余闰蚕。其中時間上的數(shù)據(jù)冗余是最大的。為什么說時間上的冗余是最大的呢连舍?假設(shè)攝像頭每秒抓取30幀没陡,這30幀的數(shù)據(jù)大部分情況下都是相關(guān)聯(lián)的。也有可能不止30幀的的數(shù)據(jù)索赏,可能幾十幀盼玄,上百幀的數(shù)據(jù)都是關(guān)聯(lián)特別密切的。
H264編碼器會按順序潜腻,每次取出兩幅相鄰的幀進(jìn)行宏塊比較埃儿,計算兩幀的相似度。如下圖:

42.png

在相鄰幾幅圖像畫面中融涣,一般有差別的像素只有10%以內(nèi)的點,亮度差值變化不超過2%童番,而色度差值的變化只有1%以內(nèi),我們認(rèn)為這樣的圖可以分到一組威鹿。
在這樣一組幀中剃斧,經(jīng)過編碼后,我們只保留第一帖的完整數(shù)據(jù)忽你,其它幀都通過參考上一幀計算出來幼东。我們稱第一幀為IDR/I幀,其它幀我們稱為P/B幀,這樣編碼后的數(shù)據(jù)幀組我們稱為GOP根蟹。

運動估計與補償:

在H264編碼器中將幀分組后脓杉,就要計算幀組內(nèi)物體的運動矢量了。
H264編碼器首先按順序從緩沖區(qū)頭部取出兩幀視頻數(shù)據(jù)简逮,然后進(jìn)行宏塊掃描球散。當(dāng)發(fā)現(xiàn)其中一幅圖片中有物體時,就在另一幅圖的鄰近位置(搜索窗口中)進(jìn)行搜索买决。如果此時在另一幅圖中找到該物體沛婴,那么就可以計算出物體的運動矢量了。
運動矢量計算出來后督赤,將相同部分(也就是綠色部分)減去嘁灯,就得到了補償數(shù)據(jù)。我們最終只需要將補償數(shù)據(jù)進(jìn)行壓縮保存躲舌,以后在解碼時就可以恢復(fù)原圖了丑婿。壓縮補償后的數(shù)據(jù)只需要記錄很少的一點數(shù)據(jù)。
我們把運動矢量與補償稱為幀間壓縮技術(shù)没卸,它解決的是視頻幀在時間上的數(shù)據(jù)冗余羹奉。除了幀間壓縮,幀內(nèi)也要進(jìn)行數(shù)據(jù)壓縮约计,幀內(nèi)數(shù)據(jù)壓縮解決的是空間上的數(shù)據(jù)冗余诀拭。

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

人眼對圖象都有一個識別度,對低頻的亮度很敏感煤蚌,對高頻的亮度不太敏感耕挨。所以基于一些研究,可以將一幅圖像中人眼不敏感的數(shù)據(jù)去除掉尉桩。這樣就提出了幀內(nèi)預(yù)測技術(shù)筒占。
一幅圖像被劃分好宏塊后,對每個宏塊可以進(jìn)行 9 種模式的預(yù)測蜘犁。找出與原圖最接近的一種預(yù)測模式翰苫。然后,將原始圖像與幀內(nèi)預(yù)測后的圖像相減得殘差值这橙。再將我們之前得到的預(yù)測模式信息一起保存起來奏窑,這樣我們就可以在解碼時恢復(fù)原圖了,經(jīng)過幀內(nèi)與幀間的壓縮后析恋,雖然數(shù)據(jù)有大幅減少良哲,但還有優(yōu)化的空間。

對殘差數(shù)據(jù)做DCT:

可以將殘差數(shù)據(jù)做整數(shù)離散余弦變換助隧,去掉數(shù)據(jù)的相關(guān)性筑凫,進(jìn)一步壓縮數(shù)據(jù)滑沧。

CABAC:

上面的幀內(nèi)壓縮是屬于有損壓縮技術(shù)。也就是說圖像被壓縮后巍实,無法完全復(fù)原滓技。而CABAC屬于無損壓縮技術(shù)。
無損壓縮技術(shù)大家最熟悉的可能就是哈夫曼編碼了棚潦,給高頻的詞一個短碼令漂,給低頻詞一個長碼從而達(dá)到數(shù)據(jù)壓縮的目的。MPEG-2中使用的VLC就是這種算法丸边,我們以 A-Z 作為例子叠必,A屬于高頻數(shù)據(jù),Z屬于低頻數(shù)據(jù)妹窖∥吵看看它是如何做的。
CABAC也是給高頻數(shù)據(jù)短碼骄呼,給低頻數(shù)據(jù)長碼共苛。同時還會根據(jù)上下文相關(guān)性進(jìn)行壓縮,這種方式又比VLC高效很多蜓萄。

三. H264編碼

制定了相互傳輸?shù)母袷接缇ィ瑢⒑昕?有組織,有結(jié)構(gòu)嫉沽,有順序的形成一系列的碼流辟犀。這種碼流既可 通過 InputStream 網(wǎng)絡(luò)流的數(shù)據(jù)進(jìn)行傳輸,也可以封裝成一個文件進(jìn)行保存绸硕,主要作用是為了傳輸踪蹬。

1.1H264碼流組成

組成H264碼流的結(jié)構(gòu)中 包含以下幾部分 ,從大到小排序依次是:
H264視頻序列臣咖,圖像,片組漱牵,片夺蛇,NALU,宏塊 酣胀,像素刁赦。

1.1.1 H264編碼分層

NAL層:(Network Abstraction Layer,視頻數(shù)據(jù)網(wǎng)絡(luò)抽象層): 它的作用是H264只要在網(wǎng)絡(luò)上傳輸,在傳輸?shù)倪^程每個包以太網(wǎng)是1500字節(jié)闻镶,而H264的幀往往會大于1500字節(jié)甚脉,所以要進(jìn)行拆包,將一個幀拆成多個包進(jìn)行傳輸铆农,所有的拆包或者組包都是通過NAL層去處理的牺氨。
VCL層:(Video Coding Layer,視頻數(shù)據(jù)編碼層): 對視頻原始數(shù)據(jù)進(jìn)行壓縮

1.1.2 H264的傳輸

起始碼0x 00 00 00 01 或者 0x 00 00 01 作為分隔符
兩個 0x 00 00 00 01之間的字節(jié)數(shù)據(jù) 是表示一個NAL Unit。

四. H264編碼

I 幀:幀內(nèi)編碼幀猴凹,幀表示關(guān)鍵幀夷狰,你可以理解為這一幀畫面的完整保留;解碼時只需要本幀數(shù)據(jù)就可以完成(因為包含完整畫面)

I 幀的特點:

  • a. 它是一個全幀壓縮編碼幀郊霎,它將全幀圖像信息進(jìn)行JPEG壓縮編碼及傳輸
  • b. 解碼時僅用I 幀的數(shù)據(jù)就可重構(gòu)完整圖像
  • c. I 幀描述了圖像背景和運動主體的詳情
  • d. I 幀不需要參考其他畫面而生成
  • e. I 幀是P幀和B幀的參考幀(其質(zhì)量直接影響到同組中以后各幀的質(zhì)量)
  • f. I 幀不需要考慮運動矢量
  • g. I 幀所占數(shù)據(jù)的信息量比較大
    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幀的特點:
  • a. P幀是 I 幀后面相隔1~2幀的編碼幀
  • b. P幀采用運動補償?shù)姆椒▊魉退c前面的I或P幀的差值及運動矢量(預(yù)測誤差)
  • c. 解碼時必須將幀中的預(yù)測值與預(yù)測誤差求和后才能重構(gòu)完整的P幀圖像
  • d. P幀屬于前向預(yù)測的幀間編碼烙如。它只參考前面最靠近它的 I 幀或P幀
  • e. 由于P幀是參考幀么抗,它可能造成解碼錯誤的擴(kuò)散
  • f. 由于是差值傳送,P幀的壓縮比較高
    B幀
    雙向預(yù)測內(nèi)插編碼幀亚铁。B幀是雙向差別幀蝇刀,也就是B幀記錄的是本幀與前后幀的差別(具體比較復(fù)雜,有4種情況徘溢,但我這樣說簡單些)吞琐,換言之,要解碼B幀然爆。不僅要取得之前的緩存畫面站粟,還要解碼之后的畫面,通過前后畫面的與本幀數(shù)據(jù)的疊加取得最終的畫面曾雕。B幀壓縮率高奴烙,但是解碼時CPU會比較累。
    B幀的預(yù)測與重構(gòu)
    B幀以前面的 I 或P幀和后面的P幀為參考幀剖张,“找出”B幀“某點”的預(yù)測值和兩個運動矢量切诀,并取預(yù)測差值和運動矢量傳送。接收端根據(jù)運動矢量在兩個參考幀中“找出(算出)”預(yù)測值并與差值求和搔弄,得到B幀“某點”樣值幅虑,從而可得到完整的B幀。
    B幀的特點:
  • a. B幀是由前面的 I 或P幀和后面的P幀進(jìn)行預(yù)測的
  • b. B幀傳送的是它與前面的 I 或P幀和后面的P幀之間的預(yù)測誤差及運動矢量
  • c. B幀是雙向預(yù)測編碼幀
  • d. B幀壓縮比最高顾犹,因為它只反映并參考幀間運動主體的變化情況倒庵,預(yù)測比較準(zhǔn)確
  • e. B幀不是參考幀褒墨,不會造成解碼錯誤的擴(kuò)散
注:I、B哄芜、P幀是根據(jù)壓縮算法的需要貌亭,是人為定義的,他們都是實實在在的物理幀认臊。
一般來說圃庭,幀的壓縮率是7(跟JPG差不多),
P幀是20失晴,B幀可以達(dá)到50.可見使用B幀能節(jié)省大量空間剧腻,
節(jié)省出來的空間可以用來保存多一些幀,這樣在相同碼率下涂屁,可以提供更好的畫質(zhì)书在。

五. H264壓縮

1.分組:把幾幀圖像分為一組(GOP,也就是一個序列),為防止運動變化,幀數(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)行存儲和傳輸。

六. H264特點

1.更高的編碼效率:同H.263等標(biāo)準(zhǔn)的特率效率相比帖族,能夠平均節(jié)省大于50%的碼率栈源。
2.高質(zhì)量的視頻畫面:H.264能夠在低碼率情況下提供高質(zhì)量的視頻圖像,在較低帶寬上提供高質(zhì)量的圖像傳輸是H.264的應(yīng)用亮點竖般。
3.提高網(wǎng)絡(luò)適應(yīng)能力:H.264可以工作在實時通信應(yīng)用(如視頻會議)低延時模式下甚垦,也可以工作在沒有延時的視頻存儲或視頻流服務(wù)器中。
4.采用混合編碼結(jié)構(gòu):同H.263相同涣雕,H.264也使用采用DCT變換編碼加DPCM的差分編碼的混合編碼結(jié)構(gòu)艰亮,還增加了如多模式運動估計、幀內(nèi)預(yù)測挣郭、多幀預(yù)測迄埃、基于內(nèi)容的變長編碼、4x4二維整數(shù)變換等新的編碼方式兑障,提高了編碼效率调俘。
5.H.264的編碼選項較少:在H.263中編碼時往往需要設(shè)置相當(dāng)多選項,增加了編碼的難度旺垒,而H.264做到了力求簡潔的“回歸基本”,降低了編碼時復(fù)雜度肤无。
6.H.264可以應(yīng)用在不同場合:H.264可以根據(jù)不同的環(huán)境使用不同的傳輸和播放速率先蒋,并且提供了豐富的錯誤處理工具,可以很好的控制或消除丟包和誤碼宛渐。
7.錯誤恢復(fù)功能:H.264提供了解決網(wǎng)絡(luò)傳輸包丟失的問題的工具竞漾,適用于在高誤碼率傳輸?shù)臒o線網(wǎng)絡(luò)中傳輸視頻數(shù)據(jù)眯搭。
8.較高的復(fù)雜度:264性能的改進(jìn)是以增加復(fù)雜性為代價而獲得的。據(jù)估計业岁,H.264編碼的計算復(fù)雜度大約相當(dāng)于H.263的3倍鳞仙,解碼復(fù)雜度大約相當(dāng)于H.263的2倍。
H.264的目標(biāo)應(yīng)用涵蓋了目前大部分的視頻服務(wù)笔时,如有線電視遠(yuǎn)程監(jiān)控棍好、交互媒體、數(shù)字電視允耿、視頻會議借笙、視頻點播、流媒體服務(wù)等较锡。H.264為解決不同應(yīng)用中的網(wǎng)絡(luò)傳輸?shù)牟町愐导凇6x了兩層:視頻編碼層(VCL:Video Coding Layer)負(fù)責(zé)高效的視頻內(nèi)容表示,網(wǎng)絡(luò)提取層(NAL:Network Abstraction Layer)負(fù)責(zé)以網(wǎng)絡(luò)所要求的恰當(dāng)?shù)姆绞綄?shù)據(jù)進(jìn)行打包和傳送蚂蕴。

七. H.265與H.264的差異詳解

  • 1.1 H.264與H.265的主要差異
    H.265仍然采用混合編解碼低散,編解碼結(jié)構(gòu)域H.264基本一致,
  • 1.2. 壓縮性能比較
    H.265/HEVC HM-9.0 和H.264 JM-18.4 的BD-rate 比較:
    AllIntra case: 22%
    RandomAccess case: 34%
    LowDelay case: 37%
  • 1.3. 塊劃分結(jié)構(gòu)
    在H.265中骡楼,將宏塊的大小從H.264的16×16擴(kuò)展到了64×64熔号,以便于高分辨率視頻的壓縮。
    同時君编,采用了更加靈活的編碼結(jié)構(gòu)來提高編碼效率跨嘉,
    包括編碼單元(CodingUnit)、預(yù)測單元(PredictUnit)和變換單元(TransformUnit)吃嘿。
  • 1.4. 幀內(nèi)預(yù)測模式
    本質(zhì)上H.265是在H.264的預(yù)測方向基礎(chǔ)上增加了更多的預(yù)測方向
    H.265:所有尺寸的CU塊祠乃,亮度有35種預(yù)測方向,色度有5種預(yù)測方向
    H.264:亮度 4x4塊9個方向兑燥,8x8塊9個方向亮瓷,16x16塊4種方向,色度4種方向
  • 1.5. 幀間預(yù)測
    本質(zhì)上H.265是在H.264基礎(chǔ)上增加插值的抽頭系數(shù)個數(shù)降瞳,改變抽頭系數(shù)值以及增加運動矢量預(yù)測值的候選個數(shù)嘱支,以達(dá)到減少預(yù)測殘差的目的。
    H.265與H.264一樣插值精度都是亮度到1/4挣饥,色度到1/8精度除师,但插值濾波器抽頭長度和系數(shù)不同.
    H.265的增加了運動矢量預(yù)測值候選的個數(shù),而H.264預(yù)測值只有一個.
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末扔枫,一起剝皮案震驚了整個濱河市汛聚,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌短荐,老刑警劉巖倚舀,帶你破解...
    沈念sama閱讀 219,110評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件叹哭,死亡現(xiàn)場離奇詭異,居然都是意外死亡痕貌,警方通過查閱死者的電腦和手機(jī)风罩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來舵稠,“玉大人超升,你說我怎么就攤上這事≈椋” “怎么了廓俭?”我有些...
    開封第一講書人閱讀 165,474評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長唉工。 經(jīng)常有香客問我研乒,道長,這世上最難降的妖魔是什么淋硝? 我笑而不...
    開封第一講書人閱讀 58,881評論 1 295
  • 正文 為了忘掉前任雹熬,我火速辦了婚禮,結(jié)果婚禮上谣膳,老公的妹妹穿的比我還像新娘竿报。我一直安慰自己,他們只是感情好继谚,可當(dāng)我...
    茶點故事閱讀 67,902評論 6 392
  • 文/花漫 我一把揭開白布烈菌。 她就那樣靜靜地躺著,像睡著了一般花履。 火紅的嫁衣襯著肌膚如雪芽世。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,698評論 1 305
  • 那天诡壁,我揣著相機(jī)與錄音济瓢,去河邊找鬼。 笑死妹卿,一個胖子當(dāng)著我的面吹牛旺矾,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播夺克,決...
    沈念sama閱讀 40,418評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼箕宙,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了铺纽?” 一聲冷哼從身側(cè)響起扒吁,我...
    開封第一講書人閱讀 39,332評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后雕崩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,796評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡融撞,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,968評論 3 337
  • 正文 我和宋清朗相戀三年盼铁,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片尝偎。...
    茶點故事閱讀 40,110評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡饶火,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出致扯,到底是詐尸還是另有隱情肤寝,我是刑警寧澤,帶...
    沈念sama閱讀 35,792評論 5 346
  • 正文 年R本政府宣布抖僵,位于F島的核電站鲤看,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏耍群。R本人自食惡果不足惜义桂,卻給世界環(huán)境...
    茶點故事閱讀 41,455評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蹈垢。 院中可真熱鬧慷吊,春花似錦、人聲如沸曹抬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽谤民。三九已至堰酿,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間赖临,已是汗流浹背胞锰。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留兢榨,地道東北人嗅榕。 一個月前我還...
    沈念sama閱讀 48,348評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像吵聪,于是被迫代替她去往敵國和親凌那。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,047評論 2 355

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