25_H.264編碼

本文主要介紹一種非常流行的視頻編碼:H.264韵卤。

計(jì)算一下:10秒鐘1080p(1920x1080)拴清、30fps的YUV420P原始視頻贮庞,需要占用多大的存儲(chǔ)空間验毡?

  • (10 * 30) * (1920 * 1080) * 1.5 = 933120000字節(jié) ≈ 889.89MB
  • 可以看得出來(lái)升熊,原始視頻的體積是非常巨大的

由于網(wǎng)絡(luò)帶寬和硬盤(pán)存儲(chǔ)空間都是非常有限的虚青,因此,需要先使用視頻編碼技術(shù)(比如H.264編碼)對(duì)原始視頻進(jìn)行壓縮边酒,然后再進(jìn)行存儲(chǔ)和分發(fā)经柴。H.264編碼的壓縮比可以達(dá)到至少是100:1。

簡(jiǎn)介

H.264墩朦,又稱為MPEG-4 Part 10坯认,Advanced Video Coding

  • 譯為:MPEG-4第10部分氓涣,高級(jí)視頻編碼
  • 簡(jiǎn)稱:MPEG-4 AVC

H.264是迄今為止視頻錄制牛哺、壓縮和分發(fā)的最常用格式。截至2019年9月劳吠,已有91%的視頻開(kāi)發(fā)人員使用了該格式引润。H.264提供了明顯優(yōu)于以前任何標(biāo)準(zhǔn)的壓縮性能。H.264因其是藍(lán)光盤(pán)的其中一種編解碼標(biāo)準(zhǔn)而著名痒玩,所有藍(lán)光盤(pán)播放器都必須能解碼H.264淳附。

編碼器

H.264標(biāo)準(zhǔn)允許制造廠商自由地開(kāi)發(fā)具有競(jìng)爭(zhēng)力的創(chuàng)新產(chǎn)品,它并沒(méi)有定義一個(gè)編碼器蠢古,而是定義了編碼器應(yīng)該產(chǎn)生的輸出碼流奴曙。

x264是一款免費(fèi)的高性能的H.264開(kāi)源編碼器。x264編碼器在FFmpeg中的名稱是libx264草讶。

AVCodec *codec = avcodec_find_encoder_by_name("libx264");

解碼器

H.264標(biāo)準(zhǔn)中定義了一個(gè)解碼方法洽糟,但是制造廠商可以自由地開(kāi)發(fā)可選的具有競(jìng)爭(zhēng)力的、新的解碼器堕战,前提是他們能夠獲得與標(biāo)準(zhǔn)中采用的方法同樣的結(jié)果坤溃。

FFmpeg默認(rèn)已經(jīng)內(nèi)置了一個(gè)H.264的解碼器,名稱是h264嘱丢。

AVCodec *codec1 = avcodec_find_decoder_by_name("h264");

// 或者
AVCodec *codec2 = avcodec_find_decoder(AV_CODEC_ID_H264);

編碼過(guò)程與原理

H.264的編程過(guò)程比較復(fù)雜薪介,本文只介紹大體的框架和脈絡(luò),具體細(xì)節(jié)就不展開(kāi)了越驻。

大體可以歸納為以下幾個(gè)主要步驟:

  • 劃分幀類型
  • 幀內(nèi)/幀間編碼
  • 變換 + 量化
  • 濾波
  • 熵編碼

劃分幀類型

有統(tǒng)計(jì)結(jié)果表明:在連續(xù)的幾幀圖像中汁政,一般只有10%以內(nèi)的像素有差別,亮度的差值變化不超過(guò)2%伐谈,而色度的差值變化只在1%以內(nèi)烂完。

GOP

于是可以將一串連續(xù)的相似的幀歸到一個(gè)圖像群組(Group Of Pictures,GOP)诵棵。

GOP

