直播一:H.264編碼基礎知識詳解

1、編碼基礎概念

一、爲何要進行視頻編碼?算法

視頻是由一幀幀圖像組成,就如常見的gif圖片,若是打開一張gif圖片,能夠發現裏面是由不少張圖片組成。通常視頻爲了避免讓觀衆感受到卡頓,一秒鐘至少須要16幀畫面(通常是30幀),假如該視頻是一個1280x720分辨率的視頻,那麼不通過編碼一秒鐘的大小:
結果:1280x720x60≈843.75M網絡

因此不通過編碼的視頻根本無法保存,更不用說傳輸了。ide

二、視頻壓縮編碼標準學習

視頻中存在不少冗餘信息,好比圖像相鄰像素之間有較強的相關性,視頻序列的相鄰圖像之間內容類似,人的視覺系統對某些細節不敏感等,對這部分冗餘信息進行處理的過程就是視頻編碼。編碼

H.26X系列(由ITU[國際電傳視訊聯盟]主導)
    H.261:主要在老的視頻會議和視頻電話產品中使用
    H.263:主要用在視頻會議、視頻電話和網絡視頻上
    H.264:H.264/MPEG-4第十部分,或稱AVC(Advanced Video Coding,高級視頻編碼),是一種視頻壓縮標準,一種被普遍使用的高精度視頻的錄製、壓縮和發佈格式。
    H.265:高效率視頻編碼(High Efficiency Video Coding,簡稱HEVC)是一種視頻壓縮標準,H.264/MPEG-4 AVC的繼任者。可支持4K分辨率甚至到超高畫質電視,最高分辨率可達到8192×4320(8K分辨率),這是目前發展的趨勢,還沒有有大衆化編碼軟件出現
    
MPEG系列(由ISO[國際標準組織機構]下屬的MPEG[運動圖象專家組]開發)
    MPEG-1第二部分:MPEG-1第二部分主要使用在VCD上,有些在線視頻也使用這種格式
    MPEG-2第二部分(MPEG-2第二部分等同於H.262,使用在DVD、SVCD和大多數數字視頻廣播系統中
    MPEG-4第二部分(MPEG-4第二部分標準可使用在網絡傳輸、廣播和媒體存儲上

三、編碼流程
在進行當前信號編碼時,編碼器首先會產生對當前信號作預測的信號,稱做預測信號(predicted signal)設計

預測的方式:code

時間上的預測(interprediction),亦即便用先前幀的信號作預測
    空間上的預測 (intra prediction),亦即便用同一張幀之中相鄰像素的信號作預測

獲得預測信號後,編碼器會將當前信號與預測信號相減獲得殘餘信號(residual signal),並只對殘餘信號進行編碼,如此一來,能夠去除一部份時間上或是空間上的冗餘信息。視頻

編碼器並不會直接對殘餘信號進行編碼,而是先將殘餘信號通過變換(一般爲離散餘弦變換)而後量化以進一步去除空間上和感知上的冗餘信息。量化後獲得的量化係數會再透過熵編碼,去除統計上的冗餘信息。blog

2、H.264編碼詳解(AVC)

一、H.264是新一代的編碼標準,以高壓縮高質量和支持多種網絡的流媒體傳輸著稱隊列

相關理解:
    在相鄰幾幅圖像畫面中,通常有差異的像素只有10%之內的點,亮度差值變化不超過2%,而色度差值的變化只有1%之內
    因此對於一段變化不大圖像畫面,咱們能夠先編碼出一個完整的圖像幀A,隨後的B幀就不編碼所有圖像,只寫入與A幀的差異,這樣B幀的大小就只有完整幀的1/10或更小!
    B幀以後的C幀若是變化不大,咱們能夠繼續以參考B的方式編碼C幀,這樣循環下去。
    這段圖像咱們稱爲一個序列:序列就是有相同特色的一段數據
    當某個圖像與以前的圖像變化很大,沒法參考前面的幀來生成,那咱們就結束上一個序列,開始下一段序列
    也就是對這個圖像生成一個完整幀A1,隨後的圖像就參考A1生成,只寫入與A1的差異內容

二、H.264三種幀

在H.264中定義了三種幀:
    I幀:完整編碼的幀叫I幀
    P幀:參考以前的I幀生成的只包含差別部分編碼的幀叫P幀
    B幀:參考先後的幀編碼的幀叫B幀

H264採用的核心算法是幀內壓縮和幀間壓縮:
    幀內壓縮是生成I幀的算法
    幀間壓縮是生成B幀和P幀的算法

壓縮方法:
    分組:把幾幀圖像分爲一組(GOP,也就是一個序列),爲防止運動變化,幀數不宜取多
    定義幀:將每組內各幀圖像定義爲三種類型,即I幀、B幀和P幀;
    預測幀:以I幀作爲基礎幀,以I幀預測P幀,再由I幀和P幀預測B幀;
    數據傳輸:最後將I幀數據與預測的差值信息進行存儲和傳輸。

GOP序列:
    在H264中圖像以序列爲單位進行組織,一個序列是一段圖像編碼後的數據流。
    一個序列的第一個圖像叫作 IDR 圖像(當即刷新圖像),IDR 圖像都是 I 幀圖像:

a、H.264 引入 IDR 圖像是爲了解碼的重同步,當解碼器解碼到 IDR 圖像時,當即將參考幀隊列清空,將已解碼的數據所有輸出或拋棄,從新查找參數集,開始一個新的序列。
b、這樣,若是前一個序列出現重大錯誤,在這裏能夠得到從新同步的機會。
c、IDR圖像以後的圖像永遠不會使用IDR以前的圖像的數據來解碼。

    一個序列就是一段內容差別不太大的圖像編碼後生成的一串數據流:

a、當運動變化比較少時,一個序列能夠很長,由於運動變化少就表明圖像畫面的內容變更很小,因此就能夠編一個I幀,而後一直P幀、B幀了。
b、當運動變化多時,可能一個序列就比較短了,好比就包含一個I幀和三、4個P幀。

在視頻編碼序列中,GOP即Group of picture(圖像組),指兩個I幀之間的距離。

I幀、P幀、B幀實際順序&&編碼順序:

3、H.264分層設計

H264算法在概念上分爲兩層:
    VCL:(Video Coding Layer)視頻編碼層,負責高效的內容表示。
    NAL:(Network Abstraction Layer)網絡提取層,負責以網絡所要求的恰當的方式對數據進行打包和傳送。
    上面所學習的知識都是VCL層。

NAL設計的目的,是根據不一樣的網絡把數據打包成相應的格式,將VCL產生的比特字符串適配到各類各樣的網絡和多元環境中。

NAL的封裝方式:
    NAL是將每一幀數據寫入到一個NAL單元中,進行傳輸或存儲的
    NALU分爲NAL頭和NAL體
    NALU頭一般爲00 00 00 01,做爲一個新的NALU的起始標識
    NALU體封裝着VCL編碼後的信息或者其餘信息

NAL的封裝過程:
    I幀、P幀、B幀都是被封裝成一個或者多個NALU進行傳輸或者存儲的
    每個I幀開始以前也有非VCL的NAL單元,用於保存其餘信息,它們是PPS、SPS
    PPS(Picture Parameter Sets):圖像參數集
    SPS(Sequence Parameter Set):序列參數集
    在實際的H264數據幀中,每每幀前面帶有00 00 00 01 或 00 00 01分隔符,通常來講編碼器編出的首幀數據爲PPS與SPS,接着爲I幀,後續是B幀、P幀等數據

相關文章
相關標籤/搜索