多媒體開發(15):H264的常見概念

H264,是你常見的技術術語了吧。算法

我是誰

那h264是什麼東西呢? H.264是視頻編碼標準,又是標準,得標準得天下啊。 在術語的拼寫上,小程以能理解爲準。緩存

本文介紹H264的常見概念。網絡

預警,本文相對枯燥,你可隨時放棄閱讀。app

(1)H264從哪裏來?

以前介紹媒體格式的概念時,有提到過國際標準化組織(ISO),如今又是它出場的時候。ide

H264是國際標準化組織(ISO)與國際電信聯盟(ITU)的產物。編碼

但ISO是大boss,給的是造福人類的方向,真正作這件事的是他的下屬MPEG,MPEG是動態圖像專家組。設計

一樣,ITU也有專家組來獨領風騷,叫VCEG,即視頻編碼專家組。3d

H.264有不少乳名,好比:H.264/AVC、AVC、H.264/MPEG-4 AVC,等等。code

h264

(2)H264有什麼優點?

飛天

h264是ISO與ITU合做的結晶體,而在這以前,這兩家都有本身的產品,好比ITU有h26一、h26三、h263+,而MPEG有MPEG-一、MPEG-二、MPEG-4等。視頻

兩家共同的研究成果天然不能比以往的差,h264比h263或mpeg-4的壓縮率都要高(在同等畫質下)。

h264優點在於,在一樣的畫質下,擁有更高的壓縮率(更低的碼率)。因此,看視頻的同窗有福利了,由於這意味着,能夠更省流量,而且下降了對你網速的要求,你還在用40KB/s的速度看大片嗎?

(3)H264的設計

體格精奇

(a)vcl與nalu

h264在設計上分不一樣的部分,涉及到複雜的概念,好比vcl與nal的劃分、幀內與幀間預測編碼、整數變換、熵編碼,等等。小程這裏只介紹一些簡單的概念。

h264在設計上,分vcl跟nal兩層。

vcl,video coding layer,即視頻編碼層,負責編碼視頻,獨立於網絡環境。

nal,network abstraction layer,即網絡抽象層,把vcl提供的數據進行封裝,應用於網絡傳輸。

nal層的基本單位叫nalu。

nalu,network abstraction layer unit,網絡抽象層單元。

nalu的大體結構是這樣的:

nalu結構

RBSP,是原始數據(多是編碼的視頻數據,也多是其它數據),加上用於對齊的「0」比特位。

nalu的頭,共8bit:

forbidden_bit(1bit): 禁止位,用於糾錯。
nal_reference_bit(2bit): 重要程度標識,越大則越重要,0是最不重要的。
nal_unit_type(5bit):低5位,用於區分nalu的類型。

nalu的類型:
nalu類型

表中的nal_reference_bit標識了重要程度(越大越重要)。

nal_unit_type爲1到5時,爲切片(slice)的數據,也就是視頻編碼數據。若是值是5,則能夠理解爲IDR幀,也就是一個圖像序列的第一個I幀。

nalu除了封裝切片數據(視頻數據),還能夠封裝其它類型的數據,好比nal_unit_type爲7與8時,對應的是序列參數(sps)與圖像參數(pps),這兩個信息對於解碼是必須的。注意,nalu裏面的數據是嚴格按格式來的,並且不會出現startcode這樣的數據,那個要根據實際場景來考慮是否加上,加到幀數據裏。

nalu包含的內容,就是rbsp的內容,rbsp的內容也有這樣的分類:
rbsp類型

總得來講,nalu是數據封裝單元(只是一個數據載體),能夠是參數據(好比一個pps),也能夠是視頻編碼數據。幀(即圖像),由若干個nalu構成,一個nalu若是是視頻數據,則能夠由若干個「slice」組成。slice(片)是h264引入的概念,而「幀」的概念在h264以前就存在,因此不要把二者混爲一體。這裏引用網絡上的兩個圖片來區分各個概念(圖中的P只是一個演示,是幀的概念):
gop1
gop2

(b)I幀等

而後,小程介紹I幀、P幀之類的概念,這是你可能常常遇到的概念。首先,幀,是圖片的意思,是圖像序列上的概念。

壓縮是爲了節省存儲容量與傳輸帶寬,體積小而質量又好,是追求的目標。

視頻壓縮的關鍵點是去掉冗餘。

冗餘是什麼?你有我也有的(相關的)是冗餘,我感受不到的也是冗餘。

h264編碼去除冗餘有兩個方向,一個是幀內預測編碼,另外一個是幀間預測編碼。

幀內預測,關注於一張獨立的圖的冗餘(不考慮與先後圖的聯繫),把這張圖的冗餘(宏塊之間的冗餘)去掉。

幀間預測,關注於先後圖間的冗餘,只保留差異,並依賴於參考幀。幀間預測編碼產生的幀,分爲P幀與B幀。

全部幀參與分組,這個圖像的組,也叫圖像序列,即GOP。

而GOP不少時候是表示圖像組的長度,能夠設置。

一個圖像序列內的圖像是相關緊密的,也就是當更換場景(大變化來了)時就應該另起一個GOP。

MPEG二、h264與HEVC關於GOP的定義是不同的,因此在討論GOP時有必要先弄清楚是哪個標準,這裏講的是h264。

h264的圖像序列中,以IDR幀開始,到下一個IDR幀結束,一個圖像序列中能夠出現多個I幀。

GOP的第一個I幀,叫做IDR幀,區分於其它普通的I幀,因此IDR是I,但I未必是IDR。

IDR出現,意味着歷史做廢(歷史的錯不要影響到當前組),不能再依賴以前的圖像,而要從新開始編碼。

通常來講,連續圖像變化小(好比錄屏時緩慢滑動屏幕)則GOP值大,並且一個IDR後就能夠連續用P或B幀來表示;變化大時(快速滑動屏幕)則GOP值小,可能一個IDR加兩三個P幀後就切到下一組序列了,這時編碼出來的體積也更大,若是傳輸的話就會產生帶寬峯值。

IDR,叫即時可解碼幀。

I幀,即Intra-predicted Frame,幀內預測幀。I幀還有不少同義詞,好比關鍵幀、獨立的完整圖像、基本幀等。

I幀相似於JPEG的壓縮算法。

P幀與B幀,都是幀間預測編碼,也就是要依賴於其它幀,它自己只是差別內容(差值與運動矢量)。

P幀,前向預測編碼幀。P幀表示的是這一幀與以前的某個關鍵幀(或P幀)的差異,解碼時須要用以前緩存的畫面疊加上本幀的差異,生成最終畫面。

B幀,雙向預測編碼幀。B幀依賴於前面的I或P幀,而且依賴於後面的P幀,因此解碼B幀時,既要取得以前的緩存畫面,也要解碼以後的畫面,才能疊加出最終的畫面。

從壓縮率來講,B>P>I,而解碼複雜度來講也是這樣。通常(I+P)這樣的等級用得最多。

I跟P都是會成爲參考幀,因此要注意影響,你差則別人也差。

至此,小程把H264一些常見的概念介紹完畢了。

總結一下,本文介紹了H264編碼標準的一些常見的概念,但願能幫到你,對H264有一個概念上的理解或瞭解。


happy

相關文章
相關標籤/搜索