H264編碼總結(jié)

在目前,無論在各個行只要和視頻相關(guān)的彤委,我們都可以看見H264相關(guān)的身影鞭铆,H264作為目前使用最廣泛的視頻壓縮標準,隨著 x264/openh264以及ffmpeg等開源庫的推出,大多數(shù)使用者無需再對H264的細節(jié)做過多的研究车遂。但是封断,為了在別的開發(fā)者面前更好的裝逼,有必要了解一下H264的基本原理和一些常見的概念舶担。
那么H264有多厲害坡疼?

H.264: H.264/AVC項目的目的是為了創(chuàng)建一個比以前的視頻壓縮標準,在更低的比特率的情況下依然能夠提供良好視頻質(zhì)量的標準(如衣陶,一半或者更少于MPEG-2,H.263,或者MPEG-4 Part2 )柄瑰。同時,還要不會太大的增加設(shè)計的復(fù)雜性剪况。
優(yōu)勢:
1)網(wǎng)絡(luò)親和性教沾,即可適用于各種傳輸網(wǎng)絡(luò)
2)高的視頻壓縮比,當初提出的指標是比 H.263译断,MPEG-4授翻,約為它們的 2 倍,現(xiàn)在都已基 實現(xiàn);

沒看出H264多厲害孙咪?那么我們來算個數(shù)堪唐,就拿直播來說,目前作為國內(nèi)最多美女的優(yōu)秀直播APP喵播翎蹈,如何做到實時傳輸視頻而不卡頓淮菠?很大一方面是因為視頻得高壓縮處理,而這個高壓縮處理就是基于H264來的荤堪。大家都知道視頻就是在播連環(huán)畫合陵,在一秒內(nèi)翻過 24 張以上的圖片,就感覺圖像是連續(xù)的了逞力,這就是視頻的原理曙寡。但是大家有沒有想過,一張圖片有多大呢寇荧?我們的屏幕分辨率按 1280 * 720 算的話举庶,一秒鐘的視頻大概就 2.64 MB 了。這么算揩抡,放在以前户侥,大伙省吃儉用去網(wǎng)吧,偷偷摸摸下個xxx電影峦嗤,發(fā)現(xiàn)3分鐘就上百兆蕊唐,那不是欲哭無淚啊。所以我們要進行壓縮烁设,而 H.264 不僅壓縮比比較高替梨,對網(wǎng)絡(luò)的兼容性也非常好钓试,所以大多數(shù)人做直播也就選擇了 H.264 作為編碼格式了。

以下副瀑,我就要按照我個人對H264的理解弓熏,參考網(wǎng)上大神的文章總結(jié)出來的。分別從H264編碼流程中一步一步的講解糠睡。
總共分5個部分:

  • 幀間和幀內(nèi)預(yù)測(Estimation)
  • 變換(Transform)和反變換
  • 量化(Quantization)和反量化
  • 環(huán)路濾波(Loop Filter)
  • 熵編碼(Entropy Coding)

看名詞是不是很難理解挽鞠,很高端?沒錯狈孔,就是這么高端信认,很難理解的。

H264基本結(jié)構(gòu)

H.264 原始碼流(又稱為裸流)均抽,是有一個接一個的 NALU 組成的嫁赏,而它的功能分為兩層:視頻編碼層(VCL, Video Coding Layer)和網(wǎng)絡(luò)提取層(NAL, Network Abstraction Layer),其中到忽,前者負責(zé)有效表示視頻數(shù)據(jù)的內(nèi)容橄教,而后者則負責(zé)格式化數(shù)據(jù)并提供頭信息,以保證數(shù)據(jù)適合各種信道和存儲介質(zhì)上的傳輸喘漏。因此我們平時的每幀數(shù)據(jù)就是一個NAL單元(SPS與PPS除外)。


圖1.png
RBS.jpg

