日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

H.264编解码浅析

發布時間:2023/12/8 编程问答 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 H.264编解码浅析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

聲明:本文是閱讀《新一代視頻壓縮標準H.264_AVC》筆記總結

簡介

H.264,又稱為MPEG-4第10部分,高級視頻編碼(英語:MPEG-4 Part 10, Advanced Video Coding,縮寫為MPEG-4 AVC)是一種面向塊,基于運動補償的視頻編碼標準。

視頻壓縮

預測編碼

幀內預測

解決空間冗余,因為一幀的圖片相鄰位置的像素點一般是相似的,突變概率較小。

幀間預測

解決時間冗余,因為相鄰幀的圖片一般只是個別像素的移動改變。

  • 單向預測
  • 雙向預測

H.264標準中參考幀可達16幀。

將圖像分成若干塊或者宏塊,然后設法搜索出它們在臨近幀中的位置,得到兩者在空間位置的相對偏移量(運動矢量),這個過程就稱為運動估計

變換編碼

視頻信號中包含大量的直流和低頻部分,還有少量高頻部分。所以將圖像進行某種數學變換后,得到變換域的圖像。o表示低頻,x表示高頻,O表示零值,則可用較少的碼來完成壓縮編碼。

  • K-L變換:性能最好,但是缺乏快速算法。只是理想中的變換方法
  • DCT(離散余弦變換):廣泛使用

熵編碼

根據變換系數量化后,高頻有少量不大的值,低頻直流有少量較大的值,系數大部分為0的特性,采用熵編碼進一步壓縮碼率。
概念:利用信源的統計特效進行碼率壓縮的編碼就叫熵編碼(統計編碼).

前置操作

  • 鋸齒形掃描:以8x8塊為例:
  • 游程編碼:在變換域,量化后的系數用3個量來表示,即0的個數(稱為游程),系數值,最后的位置(如果非0系數已經在最后或者后邊全是0,則置1,否則置0)。
    舉個例子:鋸齒掃描后的串行系數序列為15,0,0,-3,4,5,0,0,0,-7,0,0…
    則游程編碼后為:(0,15,0),(2,-3,0),(0,4,0),(0,5,0),(3,-7,1)

分類

變長編碼(哈夫曼編碼)

步驟:1.將信息符號按出現的概率從大到小排序
2.將兩個最小的概率組成一組,并劃分兩個分支,大的標0,小的標1,然后計算兩個分支的概率和。
3.依次類推,只到概率和為1,也剩最后一個分支
4.找到最后概率從1到信息符號的路徑,從右到左記錄路徑上的0,1即為最終的編碼序列。

算術編碼

1.編碼過程
采用一個浮點數(0<=x<1)編碼表示一串輸入符號。
比如:輸入序列abaca,a出現的概率p(a)=0.5,b出現的概率p(b)=0.25,c出現的概率p(c)=0.25。總范圍為[0,1],則各字符可分割為對應的區間范圍a[0,0.5],b[0.5,0.75],c[0.75,1]。
然后對于輸入的序列,核心就是重復將原區間根據abc的概率重新映射到新區間
a:[0, 0.5] 新區間
b:[0+(0.5-0)*0.5 , 0+(0.5-0)*0.75] = [0.25, 0.375] 新區間
a:[0.25+(0.375-0.25)*0, 0.25+(0.375-0.25)*0.5] = [0.25, 0.3125] 新區間

依次類推。
總結一下:舊區間如果為[L0,H0][L_0, H_0][L0?,H0?],某一個符號的概率區間為[p0,p1][p_0, p_1][p0?,p1?],則編碼后的新區間為:
[L0+(H0?L0)?p0,L0+(H0?L0)?p1][L_0+(H_0-L_0)*p_0,L_0+(H_0-L_0)*p_1][L0?+(H0??L0?)?p0?L0?+(H0??L0?)?p1?]

最后會挑選一個該區間的一個浮點數,即是最后的編碼結果。
2.解碼過程
解碼過程就是一個逆向的過程。比如上邊的例子,如果序列為aba,則最終編碼結果假設為0.3:
0.3在a的區間范圍[0, 0.5],所以解碼第一個字符為a
然后(0.3-0)/p(a) = 0.3/0.5 = 0.6
0.6在b的區間范圍[0.5, 0.75],所以解碼第二個字符為b
然后(0.6-0.5)/p(b) = 0.1/0.25 = 0.4
0.4在a的區間范圍[0, 0.5],所以解碼第三個字符為a

