解析视频编码原理——从孙艺珍的电影说起(一)
更多博文,請看音視頻系統(tǒng)學(xué)習(xí)的浪漫馬車之總目錄
視頻理論基礎(chǔ):
視頻基礎(chǔ)知識掃盲
音視頻開發(fā)基礎(chǔ)知識之YUV顏色編碼
解析視頻編碼原理——從孫藝珍的電影說起(一)
解析視頻編碼原理——從孫藝珍的電影說起(二)
當(dāng)天邊那顆星出現(xiàn)
你可知我又開始想念
有多少愛戀只能遙遙相望
就像月光灑向海面
每次聽到李健老師這首歌出神入化的歌聲,我就馬上浮起《電影假如愛有天意》的畫面,而現(xiàn)在的電影絕大部分都是由經(jīng)過編碼壓縮的,所以視頻編碼就成為了視頻開發(fā)非常關(guān)鍵的一環(huán)節(jié)。
上一篇 音視頻入門之YUV顏色編碼,介紹了視頻的基本顏色編碼方式,有了顏色編碼的鋪墊,那么就可以很自然地進入視頻開發(fā)的主題地帶了~
從今天開始講下視頻編碼技術(shù),計劃用兩篇博文講解,第一篇講解編碼基本原理,第二篇講解具體的碼流結(jié)構(gòu),博文內(nèi)容很多在網(wǎng)上其他博客不一定能夠搜索到,并且盡量用工具和圖像提供可視化的呈現(xiàn)以幫助大家更好理解。這兩篇博文可以說將是 音視頻系統(tǒng)學(xué)習(xí)的浪漫馬車之總目錄
系列非常重要的2篇博文,它們是視頻理論知識最重要的部分,為后面視頻的開發(fā)奠定最重要的基礎(chǔ)。只有對編碼原理和碼流理解得足夠徹底,才能做好開發(fā)工作,因為視頻的開發(fā)不再是簡單地調(diào)用api的開發(fā),如果理解不透徹,遇到問題根本無從下手,甚至連api都不知道要怎么使用。
這里的編碼可以理解為壓縮,今天只打算將視頻編碼技術(shù)的基本原理講一下,不涉及具體數(shù)學(xué)知識,從一個宏觀角度去看整個視頻編碼流程。
上一篇音視頻開發(fā)基礎(chǔ)知識之YUV顏色編碼 我們已經(jīng)知道在視頻中的像素是如何表示的,那么我們假設(shè)有一個電影視頻,分辨率是 1080P,幀率是 25fps,并且時長是 2 小時,如果是yuv420的格式的話,一個像素為1.5字節(jié),那么如果不做視頻壓縮的話,它的大小是 1920 x 1080 x 1.5 x 25 x 2 x 3600 = 521.4G,一臺電腦能存放幾部電影呢?如果在網(wǎng)絡(luò)傳輸,那么對流量和帶寬的消耗可是非常大的(你要知道,在同個時間點,你們小區(qū)在看片的人就已經(jīng)很多了),所以,為了滿足廣大群眾的需求,對視頻進行壓縮就顯示非常有必要,于是視頻壓縮技術(shù)就應(yīng)運而生。
H.264簡介
說的視頻編碼技術(shù),就不得不提到大名鼎鼎的H.264編碼。目前市面常見的編碼標(biāo)準(zhǔn)有H264、H265、VP8、VP9 和 AV1,而其中用的最普遍的視頻編碼就是H.264。
H264和H265都是國際標(biāo)準(zhǔn)化組織(ISO)和國際電信聯(lián)盟(ITU)開發(fā)的編碼標(biāo)準(zhǔn),而VP8、VP9 和 AV1是谷歌開發(fā)的編碼標(biāo)準(zhǔn),H264 和 H265 是需要專利費的,所以VP8、VP9 和 AV1(都是免費)也是谷歌為了對抗他們高昂專利費而開發(fā)出來的。
由于H.264是目前最常用的編碼標(biāo)準(zhǔn),所以主要就來介紹它。H.264是國際標(biāo)準(zhǔn)化組織(ISO)和國際電信聯(lián)盟(ITU)共同提出的繼MPEG4之后的新一代數(shù)字視頻壓縮格式,也可以看做是國際電信聯(lián)盟(ITU)提出的h26x系列和國際電信聯(lián)盟(ITU)提出的MPEG系列斗爭多年最后決定化干戈為玉帛,為共同造福人類而努力的產(chǎn)物。
這是2家組織的一個斗爭轉(zhuǎn)合作的大致歷史,各位了解以下即可。
接下來,就是介紹H264的正題部分了。
視頻編碼基本原理
編碼總體思路
既然叫做壓縮,那么肯定是要去除冗余信息的,一般來說冗余信息要么是有重復(fù)多余的,可以直接丟棄或者換成另一種更省空間的方式來表達,要么是人感知不敏感,即使去掉一些信息,人也很難感知到。對于我么 Android開發(fā)來說,最熟悉的壓縮莫過于Bitmap的壓縮了,常見2種,一是壓縮分辨率,這個對應(yīng)去除重復(fù)多余的信息,一種是質(zhì)量壓縮,對應(yīng)去掉一些人感知不敏感的信息。那么視頻也是有類似的冗余信息的:
H264壓縮技術(shù)正是針對以上冗余信息進行一一攻破,主要采用了以下幾種方法對視頻數(shù)據(jù)進行壓縮。最主要的步驟包括:
詳細請繼續(xù)閱讀之后部分:
幀內(nèi)預(yù)測
空間冗余
一幅圖像中相鄰像素的亮度和色度信息是比較接近的,并且亮度和色度信息也是逐漸變化的,不太會出現(xiàn)突變。也就是說,圖像具有空間相關(guān)性。 利用這種相關(guān)性,視頻壓縮就可以去除空間冗余信息。
回到開頭提及的電影《假如愛有天意》中很喜歡的開頭那段孫藝珍的畫面:
隨手圈出幾個區(qū)域都是亮度和色度信息是比較接近的,那么這些區(qū)域,是不是就可以不用完整數(shù)據(jù)記錄,而只要使用一小部分?jǐn)?shù)據(jù)記錄就可以表達全部呢?
比如android開發(fā)中的漸變色,我們并不需要指定整個圖像全部像素數(shù)據(jù),而只是記錄開頭和結(jié)束以及中間變化的顏色,加上漸變位置以及漸變方向。
而視頻也是利用了類似的方法去除冗余信息,叫做幀內(nèi)預(yù)測,即幀內(nèi)預(yù)測通過利用已經(jīng)編碼的相鄰像素的值來預(yù)測待編碼的像素值,最后達到減少空間冗余的目的。
具體預(yù)測方法
整體思路是利用一幀圖像中已經(jīng)編碼部分來預(yù)測尚未編碼部分圖像,實際值和預(yù)測值之間的差別叫做殘差。實際上真正編碼的是殘差數(shù)據(jù),因為殘差一般比較小,所以對殘差編碼比對實際數(shù)據(jù)編碼會小很多。
所謂物以類聚人以群分,分而治之的思想又發(fā)揮重要作用了。為了可以利用編碼部分來預(yù)測尚未編碼部分圖像,所以需要根據(jù)具體情況對一幀圖像劃分為若干個部分, 每個部分叫做塊,其中某些塊可以預(yù)測另外一些塊。H264中對一幀圖像劃分為宏塊的方式來分別進行幀內(nèi)預(yù)測,宏塊可以預(yù)測相鄰的宏塊,那么同個宏塊的像素就使用一種預(yù)測模式。那么何為宏塊呢?
一張圖片
比如一幀圖像如下:
H264默認是使用 16X16像素大小的區(qū)域作為一個宏塊,其中亮度塊為 16 x 16,色度塊為 8 x 8,幀內(nèi)預(yù)測中亮度塊和色度塊是分開獨立進行預(yù)測的,比如左上角區(qū)域:
H264對比較平坦的圖像使用 16X16 大小的宏塊。但為了更高的壓縮率,在細節(jié)復(fù)雜的地方,還可以在 16X16 的宏塊上更劃分出更小的子塊。子塊的大小可以是 8X16、 16X8、 8X8、 4X8、 8X4、 4X4,非常的靈活。
還是孫藝珍,紅色塊就是16*16的宏塊,綠色剪頭指的就是進一步劃分的子塊:
對于4*4的宏塊,幀內(nèi)預(yù)測模式總共有 9 個。其中有 8 種方向模式和一種 DC 模式,接下來簡單介紹下各種幀內(nèi)預(yù)測模式:
1.Vertical 模式
Vertical 模式就是指,當(dāng)前編碼亮度塊的每一列的像素值,都是復(fù)制上邊已經(jīng)編碼塊的最下面那一行的對應(yīng)位置的像素值。
2.Horizontal 模式
Horizontal 模式就是指,當(dāng)前編碼亮度塊的每一行的像素值,都是復(fù)制左邊已經(jīng)編碼塊的最右邊那一列的對應(yīng)位置的像素值
3.DC 模式
DC 模式就是指,當(dāng)前編碼亮度塊的每一個像素值,是上邊已經(jīng)編碼塊的最下面那一行和左邊已編碼塊右邊最后一列的所有像素值的平均值,所以DC 模式預(yù)測得到的塊中每一個像素值都是一樣的。
4.Diagonal Down-Left 模式
Diagonal Down-Left 模式是上邊塊和右上塊的像素通過插值得到。如果上邊塊和右上塊不存在則該模式無效。
5.Diagonal Down-Right 模式
Diagonal Down-Right 模式需要通過上邊塊、左邊塊和左上角對角的像素通過插值得到。如果這三個有一個不存在則該模式無效。
6.Vertical-Right 模式
Vertical-Right 模式是需要通過上邊塊、左邊塊以及左上角對角的像素插值得到的。
7.Horizontal-Down 模式
Horizontal-Down 模式需要通過上邊塊、左邊塊以及左上角對角的像素插值得到。必須要這三個都有效才能使用,否則該模式無效。
8.Vertical-Left 模式
Vertical-Left 模式是需要通過上邊塊和右上塊最下面一行的像素通過插值得到。
9.Horizontal-Up 模式
Horizontal-Up 模式是需要通過左邊塊的像素通過插值得到的。
總結(jié)一下就是:
16 * 16和8 * 8的宏塊預(yù)測模式一樣,都是有4種幀內(nèi)預(yù)測模式:
前面三種在4 * 4宏塊預(yù)測模式中已經(jīng)存在,只有最后一種plane是4 * 4宏塊預(yù)測模式?jīng)]有的。
plane預(yù)測塊的每一個像素值,都是將上邊已編碼塊的最下面那一行,和左邊已編碼塊右邊最后一列的像素值經(jīng)過一定算法計算得到。
每一個宏塊只能用一種預(yù)測模式,那如何選擇呢?具體算法很復(fù)雜,大概思路就是對于每一個塊或者子塊,我們可以得到預(yù)測塊,再用實際待編碼的塊減去預(yù)測塊就可以得到殘差塊。然后在不同場景下根據(jù)不同的算法對殘差塊進行計算得到最優(yōu)的預(yù)測模式。
所謂工欲善其事必先利其器,可能上面基本都是理論的東西,看起來還是有點霧里看花,那么可以使用H264Visa這種優(yōu)秀的視頻查看工具來查看一個H264文件具體編碼的數(shù)據(jù),真真切切感受編碼是如何進行的。
這里有一段抖音某個紅人的視頻:
用FFmpeg轉(zhuǎn)為H264文件(具體怎么轉(zhuǎn)后面講FFmpeg再講),用H264Visa打開:
暫時只看第一幀(因為第一幀必定是I幀,即只有幀內(nèi)預(yù)測的幀,關(guān)于I幀后面會詳細講解)
上面一個個數(shù)字對應(yīng)每個宏塊的具體圖像數(shù)值,可以表示該宏塊的量化參數(shù)QP(關(guān)于量化,后面也會講到),也可以切換為表示宏塊碼流大小。
選中其中一個宏塊,可以查看宏塊基本信息:
圖中右邊紅框部分可以看到宏塊的坐標(biāo)、宏塊大小、宏塊類型以及QP等信息。可以看到該宏塊是4*4、I宏塊(僅使用幀內(nèi)預(yù)測)、坐標(biāo)為(16,48)。
可以直接看到該宏塊的所用到的預(yù)測模式,可以看到亮度(Y)和色度(UV)是分別預(yù)測的,所用的宏塊大小也是不一樣的。
這是預(yù)測幀,可以看到和原始幀還是有差別的,看起來更模糊了些:
原始幀和預(yù)測幀相減得到的就是殘差幀了:
這可以說已經(jīng)是面目全非了,只剩一點點輪廓,而這些殘差數(shù)據(jù)將和相關(guān)預(yù)測信息全部一起送到后面步驟,即變換和量化、編碼處理后打入碼流。
用一種更為量化的方式查看該宏塊,直接查看該宏塊的原始幀yuv數(shù)據(jù):
殘差幀的yuv數(shù)據(jù):
可以看出經(jīng)過參數(shù)幀大部分像素數(shù)值變成0了,這部分?jǐn)?shù)據(jù)將傳入下一個階段,而正是利用殘差數(shù)據(jù)擁有大量0的特點(后面的變換量化還會增加0的個數(shù)),這一部分?jǐn)?shù)據(jù)通過編碼后放入碼流將大大減少碼流大小。
幀間預(yù)測
時間冗余
在一個視頻中,一般前后兩幀圖像往往變化比較小,這就是視頻的時間相關(guān)性。
而視頻一般往往一秒會播放20-30幀,所以存在大量重復(fù)的圖像數(shù)據(jù),所以會有巨大的壓縮空間。
還是孫藝珍在這部電影中的連續(xù)5幀畫面:
很明顯,5幀畫面差別非常小,那么很容易想到,能不能只記錄第一幀畫面數(shù)據(jù),然后后面幾幀只記錄差別數(shù)據(jù)呢?
視頻編碼中,就是通過在已經(jīng)編碼的幀里面找到一個塊來預(yù)測待編碼塊的像素,從而達到減少時間冗余的目的,官方名稱為:幀間預(yù)測。
具體來說,就是在前面某一幀找到一個內(nèi)容很接近的塊,那么只要再加上運動矢量,就可以表示當(dāng)前的塊。
比如這是前后兩幀(圖來源于:幀間預(yù)測:如何減少時間冗余),背景的樹木都是靜止的,只有汽車是移動的,對整個圖片建立坐標(biāo)系,那么汽車的移動就可以用運動矢量(-163,0)(16是因為每個宏塊為1616)表示:
回到現(xiàn)實視頻例子,比如前面一幀孫藝珍的左手是一個塊:
到了后面若干幀之后,這個塊的位置發(fā)生了移動,但是內(nèi)容基本一致(存在較小的殘差數(shù)據(jù))
所以后面的這一幀就不必記錄左手這一個塊的圖像信息了,只要記錄運動矢量、所參考的宏塊標(biāo)識和殘差數(shù)據(jù)即可,這樣比直接把后面一幀的左手的圖像數(shù)據(jù)編碼進入碼流要小很多。前面一幀也就是后面一幀的參考幀。
類似加上下圖的綠色剪頭:
用專業(yè)分析軟件打開看看運動矢量分析圖:
可以看到大量密密麻麻讓人犯密集恐懼癥的細線,表示運動矢量,而我們關(guān)注的孫藝珍左手的塊(綠色框),上面的紅色線方向大體和移動方向一致。
運動估計
幀間預(yù)測一個重要概念就是運動估計,就是尋找當(dāng)前編碼的塊在已編碼圖像中的最佳對應(yīng)塊。
如圖,假設(shè)P為當(dāng)前編碼幀,Pr為參考幀,當(dāng)前編碼塊為B,則運動估計要做的就是在Pr中尋找與B相減殘差最小的塊Br,Br就叫做B的最佳匹配塊。
放到孫藝珍視頻例子中,運動估計就是尋找上面第二幅圖中孫藝珍左手在第一張圖中對應(yīng)的最佳圖像塊。當(dāng)然我們?nèi)搜劭梢院芸煺业胶竺嬉粠笫趾颓懊嬉粠笫质亲罴哑ヅ?#xff0c;但是計算機可就不好找了,所以幀間預(yù)測這里的難點在于如何找到最佳的參考塊來預(yù)測當(dāng)前塊,這里涉及很多復(fù)雜的運動搜索算法,主要有這兩種算法:
(1)全局搜索算法。該方法是把搜索區(qū)域內(nèi)所有的像素塊逐個與當(dāng)前宏塊進行比較,查找具有最小匹配誤差的一個像素塊為匹配塊。這一方法的好處是可以找到最佳的匹配塊,壞處是速度太慢。目前全局搜索算法極少使用。
(2)快速搜索算法。該方法按照一定的數(shù)學(xué)規(guī)則進行匹配塊的搜索。這一方法的好處是速度快,壞處是可能只能得到次最佳的匹配塊。
具體可以看下幀間預(yù)測:如何減少時間冗余,這里重點是要知道I幀,P幀和B幀這幾個概念。
GOP
前面已經(jīng)介紹了幀內(nèi)預(yù)測和幀間預(yù)測2種壓縮技術(shù),結(jié)合具體視頻內(nèi)容,為了得到更好的壓縮率,我們可以對不同的幀使用不同的預(yù)測壓縮方式。我們知道一個視頻會有若干個場景,即在一個內(nèi)容為相似的背景或者空間內(nèi)有著相似的人物或者物體,而每個場景會由若干幀組成,而這些幀往往是強相關(guān)的,最適合進行幀間預(yù)測,這里一個場景的幀的組合,就叫做GOP(group of pictures)。
比如剛才孫藝珍是在屋子的窗前,坐著打開收藏盒:
這個場景持續(xù)了幾秒,播放了好多好多幀,然后切到孫藝珍接電話的場景:
這里就是2個視頻場景GOP,根據(jù)場景內(nèi)幀的強相關(guān)性和幀預(yù)測理論,所以可以對一個場景的首幀進行幀內(nèi)預(yù)測去除空間冗余,然后后面的幀來參考首幀,再后面的幀再來參考前面已經(jīng)預(yù)測出來的幀,為了更好地降低壓縮率,還可以不止一個參考幀,比如一幀可以參考前后2幀,于是就出現(xiàn)了I幀,P幀和B幀。
經(jīng)過壓縮后的幀被人為劃分為分為:I幀,P幀和B幀:
I幀:關(guān)鍵幀,采用幀內(nèi)壓縮技術(shù)。
P幀:向前參考幀,在壓縮時,只參考前面已經(jīng)處理的幀。采用幀間壓縮和幀內(nèi)技術(shù)。
B幀:雙向參考幀,在壓縮時,它即參考前而的幀,又參考它后面的幀。采用幀間和幀內(nèi)壓縮技術(shù)。
由于P、B幀同時包含幀間幀內(nèi)預(yù)測,所以宏塊同樣也有劃分I、P、B宏塊,I宏塊用來做幀內(nèi)預(yù)測,宏塊用來做向前參考幀的預(yù)測,B宏塊用來做雙向參考幀預(yù)測。I幀僅包含I宏塊,P幀包含P宏塊和I宏塊,B幀包含B宏塊和I宏塊。
那么GOP究竟是什么呢?
GOP是一個圖像序列,一般可以理解為一個場景的若干個幀,比如一段電影片段在主角在公園里,因為整體畫面差別不大,所以可以放入一個gop中,接下來切到主角在室內(nèi)了,那么此時就重新開始另一個gop了。在一個圖像序列中只有一個I幀。如下圖所示:
每個GOP首幀就是I幀,它采用幀內(nèi)預(yù)測,是一個全幀壓縮編碼幀,描述了圖像背景和運動主體的詳情,不需要考慮運動矢量,解碼時僅用I 幀的數(shù)據(jù)就可重構(gòu)完整圖像,是P幀和B幀的參考幀。
后面的幀會使用幀間預(yù)測技術(shù)參考I幀或之后編碼出來的P幀,P幀表示的是這一幀跟之前的一個關(guān)鍵幀(或P幀)的差別,P幀沒有完整畫面數(shù)據(jù),只有與前一幀的畫面差別的數(shù)據(jù)。P幀是以 I 幀或前面的P幀為參考幀,在 參考幀中找出P幀“某點”的預(yù)測值和運動矢量,取預(yù)測差值和運動矢量一起傳送。在接收端根據(jù)運行矢量從 I 幀找出P幀“某點”的預(yù)測值并與差值相加以得到P幀“某點”樣值,從而可得到完整的P幀。
B幀是雙向差別幀,和P幀的主要區(qū)別在于它是參考前后2幀,也就是B幀記錄的是本幀與前后幀的差別。 B幀以前面的 I 或P幀和后面的P幀為參考幀,“找出”B幀“某點”的預(yù)測值和兩個運動矢量,并取預(yù)測差值和運動矢量傳送。不過正是由于需要參考后面的P幀,所以B幀雖然提高了壓縮率,但是也帶來了編碼延遲問題(需要等后面一幀編碼好才能編碼)。
B幀的雙向預(yù)測圖:
由于幀間預(yù)測需要參考編碼好的幀,所以需要緩存隊列緩存編碼好的再解碼重建的幀來給后續(xù)編碼的幀作為參考幀。那為什么不直接拿原始宏塊而要專門重新解碼編碼好的宏塊做為參考呢?關(guān)鍵點在于為了和解碼流程保持一致的參考宏塊,因為編碼出來的宏塊和解碼重建的宏塊并非完全一致的,所以如果幀間預(yù)測在編碼端和解碼器端參考幀不一致,就會出錯。
比如B幀需要前后參考幀,所以需要2個緩存隊列:
這里由于B幀的引入,會導(dǎo)致一個現(xiàn)象,就是編碼的幀順序和播放的幀順序會不一致:
所以也衍生了pts和dts2個時間戳,這在后面的代碼開發(fā)是一種很需要注意的點,不然用錯出問題了都不知道什么原因。
打個比方,就比如有一排人,每人說一句話,他們每個人要說的東西比較接近,但是要求說話字?jǐn)?shù)盡量少。為了使得總說話的數(shù)量盡量少,第一個人說了完整的一句話(盡量概括),后面的人只說了相對第一個人說的話有區(qū)別的部分,而還有的人說了和前后2個人區(qū)別的部分,使得總的需要說的話更少。這樣子只要推導(dǎo)一下就能推導(dǎo)出他們每個人完整的話的內(nèi)容。
顯然I幀壓縮率最低,其次是P幀,B幀壓縮率最高。
這里還要提到一種特殊的I幀,叫做IDR幀,因為幀間預(yù)測技術(shù)總是不斷參考前面已經(jīng)編碼成功的幀,那如果其中一幀編碼出錯,那可能造成后面幀的錯誤傳遞,比如第一個人說話說錯了一個字,那么后面參考他的人基于他的話說了區(qū)別部分,那么推導(dǎo)出的原話必然會出錯。所以IDR幀的作用就是用來阻斷錯誤傳遞的,它就限制后面同個GOP的幀不能參考前面的GOP的幀,這樣一旦某一幀出錯,錯誤也僅限于一個GOP內(nèi),不會傳入下一個GOP。
Gop越長,編碼的I幀就越少,壓縮率越高,但是視頻質(zhì)量往往越差。那么Gop設(shè)置多長合適呢?
本地視頻文件一般根據(jù)具體場景選擇壓縮率和質(zhì)量的折中方案。直播流一般是幀率的倍數(shù),一般不會設(shè)置過長,因為如果Gop太長,則進入直播間的時候等待I幀的時間會越長,導(dǎo)致出現(xiàn)黑屏卡頓的用戶體驗問題(因為必須有I幀才能解碼整個Gop)。另外Gop太長,點播場景時進行視頻的 seek 操作就會不方便。
繼續(xù)用H264Visa分析前面抖音那段視頻,現(xiàn)在看第三幀:
可以看到現(xiàn)在選中的是一個B幀的16*16的B宏塊,根據(jù)前面說的,它支持幀內(nèi)和幀間預(yù)測。
打開預(yù)測信息選項卡,可以看到具體的運動矢量數(shù)據(jù)(圖右側(cè)的MV(motion vector))是非常豐富的,因為此時的宏塊是在主播的手的影像,視頻此時手正處于運動中。
作為對比,看另一塊靜止的宏塊:
可以看出運動矢量都是0。
注意到該宏塊是屬于skip類型,即不會放入碼流的,為什么呢?因為它是不運動的宏塊,和所參考的幀的對應(yīng)參考宏塊是完全一樣的,所以當(dāng)前幀是沒有必要存放這一宏塊數(shù)據(jù)的。
總結(jié)
由于篇幅關(guān)系,視頻編碼原理的前半部分就到這,本文主要是簡單介紹了H264歷史背景,并著重介紹了H264中的幀內(nèi)幀間預(yù)測理論基礎(chǔ)和具體方法,并通過工具查看了實際相關(guān)數(shù)據(jù),下篇文章將繼續(xù)講解H264編碼剩余部分——變換量化、熵編碼:解析視頻編碼原理——從孫藝珍的電影說起(二)
由于視頻編碼技術(shù)復(fù)雜,本人水平有限,有錯誤的地方也請各位指正哈~
參考文章:
編碼原理:視頻究竟是怎么編碼壓縮的?
幀內(nèi)預(yù)測:如何減少空間冗余?
幀間預(yù)測:如何減少時間冗余?
變換量化:如何減少視覺冗余?
H264 I幀 P幀 B幀
《深入理解視頻編解碼技術(shù)》
《H.264和MPEG-4視頻壓縮 新一代多媒體的視頻編碼技術(shù)》
如果覺得本文有幫助,別忘了點贊關(guān)注哦~
總結(jié)
以上是生活随笔為你收集整理的解析视频编码原理——从孙艺珍的电影说起(一)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: XRD测试在锂离子电池正极中若干应用实例
- 下一篇: U盘安装win10时,出现“Window