VCL 數(shù)據(jù)即編碼處理的輸出华烟,它表示被壓縮編碼后的視頻數(shù)據(jù) 序列翩迈。在 VCL 數(shù)據(jù)傳輸或存儲之前,這些編碼的 VCL 數(shù)據(jù)盔夜,先被映射或封裝進 NAL 單元(以下簡稱 NALU负饲,Nal Unit) 中。每個 NALU 包括一個原始字節(jié)序列負荷(RBSP, Raw Byte Sequence Payload)喂链、一組 對應(yīng)于視頻編碼的 NALU 頭部信息返十。RBSP 的基本結(jié)構(gòu)是:在原始編碼數(shù)據(jù)的后面填加了結(jié)尾 比特。一個 bit“1”若干比特“0”椭微,以便字節(jié)對齊洞坑。

上圖中的 NALU頭 + RBSP 就相當與一個 NALU (Nal Unit), 每個單元都按獨立的 NALU 傳送。說到最后H264的基本結(jié)構(gòu)就是NALU蝇率。下面具體分析一下這個東西迟杂,它和我們壓縮有著密切聯(lián)系。

NALU的由來

一幀圖片經(jīng)過 H.264 編碼器之后本慕,就被編碼為一個或多個片(slice)排拷,而裝載著這些片(slice)的載體,就是 NALU 了锅尘,我們可以來看看 NALU 跟片的關(guān)系(slice)监氢。


圖2.png

幀(frame)是用作描述一張圖片的,一幀(frame)對應(yīng)一張圖片,而片(slice)浪腐,是 H.264 中提出的新概念何鸡,是通過編碼圖片后切分通過高效的方式整合出來的概念,一張圖片至少有一個或多個片(slice)牛欢。

什么是切片
圖3.png

上圖中可以看出骡男,片(slice)都是又 NALU 裝載并進行網(wǎng)絡(luò)傳輸?shù)模沁@并不代表 NALU 內(nèi)就一定是切片傍睹,這是充分不必要條件隔盛,因為 NALU 還有可能裝載著其他用作描述視頻的信息。

片的主要作用是用作宏塊(Macroblock)的載體(ps:下面會介紹到宏塊的概念)拾稳。片之所以被創(chuàng)造出來吮炕,主要目的是為限制誤碼的擴散和傳輸。
如何限制誤碼的擴散和傳輸访得?
每個片(slice)都應(yīng)該是互相獨立被傳輸?shù)牧祝称念A(yù)測(片(slice)內(nèi)預(yù)測和片(slice)間預(yù)測)不能以其它片中的宏塊(Macroblock)為參考圖像。

圖4.png

我們可以理解為一 張/幀 圖片可以包含一個或多個分片(Slice)悍抑,而每一個分片(Slice)包含整數(shù)個宏塊(Macroblock)鳄炉,即每片(slice)至少一個 宏塊(Macroblock),最多時每片包 整個圖像的宏塊搜骡。

上圖結(jié)構(gòu)中拂盯,我們不難看出,每個分片也包含著頭和數(shù)據(jù)兩部分:

  • 分片頭中包含著分片類型记靡、分片中的宏塊類型谈竿、分片幀的數(shù)量、分片屬于那個圖像以及對應(yīng)的幀的設(shè)置和參數(shù)等信息摸吠。
  • 分片數(shù)據(jù)中則是宏塊空凸,這里就是我們要找的存儲像素數(shù)據(jù)的地方。
什么是宏塊

宏塊是視頻信息的主要承載者寸痢,因為它包含著每一個像素的亮度和色度信息呀洲。視頻解碼最主要的工作則是提供高效的方式從碼流中獲得宏塊中的像素陣列。
組成部分:一個宏塊由一個16×16亮度像素和附加的一個8×8 Cb和一個 8×8 Cr 彩色像素塊組成轿腺。每個圖象中两嘴,若干宏塊被排列成片的形式。

圖5.png

從上圖中族壳,可以看到憔辫,宏塊中包含了宏塊類型、預(yù)測類型仿荆、Coded Block Pattern贰您、Quantization Parameter坏平、像素的亮度和色度數(shù)據(jù)集等等信息。锦亦、