GOP中的幀可以分為3種類型:

  • I幀(I Picture抠蚣、I Frame、Intra Coded Picture)履澳,譯為:幀內(nèi)編碼圖像嘶窄,也叫做關(guān)鍵幀(Keyframe)
    • 是視頻的第一幀怀跛,也是GOP的第一幀,一個(gè)GOP只有一個(gè)I幀
    • 編碼
      • 對(duì)整幀圖像數(shù)據(jù)進(jìn)行編碼
    • 解碼
      • 僅用當(dāng)前I幀的編碼數(shù)據(jù)就可以解碼出完整的圖像
    • 是一種自帶全部信息的獨(dú)立幀柄冲,無(wú)需參考其他圖像便可獨(dú)立進(jìn)行解碼吻谋,可以簡(jiǎn)單理解為一張靜態(tài)圖像
  • P幀(P Picture、P Frame现横、Predictive Coded Picture)漓拾,譯為:預(yù)測(cè)編碼圖像
    • 編碼
      • 并不會(huì)對(duì)整幀圖像數(shù)據(jù)進(jìn)行編碼
      • 以前面的I幀或P幀作為參考幀,只編碼當(dāng)前P幀與參考幀的差異數(shù)據(jù)
    • 解碼
      • 需要先解碼出前面的參考幀戒祠,再結(jié)合差異數(shù)據(jù)解碼出當(dāng)前P幀完整的圖像
  • B幀(B Picture骇两、B Frame、Bipredictive Coded Picture)姜盈,譯為:前后預(yù)測(cè)編碼圖像
    • 編碼
      • 并不會(huì)對(duì)整幀圖像數(shù)據(jù)進(jìn)行編碼
      • 同時(shí)以前面低千、后面的I幀或P幀作為參考幀,只編碼當(dāng)前B幀與前后參考幀的差異數(shù)據(jù)
      • 因?yàn)榭蓞⒖嫉膸兌嗔肆笏蹋灾恍枰鎯?chǔ)更少的差異數(shù)據(jù)
    • 解碼
      • 需要先解碼出前后的參考幀示血,再結(jié)合差異數(shù)據(jù)解碼出當(dāng)前B幀完整的圖像

不難看出,編碼后的數(shù)據(jù)大芯壤:I幀 > P幀 > B幀难审。

顯示和編碼順序

在較早的視頻編碼標(biāo)準(zhǔn)(例如MPEG-2)中,P幀只能使用一個(gè)參考幀近上,而一些現(xiàn)代視頻編碼標(biāo)準(zhǔn)(比如H.264)剔宪,允許使用多個(gè)參考幀拂铡。

多個(gè)參考幀

GOP的長(zhǎng)度

GOP的長(zhǎng)度表示GOP的幀數(shù)壹无。GOP的長(zhǎng)度需要控制在合理范圍,以平衡視頻質(zhì)量感帅、視頻大卸范А(網(wǎng)絡(luò)帶寬)和seek效果(拖動(dòng)、快進(jìn)的響應(yīng)速度)等失球。

  • 加大GOP長(zhǎng)度有利于減小視頻文件大小岖是,但也不宜設(shè)置過(guò)大,太大則會(huì)導(dǎo)致GOP后部幀的畫(huà)面失真实苞,影響視頻質(zhì)量

  • 由于P豺撑、B幀的復(fù)雜度大于I幀,GOP值過(guò)大黔牵,過(guò)多的P聪轿、B幀會(huì)影響編碼效率,使編碼效率降低

  • 如果設(shè)置過(guò)小的GOP值猾浦,視頻文件會(huì)比較大陆错,則需要提高視頻的輸出碼率灯抛,以確保畫(huà)面質(zhì)量不會(huì)降低,故會(huì)增加網(wǎng)絡(luò)帶寬

  • GOP長(zhǎng)度也是影響視頻seek響應(yīng)速度的關(guān)鍵因素音瓷,seek時(shí)播放器需要定位到離指定位置最近的前一個(gè)I幀对嚼,如果GOP太大意味著距離指定位置可能越遠(yuǎn)(需要解碼的參考幀就越多)、seek響應(yīng)的時(shí)間(緩沖時(shí)間)也越長(zhǎng)

