一、編碼基礎概念
1、為什么要進行視頻編碼?
視頻是由一幀幀圖像組成,就如常見的gif圖片,如果打開一張gif圖片,可以發現里面是由很多張圖片組成。一般視頻為了不讓觀眾感覺到卡頓,一秒鍾至少需要16幀畫面(一般是30幀),假如該視頻是一個1280x720分辨率的視頻,那么不經過編碼一秒鍾的大小:
結果:1280x720x60≈843.75M
所以不經過編碼的視頻根本沒法保存,更不用說傳輸了。
2、視頻壓縮編碼標准
視頻中存在很多冗余信息,比如圖像相鄰像素之間有較強的相關性,視頻序列的相鄰圖像之間內容相似,人的視覺系統對某些細節不敏感等,對這部分冗余信息進行處理的過程就是視頻編碼。
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第二部分標准可以使用在網絡傳輸、廣播和媒體存儲上
3、編碼流程
在進行當前信號編碼時,編碼器首先會產生對當前信號做預測的信號,稱作預測信號(predicted signal)
預測的方式:
時間上的預測(interprediction),亦即使用先前幀的信號做預測
空間上的預測 (intra prediction),亦即使用同一張幀之中相鄰像素的信號做預測
得到預測信號后,編碼器會將當前信號與預測信號相減得到殘余信號(residual signal),並只對殘余信號進行編碼,如此一來,可以去除一部份時間上或是空間上的冗余信息。
編碼器並不會直接對殘余信號進行編碼,而是先將殘余信號經過變換(通常為離散余弦變換)然后量化以進一步去除空間上和感知上的冗余信息。量化后得到的量化系數會再透過熵編碼,去除統計上的冗余信息。
二、H.264編碼詳解(AVC)
1、H.264是新一代的編碼標准,以高壓縮高質量和支持多種網絡的流媒體傳輸著稱
相關理解:
在相鄰幾幅圖像畫面中,一般有差別的像素只有10%以內的點,亮度差值變化不超過2%,而色度差值的變化只有1%以內
所以對於一段變化不大圖像畫面,我們可以先編碼出一個完整的圖像幀A,隨后的B幀就不編碼全部圖像,只寫入與A幀的差別,這樣B幀的大小就只有完整幀的1/10或更小!
B幀之后的C幀如果變化不大,我們可以繼續以參考B的方式編碼C幀,這樣循環下去。
這段圖像我們稱為一個序列:序列就是有相同特點的一段數據
當某個圖像與之前的圖像變化很大,無法參考前面的幀來生成,那我們就結束上一個序列,開始下一段序列
也就是對這個圖像生成一個完整幀A1,隨后的圖像就參考A1生成,只寫入與A1的差別內容
2、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幀和3、4個P幀。
在視頻編碼序列中,GOP即Group of picture(圖像組),指兩個I幀之間的距離。
I幀、P幀、B幀實際順序&&編碼順序:
三、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幀等數據