來看看如何劃分宏塊的

編碼器先要為每一幅圖片劃分宏塊舶替。
以下面這張圖為例:


圖6.jpeg

H264默認是使用 16X16 大小的區(qū)域作為一個宏塊,也可以劃分成 8X8 大小杠园。


圖7.jpeg

劃分好宏塊后顾瞪,計算宏塊的象素值。


圖8.jpeg

以此類推抛蚁,計算一幅圖像中每個宏塊的像素值陈醒,所有宏塊都處理完后如下面的樣子。

圖9.jpeg
如何劃分子塊

在說著之前瞧甩,先了解切片(slice)類型跟宏塊類型的關(guān)系

  • I片:只包 I宏塊钉跷,I 宏塊利用從當前片中已解碼的像素作為參考進行幀內(nèi)預(yù)測(不能取其它片中的已解碼像素作為參考進行幀內(nèi)預(yù)測)。
  • P片:可包 P和I宏塊肚逸,P 宏塊利用前面已編碼圖象作為參考圖象進行幀內(nèi)預(yù)測爷辙,一個幀內(nèi)編碼的宏塊可進一步作宏塊的分割:即 16×16、16×8朦促、8×16 或 8×8 亮度像素塊(以及附帶的彩色像素);如果選了 8×8 的子宏塊膝晾,則可再分成各種子宏塊的分割,其尺寸為 8×8思灰、8×4玷犹、4×8 或 4×4 亮度像素塊(以及附帶的彩色像素)。
  • B片:可包 B和I宏塊洒疚,B 宏塊則利用雙向的參考圖象(當前和 來的已編碼圖象幀)進行幀內(nèi)預(yù)測宾添。
  • SP片(切換P):用于不同編碼流之間的切換继谚,包含 P 和/或 I 宏塊
  • SI片:擴展檔次中必須具有的切換耸携,它包 了一種特殊類型的編碼宏塊术浪,叫做 SI 宏塊琼讽,SI 也是擴展檔次中的必備功能允蜈。

H264對比較平坦的圖像使用 16X16 大小的宏塊巍糯。但為了更高的壓縮率齿穗,還可以在 16X16 的宏塊上更劃分出更小的子塊吠昭。子塊的大小可以是 8X16? 16X8? 8X8? 4X8? 8X4? 4X4非常的靈活喊括。


圖10.jpeg

上幅圖中,紅框內(nèi)的 16X16 宏塊中大部分是藍色背景矢棚,而三只鷹的部分圖像被劃在了該宏塊內(nèi)郑什,為了更好的處理三只鷹的部分圖像,H264就在 16X16 的宏塊內(nèi)又劃分出了多個子塊蒲肋。

圖11.jpeg

這樣再經(jīng)過幀內(nèi)壓縮蘑拯,可以得到更高效的數(shù)據(jù)钝满。下圖是分別使用mpeg-2和H264對上面宏塊進行壓縮后的結(jié)果。其中左半部分為MPEG-2子塊劃分后壓縮的結(jié)果申窘,右半部分為H264的子塊劃壓縮后的結(jié)果弯蚜,可以看出H264的劃分方法更具優(yōu)勢。


圖12.jpeg

到這里剃法,H264的基本結(jié)構(gòu)大致就明了了碎捺。整天應(yīng)該如下圖:


圖13.png

其實 H.264 的碼流結(jié)構(gòu)并沒有大家想的那么復(fù)雜,編碼后視頻的每一組圖像(GOP贷洲,圖像組)都給予了傳輸中的序列(PPS)和本身這個幀的圖像參數(shù)(SPS)收厨,所以,我們的整體結(jié)構(gòu)恩脂,應(yīng)該如此:

圖14.png

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

  • I幀:幀內(nèi)編碼幀 又稱intra picture,表示關(guān)鍵幀俩块,I 幀通常是每個 GOP(MPEG 所使用的一種視頻壓縮技術(shù))的第一個幀黎休,經(jīng)過適度地壓縮,做為隨機訪問的參考點玉凯,可以當成圖象势腮。I幀可以看成是一個圖像經(jīng)過壓縮后的產(chǎn)物。你可以理解為這一幀畫面的完整保留漫仆;解碼時只需要本幀數(shù)據(jù)就可以完成(因為包含完整畫面)
  • P幀: 前向預(yù)測編碼幀 又稱predictive-frame捎拯,通過充分將低于圖像序列中前面已編碼幀的時間冗余信息來壓縮傳輸數(shù)據(jù)量的編碼圖像,也叫預(yù)測幀盲厌;表示的是這一幀跟之前的一個關(guān)鍵幀(或P幀)的差別署照,解碼時需要用之前緩存的畫面(I幀)疊加上本幀定義的差別,生成最終畫面吗浩。(也就是差別幀建芙,P幀沒有完整畫面數(shù)據(jù),只有與前一幀的畫面差別的數(shù)據(jù))
  • B幀: 雙向預(yù)測內(nèi)插編碼幀(雙向差別幀懂扼、雙向預(yù)測幀) 又稱bi-directional interpolated prediction frame禁荸,既考慮與源圖像序列前面已編碼幀,也顧及源圖像序列后面已編碼幀之間的時間冗余信息來壓縮傳輸數(shù)據(jù)量的編碼圖像阀湿;也就是B幀記錄的是本幀與前后幀的差別(具體比較復(fù)雜赶熟,有4種情況),換言之陷嘴,要解碼B幀映砖,不僅要取得之前的緩存畫面,還要解碼之后的畫面罩旋,通過前后畫面的與本幀數(shù)據(jù)的疊加取得最終的畫面啊央。B幀壓縮率高眶诈,但是解碼時CPU會比較累~。
    除了I/P/B幀外瓜饥,還有圖像序列GOP逝撬。
  • GOP:兩個I幀之間是一個圖像序列,在一個圖像序列中只有一個I幀乓土。(圖像組)主要用作形容一個 i 幀 到下一個 i 幀之間的間隔了多少個幀宪潮,增大圖片組能有效的減少編碼后的視頻體積,但是也會降低視頻質(zhì)量趣苏,至于怎么取舍狡相,得看需求了。
    I幀是完整的視頻幀食磕,換句話說尽棕,客戶端只有在獲得I幀后才會有完整的視頻。如果直接發(fā)送彬伦,不等I幀滔悉,客戶端得到的畫面會殘缺,但是延遲較低单绑。如果等I幀回官,客戶端緩沖時間較長,得到畫面會完整搂橙,但是延遲至少是一個gop歉提。

I、P区转、B幀特點分析

I 幀特點:

    它是一個全幀壓縮編碼幀苔巨。它將全幀圖像信息進行JPEG壓縮編碼及傳輸; 
    解碼時僅用I幀的數(shù)據(jù)就可重構(gòu)完整圖像; 
    I幀描述了圖像背景和運動主體的詳情; 
    I幀不需要參考其他畫面而生成; 
    I幀是P幀和B幀的參考幀(其質(zhì)量直接影響到同組中以后各幀的質(zhì)量); 
    I幀是幀組GOP的基礎(chǔ)幀(第一幀),在一組中只有一個I幀; 
    I幀不需要考慮運動矢量; 
    I幀所占數(shù)據(jù)的信息量比較大。 

P幀特點:

    P幀是I幀后面相隔1~2幀的編碼幀; 
    P幀采用運動補償?shù)姆椒▊魉退c前面的I或P幀的差值及運動矢量(預(yù)測誤差); 
    解碼時必須將I幀中的預(yù)測值與預(yù)測誤差求和后才能重構(gòu)完整的P幀圖像; 
    P幀屬于前向預(yù)測的幀間編碼废离。它只參考前面最靠近它的I幀或P幀; 
    P幀可以是其后面P幀的參考幀,也可以是其前后的B幀的參考幀; 
    由于P幀是參考幀,它可能造成解碼錯誤的擴散; 
    由于是差值傳送,P幀的壓縮比較高恋拷。 