依次類推。
總結一下:編碼結果如果為sss,判斷sss的值處在符號概率區間[p0,p1][p_0, p_1][p0?,p1?]中,得到一個字符xxx,它對應的概率為p(x)p(x)p(x)
則下一個字符編碼值為:(s?p0)/p(x)(s-p_0)/p(x)(s?p0?)/p(x)

問題:可能會注意到這個解碼過程會無限執行下去,實際上會有一個專門的終止符,當看到這個終止符的時候就不會再去解碼。

H.264中的熵編碼

  • CAVLC(基于上下文自適應的可變長編碼)
  • CABAC(基于上下文自適應的二進制算術熵編碼)

數字信號處理

對于輸入的模擬信號轉成輸出的數字信號,需要進行取樣,量化,編碼三個步驟。

  • 取樣:將時間軸上連續變化的模擬信號變為離散量的過程。
    一張隔行掃描的幀圖像,由兩個組成(所有的奇數行構成頂場,所有的偶數行構成底場

  • 量化:取樣后的脈沖信號在時間上是離散的,但是在幅值上(空間)仍然是連續的。將信號幅值從連續量變為離散量的過程。

  • 編碼:對于量化后的信號用0,1二進制碼表示,稱之為脈沖編碼調制-PCM。

顏色空間

關于yuv和取樣格式的分析,可以參考:
移動端視頻進階(二):YUV數據編碼格式的總結

編碼參數

  • 量化值:一般認為,每個取樣值采用8bit表示,即256個灰度級。(但是HDR位深采用10,甚至12來獲取更高的圖像質量)
  • 取樣頻率:單位時間內從連續信號中提取并組成離散信號的取樣個數。

預處理

  • 色彩插值:圖像傳感器一個像素只能給出純白到純黑單色的色調值,需要借助色彩濾鏡陣列(CFA,Color Filter Array)獲取彩色的圖像。
  • 色彩校正:減小傳感器響應的圖像與真實場景間的差異
  • 伽馬校正:顯示器的輸出光強度與顯示器上加載的光束電壓呈冪指數關系,這個冪指數被稱之為gamma。對于陰極射線管顯示器(CRT),gamma一般取值2.2。伽馬校正就是在圖像顏色顯示在屏幕之前,將像素值做1/γ次冪,這樣就將顏色變為線性關系。
  • 圖像增強:平滑濾波,中值濾波,圖像銳化,直方圖均衡,白平衡。
    這里說一下白平衡,先了解一下色溫,色溫就是定量地以開爾文溫度表示色彩,色溫越高,藍色成分越多,色溫越低,紅色成分越多。白平衡就是為了消除圖像傳感器在不同光線下輸出的不平衡,導致圖像偏紅或者偏藍的問題。

概念介紹

  • 場(Field)和幀(Frame)
    視頻的一場或者一幀可以產生一個編碼圖像。視頻幀通常分為兩類:連續和隔行視頻幀。對于隔行視頻幀,又分為頂場和底場
    場內鄰行間的時間相關性較強,幀內鄰行空間相關性較強,所以活動量較小或者靜止的圖像適宜采用幀編碼,而活動量較大的圖像適宜采用場編碼。

  • 宏(Macro)和片(Slice)
    一個編碼圖像通常劃分成若干個宏塊組成。一個宏塊通常為16x16像素(16x16個亮度和一個8x8 cb,8x8 cr彩色像素塊)。
    每個圖像中,若干個塊又被排列成的形式。I片只包含I宏塊,P片可包含P宏塊和I宏塊,B片可包含B宏塊和I宏塊。片的作用:相互獨立,可以防止誤碼的擴散和傳輸
    還有SP片SI片,SP(Switch P)片用于不同碼流之間的切換,它包含P宏塊和/或I宏塊。SI片包含一種特殊編碼格式的宏塊,叫SI宏塊。這兩個片都是拓展檔次中的必備功能。
    I宏塊只能利用從當前片中解碼出的像素作為參考進行幀內預測,P宏塊利用前邊已經編碼的圖像作為參考進行幀間預測,B宏塊則利用前后雙向的參考圖像進行幀間預測。

  • IDR圖像
    IDR:即時解碼刷新(Instantaneous Decoding Refresh)圖像,所有的IDR圖像都是I圖像,但是并不是所有的I圖像都是IDR。H.264引入IDR時為了解碼的重同步,當解碼器解碼到IDR圖像時,會立即將參考幀隊列清空,將已解碼的數據全部輸出或拋棄,重新查找參數集,開始一個新的序列。IDR之后的圖像永遠不會引用IDR之前的圖像數據來解碼。

  • 檔次
    1.基礎(Baseline Profile)
    2.拓展(Extended Profile)
    3.主要(Main Profile)

編碼數據格式

分層結構

H.264分為兩層:視頻編碼層(VCL,Video Coding Layer)和網絡提取(抽象)層(NAL,Network Abstraction Layer)。
VCL數據即編碼處理的輸出,它表示被壓縮編碼后的視頻數據序列。在它傳輸或存儲之前,會先被映射或封裝到NAL單元中。
每個NAL單元包含一個原始字節序列負荷(RBSR,Raw Byte Sequence Payload)和一組對應視頻編碼數據的NAL頭信息。
一個NAL單元的結構如下圖所示:
然后繼續往下,典型的RBSP序列結構:

  • SPS:序列參數集,包含的是針對一連續編碼視頻序列的參數,如標識符seq_parameter_set_id,幀數及POC(picture order count,圖像序列號)的約束,參考幀數據,解碼圖像尺寸和幀場編碼模式選擇等。
  • PPS:圖像參數集,對應的是一個序列中某一個圖像或者某幾幅圖像。如標識符pic_parameter_set_id,熵編碼模式選擇標識,片組數目,初始量化參數和去方波濾波系數調整標識等。
  • SEI:輔助增強信息(Supplemental Enhancement Information),屬于碼流范疇,它提供了向視頻碼流中加入額外信息的方法。
    關于SEI更多內容,可以參考:FFmpeg從入門到精通——進階篇,SEI那些事兒

然后是一個個的切片的數據結構:

包含一個片頭和片數據。片頭規定了片的類型,該片屬于哪個圖像,有關的參考圖像等。片數據一系列的編碼宏塊(MB),跳編碼數據(skip_run)。每個宏塊(MB)包含頭單元和殘差數據。

什么是EBSP?

由于NAL是依次緊密排列的,解碼器無法在數據流中分辨出每個NAL的起始位置和終止位置,所有在H.264草案的附錄B,在每個NAL的起始位置前添加起始碼0x000001,另外考慮到尋址的方便,要求數據流在長度上對齊,所以H.264建議在起始碼前添加若干字節的0來填充,直到該NAL的長度符合要求。

這樣一來,是解決了問題,H.264規定當檢測出0x000000則表示當前NAL的結束,但是會有一個問題:如果在NALU的內部,出現了0x000001或0x000000時該怎么辦?
于是H.264提出另一個機制,叫“防止競爭”,在編碼器編碼完一個NAL時,應該檢測是否出現下邊的4個字節序列,如果有,則在最后一個字節前插入一個字節0x03

當解碼器在NAL內部發現有0x000003序列,則將0x03拋棄,恢復原始數據。

這個帶有0x03的防止競爭字節的序列就是EBSP(擴展字節序列載荷,Encapsulated Byte Sequence Payload)

H.264標準升級拓展

高清拓展標準

2004年7月發布高清拓展標準FRExt(Fidelity Range Extension),包括了High Profile(HP),High10(Hi10p),High 4:2:2 Profile(Hi422p)和High 4:4:4 Profile(Hi444p),它們都基于Main Profile。

可伸縮編碼

可伸縮編碼(SVC,Scalable Video Coding),根據視頻信息按照重要性分解,對分解的各個部分按照其自身的統計特性進行編碼。

推薦閱讀

https://zhuanlan.zhihu.com/p/31056455

總結

以上是生活随笔為你收集整理的H.264编解码浅析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。