GOP的類型

GOP又可以分為開(kāi)放(Open)绳慎、封閉(Closed)兩種纵竖。

  • Open
    • 前一個(gè)GOP的B幀可以參考下一個(gè)GOP的I幀
  • Closed
    • 前一個(gè)GOP的B幀不能參考下一個(gè)GOP的I幀
    • GOP不能以B幀結(jié)尾
長(zhǎng)度為15的Open GOP
長(zhǎng)度為15的Closed GOP

需要注意的是:

  • 由于P幀、B幀都對(duì)前面的參考幀(P幀杏愤、I幀)有依賴性磨确,因此,一旦前面的參考幀出現(xiàn)數(shù)據(jù)錯(cuò)誤声邦,就會(huì)導(dǎo)致后面的P幀乏奥、B幀也出現(xiàn)數(shù)據(jù)錯(cuò)誤,而且這種錯(cuò)誤還會(huì)繼續(xù)向后傳播

  • 對(duì)于普通的I幀亥曹,其后的P幀和B幀可以參考該普通I幀之前的其他I幀

在Closed GOP中邓了,有一種特殊的I幀,叫做IDR幀(Instantaneous Decoder Refresh媳瞪,譯為:即時(shí)解碼刷新)骗炉。

  • 當(dāng)遇到IDR幀時(shí),會(huì)清空參考幀隊(duì)列
  • 如果前一個(gè)序列出現(xiàn)重大錯(cuò)誤蛇受,在這里可以獲得重新同步的機(jī)會(huì)句葵,使錯(cuò)誤不會(huì)繼續(xù)往下傳播
  • 一個(gè)IDR幀之后的所有幀,永遠(yuǎn)都不會(huì)參考該IDR幀之前的幀
  • 視頻播放時(shí)兢仰,播放器一般都支持隨機(jī)seek(拖動(dòng))到指定位置乍丈,而播放器直接選擇到指定位置附近的IDR幀進(jìn)行播放最為便捷,因?yàn)榭梢悦鞔_知道該IDR幀之后的所有幀都不會(huì)參考其之前的其他I幀把将,從而避免較為復(fù)雜的反向解析
IDR

幀內(nèi)/幀間編碼

I幀采用的是幀內(nèi)(Intra Frame)編碼轻专,處理的是空間冗余。
P幀察蹲、B幀采用的是幀間(Inter Frame)編碼请垛,處理的是時(shí)間冗余。

劃分宏塊

在進(jìn)行編碼之前洽议,首先要將一張完整的幀切割成多個(gè)宏塊(Macroblock)宗收,H.264中的宏塊大小通常是16x16。

宏塊可以進(jìn)一步拆分為多個(gè)更小的變換塊(Transform blocks)亚兄、預(yù)測(cè)塊(Prediction blocks)混稽。

  • 變換塊的尺寸有:16x16、8x8、4x4

  • 預(yù)測(cè)塊的尺寸有:16×16荚坞、16×8挑宠、8×16、8×8颓影、8×4各淀、4×8、4×4

預(yù)測(cè)塊

幀內(nèi)編碼

幀內(nèi)編碼诡挂,也稱幀內(nèi)預(yù)測(cè)碎浇。以4x4的預(yù)測(cè)塊為例,共有9種可選的預(yù)測(cè)模式璃俗。

預(yù)測(cè)模式
預(yù)測(cè)模式描述

利用幀內(nèi)預(yù)測(cè)技術(shù)奴璃,可以得到預(yù)測(cè)幀,最終只需要保留預(yù)測(cè)模式信息城豁、以及預(yù)測(cè)幀與原始幀的殘差值苟穆。

編碼器會(huì)選取最佳預(yù)測(cè)模式,使預(yù)測(cè)幀更加接近原始幀唱星,減少相互間的差異雳旅,提高編碼的壓縮效率。