B幀特點

    B幀是由前面的I或P幀和后面的P幀來進行預(yù)測的; 
    B幀傳送的是它與前面的I或P幀和后面的P幀之間的預(yù)測誤差及運動矢量; 
    B幀是雙向預(yù)測編碼幀; 
    B幀壓縮比最高,因為它只反映丙參考幀間運動主體的變化情況,預(yù)測比較準確; 
    B幀不是參考幀,不會造成解碼錯誤的擴散。

那么上面幀類型在實際碼流上面是怎么判斷的厅缺?


圖15.png

如圖中標記:
在實際的H264數(shù)據(jù)幀中,往往幀前面帶有00 00 00 01 或 00 00 01分隔符宴偿,一般來說編碼器編出的首幀數(shù)據(jù)為PPS與SPS湘捎,接著為I幀……

  • 第一處:以00 00 00 01 06為開頭的是SEI信息
  • 第二處:以00 00 00 01 67為開頭的是SPS
  • 第三處:以00 00 00 01 68為開頭的是PPS
  • 第四處:以00 00 00 01 65為開頭的是IDR Slice,這個也就是I幀窄刘。

我們看到常用naltype 像sps= 0x07 pps= 0x08 sei = 0x06 I/P/B= 0x01/0x05 也就是說只判斷naltype = 0x01/0x05是判斷不出來I/P/B幀類型的窥妇,需要到slice層去判斷用到“熵編碼”具體的“熵編碼”內(nèi)容請看:“H.264官方中文版.pdf”.

NAL的解碼單元的流程如下:


圖16.jpg
幀內(nèi)預(yù)測

對一特定宏塊兒編碼時,利用周圍的宏塊的預(yù)測值和實際值的差進行編碼
人眼對圖象都有一個識別度娩践,對低頻的亮度很敏感活翩,對高頻的亮度不太敏感烹骨。所以基于一些研究,可以將一幅圖像中人眼不敏感的數(shù)據(jù)去除掉材泄。這樣就提出了幀內(nèi)預(yù)測技術(shù)沮焕。

H264的幀內(nèi)壓縮與JPEG很相似。一幅圖像被劃分好宏塊后拉宗,對每個宏塊可以進行 9 種模式的預(yù)測峦树。找出與原圖最接近的一種預(yù)測模式。


圖17.jpeg

下面這幅圖是對整幅圖中的每個宏塊進行預(yù)測的過程:


圖18.jpeg

幀內(nèi)預(yù)測后的圖像與原始圖像的對比如下:


圖19.jpeg

然后旦事,將原始圖像與幀內(nèi)預(yù)測后的圖像相減得殘差值:


圖20.jpeg

再將我們之前得到的預(yù)測模式信息一起保存起來魁巩,這樣我們就可以在解碼時恢復(fù)原圖了。效果如下:


圖21.jpeg

經(jīng)過幀內(nèi)與幀間的壓縮后姐浮,雖然數(shù)據(jù)有大幅減少谷遂,但還有優(yōu)化的空間。

幀間預(yù)測

利用連續(xù)幀中的時間冗余來進行運動估計和補償卖鲤。碼流中增加SP幀肾扰,方便在不同碼率的碼流間切換,同時支持隨機接入和快速回放扫尖。

幀分組

對于視頻數(shù)據(jù)主要有兩類數(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)特別密切的。

對于這些關(guān)聯(lián)特別密切的幀彻坛,其實我們只需要保存一幀的數(shù)據(jù)顷啼,其它幀都可以通過這一幀再按某種規(guī)則預(yù)測出來,所以說視頻數(shù)據(jù)在時間上的冗余是最多的昌屉。

為了達到相關(guān)幀通過預(yù)測的方法來壓縮數(shù)據(jù)钙蒙,就需要將視頻幀進行分組。那么如何判定某些幀關(guān)系密切间驮,可以劃為一組呢躬厌?我們來看一下例子,下面是捕獲的一組運動的臺球的視頻幀竞帽,臺球從右上角滾到了左下角扛施。


