當前位置:編程學習大全網 - 編程語言 - 音視頻入門——H.264編碼(宏塊+片+幀)淺析

音視頻入門——H.264編碼(宏塊+片+幀)淺析

(1)圖像冗余信息:空間冗余、時間冗余

(2)視頻編碼關鍵點:壓縮比、算法復雜度、還原度

(3)H.264的2大組成部分:視頻編碼層VCL和網絡抽象層面NAL Network Abstract Layer,

(1)宏塊 MB macroblock

(2)片 slice

(3)幀 frame

(4)I幀、B幀、P幀

(5)幀率 fps

(6)像素->宏塊->片->幀->序列->碼流

我們了解了什麽是宏快,宏快作為壓縮視頻的最小的壹部分,需要被組織,然後在網絡之間做相互傳輸。

H264更深層次 —》宏塊 太淺了

如果單純的用宏快來發送數據是雜亂無章的,就好像在沒有集裝箱 出現之前,貨物總是隨意被堆放到船上。

上貨(編碼),下貨是非常痛苦的。 當集裝箱出現之後,壹切都發生了改變,傳輸效率大大增高。

集裝箱可以理解成H264編碼標準,他制定了相互傳輸的格式,將宏快 有組織,有結構,有順序的形成壹系列的碼流。這種碼流既可 通過 InputStream 網絡流的數據進行傳輸,也可以封裝成壹個文件進行保存

H264: H264/AVC是廣泛采用的壹種編碼方式 。 主要作用是為了傳輸

組成H264碼流的結構中 包含以下幾部分 ,從大到小排序依次是

NAL層:(Network Abstraction Layer,視頻數據網絡抽象層): 它的作用是H264只要在網絡上傳輸,在傳輸的過程每個包以太網是1500字節,而H264的幀往往會大於1500字節,所以要進行拆包,將壹個幀拆成多個包進行傳輸,所有的拆包或者組包都是通過NAL層去處理的。

VCL層:(Video Coding Layer,視頻數據編碼層): 對視頻原始數據進行壓縮

H264是壹種碼流 類似與壹種不見頭,也不見尾的壹條河流。如何從和流中取到自己想要的數據呢,

在H264的標磚中有這樣的壹個封裝格式叫做"Annex-B"的字節流格式。 它是H264編碼的主要字節流格式。

幾乎市面上的編碼器是以這種格式進行輸出的。起始碼0x 00 00 00 01 或者 0x 00 00 01 作為分隔符。

兩個 0x 00 00 00 01之間的字節數據 是表示壹個NAL Unit

切片頭:包含了壹組片的信息,比如片的數量,順序等等

H264中,以16x16的宏塊為編碼最小單元,壹個宏塊可以被分成多個4x4或8x8的塊

同壹個宏塊內,像素的相似程度會比較高,若16x16的宏塊中,像素相差較大,那麽就需要繼續細分

當然,像素塊越小,編碼的復雜度也會隨之增加,編碼效率自然就會降低。但是這樣是值得的,因為圖像的壓縮效率有了顯著提高,也就是編碼後得到的相同質量的圖像,H.264的壓縮比更大,占用的空間及帶寬更小。

不合理的分塊會出現塊效應,即塊與塊之間色差明顯

海思在3559之後有deblock的接口可以應對塊效應,3519上用的很多

在I幀中,全部宏塊都采用幀內預測的方式,所以解碼時僅用I幀的數據就可重構完整圖像,不須要參考其余畫面而生成。web

H.264中規定了兩種類型的I幀:普通I幀(normal Iframes)和IDR幀(InstantaneousDecoding Refresh, 即時解碼刷新)。 IDR幀實質也是I幀,使用幀內預測。IDR幀的做用是當即刷新,會致使DPB(Decoded Picture Buffer參考幀列表)清空,而I幀不會。因此IDR幀承擔了隨機訪問功能,壹個新的IDR幀開始,能夠從新算壹個新的Gop開始編碼,播放器永遠能夠從壹個IDR幀播放,由於在它以後沒有任何幀引用以前的幀。若是壹個視頻中沒有IDR幀,這個視頻是不能隨機訪問的。全部位於IDR幀後的B幀和P幀都不能參考IDR幀之前的幀,而普通I幀後的B幀和P幀仍然能夠參考I幀以前的其余幀。IDR幀阻斷了偏差的積累,而I幀並無阻斷偏差的積累。算法

壹個GOP序列的第壹個圖像叫作 IDR 圖像(當即刷新圖像),IDR 圖像都是 I 幀圖像,但I幀不必定都是IDR幀,只有GOP序列的第1個I幀是IDR幀。緩存

疑問:按照GOP、IDR幀、I幀的解釋,若是壹個GOP出現除去第壹個IDR幀以外的I幀,是不存在的,那這樣的話,就不存在非IDR的I幀了,但是為何還要說明非IDR的I幀呢。svg

解答:H264編碼存在多種編碼方式CBR、VBR、CVBR、ABR等等,VBR編碼模式下圖像內容變化差別很大時,會動態調整I幀的數量,所以GOP的概念須要修正:兩個IDR幀之間的間隔為壹組GOP,壹組GOP中能夠出現非IDR的I幀。編碼

P幀:前向預測編碼幀。P幀表示的是這壹幀跟以前的壹個關鍵幀(或P幀)的差異,解碼時須要用以前緩存的畫面疊加上本幀定義的差異,生成最終畫面,P幀沒有完整畫面數據,只有與前壹幀的畫面差別的數據。P幀的壓縮率20code

B幀:雙向預測內插編碼幀。B幀是雙向差異幀,也就是B幀記錄的是本幀與先後幀的差異,要解碼B幀,不只要取得以前的緩存畫面,還要解碼以後的畫面,經過先後畫面的與本幀數據的疊加取得最終的畫面。B幀壓縮率高,約為50,可是解碼時CPU會比較累。orm

通常能夠輸出H264幀的USB攝像頭,使用的是BP-Baseline Profile,只有I幀與P幀。視頻

而slice呢,也是對宏塊的劃分

本文簡單敘述了;音視頻中的H264編碼中的,宏塊、幀、片。音視頻還有更深入的學習,知識範圍很廣,需要壹套很詳細的學習資料與路線。我推薦上面的壹套入門到精通資料輔佐。

  • 上一篇:編程工具橙色
  • 下一篇:跑馬燈怎麽做的!
  • copyright 2024編程學習大全網