幀間編碼

幀間編碼间聊,也稱幀間預(yù)測(cè)攒盈,用到了運(yùn)動(dòng)補(bǔ)償(Motion compensation)技術(shù)。

編碼器利用塊匹配算法哎榴,嘗試在先前已編碼的幀(稱為參考幀)上搜索與正在編碼的塊相似的塊型豁。如果編碼器搜索成功,則可以使用稱為運(yùn)動(dòng)矢量的向量對(duì)塊進(jìn)行編碼尚蝌,該向量指向匹配塊在參考幀處的位置迎变。

在大多數(shù)情況下,編碼器將成功執(zhí)行驼壶,但是找到的塊可能與它正在編碼的塊不完全匹配氏豌。這就是編碼器將計(jì)算它們之間差異的原因喉酌。這些殘差值稱為預(yù)測(cè)誤差热凹,需要進(jìn)行變換并將其發(fā)送給解碼器。

綜上所述泪电,如果編碼器在參考幀上成功找到匹配塊般妙,它將獲得指向匹配塊的運(yùn)動(dòng)矢量和預(yù)測(cè)誤差。使用這兩個(gè)元素相速,解碼器將能夠恢復(fù)該塊的原始像素碟渺。

如果一切順利,該算法將能夠找到一個(gè)幾乎沒(méi)有預(yù)測(cè)誤差的匹配塊突诬,因此苫拍,一旦進(jìn)行變換芜繁,運(yùn)動(dòng)矢量加上預(yù)測(cè)誤差的總大小將小于原始編碼的大小。

如果塊匹配算法未能找到合適的匹配绒极,則預(yù)測(cè)誤差將是可觀的骏令。因此,運(yùn)動(dòng)矢量的總大小加上預(yù)測(cè)誤差將大于原始編碼垄提。在這種情況下榔袋,編碼器將產(chǎn)生異常,并為該特定塊發(fā)送原始編碼铡俐。

變換與量化

接下來(lái)對(duì)殘差值進(jìn)行DCT變換(Discrete Cosine Transform凰兑,譯為離散余弦變換)。

規(guī)格

