一. 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 大小。劃分好宏塊后,計算宏塊的象素值肌毅。以此類推筷转,計算一幅圖像中每個宏塊的像素值。
劃分子塊:
H264對比較平坦的圖像使用 16X16 大小的宏塊悬而。但為了更高的壓縮率呜舒,還可以在 16X16 的宏塊上更劃分出更小的子塊。子塊的大小可以是 8X16? 16X8? 8X8? 4X8? 8X4? 4X4非常的靈活笨奠。宏塊劃分好后,就可以對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)行宏塊比較埃儿,計算兩幀的相似度。如下圖:
在相鄰幾幅圖像畫面中融涣,一般有差別的像素只有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ù)牟町愐导凇6x了兩層:視頻編碼層(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ù)測值只有一個.