圖22.jpeg
圖23.jpeg

H264編碼器會按順序鸿捧,每次取出兩幅相鄰的幀進行宏塊比較,計算兩幀的相似度疙渣。如下圖:


圖24.jpeg

通過宏塊掃描與宏塊搜索可以發(fā)現(xiàn)這兩個幀的關(guān)聯(lián)度是非常高的匙奴。進而發(fā)現(xiàn)這一組幀的關(guān)聯(lián)度都是非常高的。因此昌阿,上面這幾幀就可以劃分為一組饥脑。其算法是:在相鄰幾幅圖像畫面中,一般有差別的像素只有10%以內(nèi)的點,亮度差值變化不超過2%懦冰,而色度差值的變化只有1%以內(nèi)灶轰,我們認為這樣的圖可以分到一組。

在這樣一組幀中刷钢,經(jīng)過編碼后笋颤,我們只保留第一帖的完整數(shù)據(jù),其它幀都通過參考上一幀計算出來内地。我們稱第一幀為IDR/I幀伴澄,其它幀我們稱為P/B幀,這樣編碼后的數(shù)據(jù)幀組我們稱為GOP阱缓。

運動估計與補償

在H264編碼器中將幀分組后非凌,就要計算幀組內(nèi)物體的運動矢量了。還以上面運動的臺球視頻幀為例荆针,我們來看一下它是如何計算運動矢量的敞嗡。

H264編碼器首先按順序從緩沖區(qū)頭部取出兩幀視頻數(shù)據(jù),然后進行宏塊掃描航背。當發(fā)現(xiàn)其中一幅圖片中有物體時喉悴,就在另一幅圖的鄰近位置(搜索窗口中)進行搜索。如果此時在另一幅圖中找到該物體玖媚,那么就可以計算出物體的運動矢量了箕肃。下面這幅圖就是搜索后的臺球移動的位置。


圖25.jpeg

通過上圖中臺球位置相差今魔,就可以計算出臺圖運行的方向和距離勺像。H264依次把每一幀中球移動的距離和方向都記錄下來就成了下面的樣子:


圖26.jpeg

運動矢量計算出來后,將相同部分(也就是綠色部分)減去错森,就得到了補償數(shù)據(jù)咏删。我們最終只需要將補償數(shù)據(jù)進行壓縮保存,以后在解碼時就可以恢復(fù)原圖了问词。壓縮補償后的數(shù)據(jù)只需要記錄很少的一點數(shù)據(jù)。如下所示:

圖27.jpeg

我們把運動矢量與補償稱為幀間壓縮技術(shù)嘀粱,它解決的是視頻幀在時間上的數(shù)據(jù)冗余激挪。除了幀間壓縮辰狡,幀內(nèi)也要進行數(shù)據(jù)壓縮,幀內(nèi)數(shù)據(jù)壓縮解決的是空間上的數(shù)據(jù)冗余垄分。下面我們就來介紹一下幀內(nèi)壓縮技術(shù)宛篇。

#######對殘差數(shù)據(jù)做DCT(量化和反量化)
步長以12.5%的符合速率遞增,不是固定的常數(shù)薄湿。變換系數(shù)的讀出有兩種:之字掃描和雙掃描叫倍。多數(shù)用之字掃描,雙掃描僅用于較小量化級的塊內(nèi)豺瘤。

可以將殘差數(shù)據(jù)做整數(shù)離散余弦變換吆倦,去掉數(shù)據(jù)的相關(guān)性,進一步壓縮數(shù)據(jù)坐求。如下圖所示蚕泽,左側(cè)為原數(shù)據(jù)的宏塊,右側(cè)為計算出的殘差數(shù)據(jù)的宏塊桥嗤。


圖28.jpeg

將殘差數(shù)據(jù)宏塊數(shù)字化后如下圖所示:


圖29.jpeg

將殘差數(shù)據(jù)宏塊進行 DCT 轉(zhuǎn)換:


圖30.jpeg

去掉相關(guān)聯(lián)的數(shù)據(jù)后须妻,我們可以看出數(shù)據(jù)被進一步壓縮了:


圖31.jpeg
熵編碼(CABAC)

熵編碼壓縮是一種無損壓縮,其實現(xiàn)原理是使用新的編碼來表示輸入的數(shù)據(jù)泛领,從而達到壓縮的效果荒吏。常用的熵編碼有游程編碼,哈夫曼編碼和CAVLC編碼等渊鞋。

CABAC

CABAC(ContextAdaptive Binary Arithmatic Coding)也是 H.264/MPEG-4AVC中使用的熵編碼算法绰更。CABAC在不同的上下文環(huán)境中使用不同的概率模型來編碼。其編碼過程大致是這樣:首先篓像,將欲編碼的符號用二進制bit表示动知;然后對于每個bit,編碼器選擇一個合適的概率模型员辩,并通過相鄰元素的信息來優(yōu)化這個概率模型盒粮;最后,使用算術(shù)編碼壓縮數(shù)據(jù)奠滑。

MPEG-2中使用的VLC就是這種算法丹皱,我們以 A-Z 作為例子,A屬于高頻數(shù)據(jù)宋税,Z屬于低頻數(shù)據(jù)摊崭。看看它是如何做的:


圖32.jpeg

CABAC也是給高頻數(shù)據(jù)短碼杰赛,給低頻數(shù)據(jù)長碼呢簸。同時還會根據(jù)上下文相關(guān)性進行壓縮,這種方式又比VLC高效很多。其效果如下:

圖33.jpeg

現(xiàn)在將 A-Z 換成視頻幀根时,它就成了下面的樣子:


圖34.jpeg

最后瘦赫,本文對H264的基本結(jié)構(gòu)進行了分析,也講述了他的幾大要點蛤迎。本文參考融合以下兩篇文章(感謝他們的無私奉獻)确虱,并且加入自己的一些理解,希望通過這兩篇文章和自己的理解替裆,能讓你更好的理解H264校辩,文中有不足的,留言辆童。
H264基本原理
深入淺出理解視頻編碼H264結(jié)構(gòu)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末宜咒,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子胸遇,更是在濱河造成了極大的恐慌荧呐,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件纸镊,死亡現(xiàn)場離奇詭異倍阐,居然都是意外死亡,警方通過查閱死者的電腦和手機逗威,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進店門峰搪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人凯旭,你說我怎么就攤上這事概耻。” “怎么了罐呼?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵鞠柄,是天一觀的道長。 經(jīng)常有香客問我嫉柴,道長厌杜,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任计螺,我火速辦了婚禮夯尽,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘登馒。我一直安慰自己匙握,他們只是感情好,可當我...
    茶點故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布陈轿。 她就那樣靜靜地躺著圈纺,像睡著了一般秦忿。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上赠堵,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天小渊,我揣著相機與錄音,去河邊找鬼茫叭。 笑死,一個胖子當著我的面吹牛半等,可吹牛的內(nèi)容都是我干的揍愁。 我是一名探鬼主播,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼杀饵,長吁一口氣:“原來是場噩夢啊……” “哼莽囤!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起切距,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤朽缎,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后谜悟,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體话肖,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年葡幸,在試婚紗的時候發(fā)現(xiàn)自己被綠了最筒。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡蔚叨,死狀恐怖床蜘,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蔑水,我是刑警寧澤邢锯,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站搀别,受9級特大地震影響丹擎,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜领曼,卻給世界環(huán)境...
    茶點故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一鸥鹉、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧庶骄,春花似錦毁渗、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽府适。三九已至,卻和暖如春肺樟,著一層夾襖步出監(jiān)牢的瞬間檐春,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工么伯, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留疟暖,地道東北人。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓田柔,卻偏偏與公主長得像俐巴,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子硬爆,可洞房花燭夜當晚...
    茶點故事閱讀 42,925評論 2 344

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