一、爲何要進行視頻編碼?算法
視頻是由一幀幀圖像組成,就如常見的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
一、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幀實際順序&&編碼順序:
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幀等數據