1. 程式人生 > >H264的常見概念

H264的常見概念

h264 幀

H264,應該是讀者常見的技術術語吧,那h264是什麽東西呢?

技術分享圖片

H.264是視頻編碼標準。

在術語的拼寫上,小程以能理解為準。

本文介紹H264的常見概念。

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

(1)H264從哪裏來?

小程之前介紹媒體格式的概念時,有提到過國際標準化組織(ISO),現在又是它出場的時候。

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

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

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

H.264有很多乳名,比如:H.264/AVC、AVC、H.264/MPEG-4 AVC,等等。

技術分享圖片

(2)H264有什麽優勢?

技術分享圖片

h264是ISO與ITU合作的結晶體,而在這之前,這兩家都有自己的產品,比如ITU有h261、h263、h263+,而MPEG有MPEG-1、MPEG-2、MPEG-4等。

兩家共同的研究成果自然不能比以往的差。

h264優勢在於,在同樣的畫質下,擁有更高的壓縮率(也就是更低的碼率)。

所以,看視頻的同學有福利了,因為這意味著,可以更省流量,並且有更快的傳輸速度!

(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的大致結構是這樣的:

技術分享圖片

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

nalu的頭,共8bit:

forbidden_bit(1bit): 禁止位,用於糾錯。
nal_reference_bit(2bit): 重要程度標識,越大則越重要,0是最不重要的。

nal_unit_type(5bit):低5位,用於區分nalu的類型。

nalu的類型:
技術分享圖片
表中的nal_reference_bit標識了重要程度(越大越重要)。

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

nalu除了封裝切片數據(視頻數據),還可以封裝其它類型的數據,比如nal_unit_type為7與8時,對應的是序列參數(sps)與圖像參數(pps),這兩個信息對於解碼是必須的。

nalu包含的內容,就是rbsp的內容,rbsp的內容也有這樣的分類:
技術分享圖片

(b)I幀等

然後,小程介紹I幀、P幀之類的概念,這是讀者有可能經常遇到的概念。

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

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

冗余是什麽?你有我也有的(相關的)是冗余,我感覺不到的也是冗余。

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

幀內預測,關註於一張獨立的圖的冗余(不考慮與前後圖的聯系),把這張圖的冗余(宏塊之間的冗余)去掉。

幀間預測,關註於前後圖間的冗余,只保留差別,並依賴於參考幀。

幀間預測編碼產生的幀,分為I幀、P幀與B幀。

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

而GOP很多時候是表示圖像組的長度,可以設置。

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

MPEG2、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有一個概念上的理解或了解。

H264的常見概念