H.264的主要規(guī)格有:

  • Baseline Profile(BP)
    • 支持I/P幀审丘,只支持無(wú)交錯(cuò)(Progressive)和CAVLC
    • 一般用于低階或需要額外容錯(cuò)的應(yīng)用吏够,比如視頻通話、手機(jī)視頻等即時(shí)通信領(lǐng)域
  • Extended Profile(XP)
    • 在Baseline的基礎(chǔ)上增加了額外的功能滩报,支持流之間的切換稿饰,改進(jìn)誤碼性能
    • 支持I/P/B/SP/SI幀,只支持無(wú)交錯(cuò)(Progressive)和CAVLC
    • 適合于視頻流在網(wǎng)絡(luò)上的傳輸場(chǎng)合露泊,比如視頻點(diǎn)播
  • Main Profile(MP)
    • 提供I/P/B幀喉镰,支持無(wú)交錯(cuò)(Progressive)和交錯(cuò)(Interlaced),支持CAVLC和CABAC
    • 用于主流消費(fèi)類電子產(chǎn)品規(guī)格如低解碼(相對(duì)而言)的MP4惭笑、便攜的視頻播放器侣姆、PSP和iPod等
  • High Profile(HiP)
    • 最常用的規(guī)格
    • 在Main的基礎(chǔ)上增加了8x8內(nèi)部預(yù)測(cè)、自定義量化沉噩、無(wú)損視頻編碼和更多的YUV格式(如4:4:4)
      • High 4:2:2 Profile(Hi422P)
      • High 4:4:4 Predictive Profile(Hi444PP)
      • High 4:2:2 Intra Profile
      • High 4:4:4 Intra Profile
    • 用于廣播及視頻碟片存儲(chǔ)(藍(lán)光影片)捺宗,高清電視的應(yīng)用
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市川蒙,隨后出現(xiàn)的幾起案子蚜厉,更是在濱河造成了極大的恐慌,老刑警劉巖畜眨,帶你破解...
    沈念sama閱讀 221,695評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件昼牛,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡康聂,警方通過(guò)查閱死者的電腦和手機(jī)贰健,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)恬汁,“玉大人伶椿,你說(shuō)我怎么就攤上這事。” “怎么了脊另?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,130評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵导狡,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我偎痛,道長(zhǎng)烘豌,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,648評(píng)論 1 297
  • 正文 為了忘掉前任看彼,我火速辦了婚禮廊佩,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘靖榕。我一直安慰自己标锄,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布茁计。 她就那樣靜靜地躺著料皇,像睡著了一般。 火紅的嫁衣襯著肌膚如雪星压。 梳的紋絲不亂的頭發(fā)上践剂,一...
    開(kāi)封第一講書(shū)人閱讀 52,268評(píng)論 1 309
  • 那天,我揣著相機(jī)與錄音娜膘,去河邊找鬼逊脯。 笑死,一個(gè)胖子當(dāng)著我的面吹牛竣贪,可吹牛的內(nèi)容都是我干的军洼。 我是一名探鬼主播,決...
    沈念sama閱讀 40,835評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼演怎,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼匕争!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起爷耀,我...
    開(kāi)封第一講書(shū)人閱讀 39,740評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤甘桑,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后歹叮,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體跑杭,經(jīng)...
    沈念sama閱讀 46,286評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評(píng)論 3 340
  • 正文 我和宋清朗相戀三年盗胀,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了艘蹋。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,505評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡票灰,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情屑迂,我是刑警寧澤浸策,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站惹盼,受9級(jí)特大地震影響庸汗,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜手报,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評(píng)論 3 333
  • 文/蒙蒙 一蚯舱、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧掩蛤,春花似錦枉昏、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,357評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至阳藻,卻和暖如春晰奖,著一層夾襖步出監(jiān)牢的瞬間肩刃,已是汗流浹背犀斋。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,466評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留馏锡,地道東北人蛔外。 一個(gè)月前我還...
    沈念sama閱讀 48,921評(píng)論 3 376
  • 正文 我出身青樓午衰,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親冒萄。 傳聞我的和親對(duì)象是個(gè)殘疾皇子臊岸,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評(píng)論 2 359

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

  • 音視頻高手課08-H264 I幀 P幀 B幀及手寫(xiě)H264編碼器 1 三種幀的說(shuō)明 1帅戒、I 幀:幀內(nèi)編碼幀,幀表示...
    private_object閱讀 1,926評(píng)論 1 7
  • 視頻編碼最重要目的就是為了進(jìn)行數(shù)據(jù)壓縮崖技,以此來(lái)降低數(shù)據(jù)傳輸和存儲(chǔ)的成本逻住,用一個(gè)簡(jiǎn)單的例子來(lái)說(shuō)明視頻編碼的重要性。我...
    村口大白楊閱讀 1,463評(píng)論 1 7
  • H.264編碼 特別備注 本系列非原創(chuàng)迎献,文章原文摘自【秒懂音視頻開(kāi)發(fā)】23_H.264編碼[https://www...
    蔣斌文閱讀 1,151評(píng)論 1 13
  • 硬件編碼相關(guān)知識(shí)(H264,H265) 閱讀人群:研究硬件編碼器應(yīng)用于iOS開(kāi)發(fā)中,從0研究關(guān)于硬件編解碼瞎访,碼流中...
    小東邪啊閱讀 12,782評(píng)論 0 18
  • 0.編碼流程圖 有了前面的知識(shí)鋪墊,今天我們進(jìn)入視頻編碼的相關(guān)內(nèi)容吁恍,在這里不得不介紹了一種非常流行的適配編碼H.2...
    coder_feng閱讀 1,078評(píng)論 0 2