一姿现、為什么要進行視頻編碼
未經(jīng)壓縮的視頻的數(shù)據(jù)量巨大诬滩,錄制一分鐘視頻, 需要多大的空間來保存了?
1> 為了不讓用戶感受到卡頓效果, 1秒鐘之內(nèi)至少需要16幀畫面(正常開發(fā)通常會采集30幀)鹃栽,也就是編碼設置的fps參數(shù)
2> 假如該視頻是一個1280*720分辨率的視頻(正常情況下會比這個大很多)
結(jié)果:128072016*60≈843.75M
一分鐘的視頻843M,如果保證播放不卡頓秆剪,則需要15M/S 的下載速度秆麸,如果使用蜂窩網(wǎng)絡...
結(jié)論:1.如此大的傳輸數(shù)據(jù)量瘫寝,現(xiàn)行帶寬壓力巨大蜒蕾,流量資費大,且存儲數(shù)據(jù)量也極大焕阿,所以導致編碼技術的產(chǎn)生
?????????? 2.視頻采集完成后咪啡,需要先編碼,再傳輸捣鲸,在解碼瑟匆,再播放(重現(xiàn))
二、為什么視頻可以壓縮編碼栽惶?
采集到的視頻源存在冗余信息愁溜,冗余信息分為以下三類:
1.空間冗余:圖像相鄰像素之間有較強的相關性
2.時間冗余:視頻序列的相鄰圖像之間內(nèi)容相似
3.視覺冗余:人的視覺系統(tǒng)對某些細節(jié)不敏感
4.其他冗余
空間冗余
空間冗余是指在同一張圖像中,有很多像素點表示的信息是完全一樣的外厂,如果對每一個像素進行單獨的存儲冕象,必然會非常浪費空間,也完全沒有必要汁蝶,此處部分存儲的顏色色值相同渐扮,僅僅對應空間位置不同。
時間冗余
時間冗余是指多張圖像之間掖棉,有非常多的相關性墓律,由于一些小運動造成了細小差別。
我們可以看到兩張圖片相隔很近幔亥,彼此之間很多元素相同耻讽,如果對相同部分多次存儲,則形成了冗余
如圖:
視覺冗余
1.人類視覺系統(tǒng)HVS
2.對高頻信息不敏感
3.對高對比度更敏感
4.對亮度信息比色度信息更敏感
5.對運動的信息更敏感
數(shù)字視頻系統(tǒng)的設計應該考慮HVS的特點:
1.丟棄高頻信息帕棉,只編碼低頻信息
2.提高邊緣信息的主觀質(zhì)量
3.降低色度的解析度
對感興趣區(qū)域(Region of Interesting针肥,ROI)進行特殊處理
如圖:
經(jīng)過一系列的去處冗余信息饼记,可以大大的降低視頻的數(shù)據(jù)量,更利于視頻的保存慰枕、傳輸具则,去除冗余信息的過程,我們就稱之為壓縮編碼
三具帮、壓縮編碼的標準
1.? 標準化組織:
ITU:International Telecommunications Union
VECG:Video Coding Experts Group(國際電傳視訊聯(lián)盟)
ISO:International Standards Organization
MPEG:Motion Picture Experts Group(國際標準組織機構(gòu))
2.?? H.26X系列(由ITU[國際電傳視訊聯(lián)盟]主導)
H.261:主要在老的視頻會議和視頻電話產(chǎn)品中使用
H.263:主要用在視頻會議博肋、視頻電話和網(wǎng)絡視頻上
H.264:H.264/MPEG-4第十部分,或稱AVC(Advanced Video Coding匕坯,高級視頻編碼)束昵,是一種視頻壓縮標準拔稳,一種被廣泛使用的高精度視頻的錄制葛峻、壓縮和發(fā)布格式。
H.265:高效率視頻編碼(High Efficiency Video
Coding巴比,簡稱HEVC)是一種視頻壓縮標準术奖,H.264/MPEG-4
AVC的繼任者∏峤剩可支持4K分辨率甚至到超高畫質(zhì)電視采记,最高分辨率可達到8192×4320(8K分辨率),這是目前發(fā)展的趨勢政勃,尚未有大眾化編碼軟件出現(xiàn)
3.MPEG系列(由ISO[國際標準組織機構(gòu)]下屬的MPEG[運動圖象專家組]開發(fā))
MPEG-1第二部分:MPEG-1第二部分主要使用在VCD上唧龄,有些在線視頻也使用這種格式
MPEG-2第二部分(MPEG-2第二部分等同于H.262,使用在DVD奸远、SVCD和大多數(shù)數(shù)字視頻廣播系統(tǒng)中
MPEG-4第二部分(MPEG-4第二部分標準可以使用在網(wǎng)絡傳輸既棺、廣播和媒體存儲上)。
其他系列:
AMV · AVS · Bink · RealVideo · Theora · VC-1 · VP3 · VP6 · VP7 · VP8 · VP9 · WMV
四懒叛、目前應用最廣泛的H.264(AVC)
H264是新一代的編碼標準丸冕,以高壓縮高質(zhì)量和支持多種網(wǎng)絡的流媒體傳輸著稱
個人理解:
在相鄰幾幅圖像畫面中,一般有差別的像素只有10%以內(nèi)的點,亮度差值變化不超過2%薛窥,而色度差值的變化只有1%以內(nèi)胖烛,所以對于一段變化不大圖像畫面,我們可以先編碼出一個完整的圖像幀A诅迷,隨后的B幀就不編碼全部圖像佩番,只寫入與A幀的差別,這樣B幀的大小就只有完整幀的1/10或更邪丈肌趟畏!B幀之后的C幀如果變化不大,我們可以繼續(xù)以參考B的方式編碼C幀屑那,這樣循環(huán)下去拱镐。這段圖像我們稱為一個序列:序列就是有相同特點的一段數(shù)據(jù)艘款,當某個圖像與之前的圖像變化很大,無法參考前面的幀來生成沃琅,那我們就結(jié)束上一個序列哗咆,開始下一段序列,也就是對這個圖像生成一個完整幀A1益眉,隨后的圖像就參考A1生成晌柬,只寫入與A1的差別內(nèi)容。
在H264協(xié)議里定義了三種幀
I幀:完整編碼的幀叫I幀
P幀:參考之前的I幀生成的只包含差異部分編碼的幀叫P幀
B幀:參考前后的幀編碼的幀叫B幀
H264采用的核心算法是幀內(nèi)壓縮和幀間壓縮
幀內(nèi)壓縮是生成I幀的算法
幀間壓縮是生成B幀和P幀的算法
H264的壓縮方法:
分組:把幾幀圖像分為一組(GOP郭脂,也就是一個序列),為防止運動變化,幀數(shù)不宜取多
定義幀:將每組內(nèi)各幀圖像定義為三種類型,即I幀年碘、B幀和P幀;
預測幀:以I幀做為基礎幀,以I幀預測P幀,再由I幀和P幀預測B幀;
數(shù)據(jù)傳輸:最后將I幀數(shù)據(jù)與預測的差值信息進行存儲和傳輸。
序列(GOP)
在H264中圖像以序列為單位進行組織展鸡,一個序列是一段圖像編碼后的數(shù)據(jù)流屿衅。
一個序列的第一個圖像叫做 IDR 圖像(立即刷新圖像),IDR 圖像都是 I 幀圖像莹弊。
H.264 引入 IDR 圖像是為了解碼的重同步涤久,當解碼器解碼到 IDR 圖像時,立即將參考幀隊列清空忍弛,將已解碼的數(shù)據(jù)全部輸出或拋棄响迂,重新查找參數(shù)集,開始一個新的序列细疚。
這樣蔗彤,如果前一個序列出現(xiàn)重大錯誤,在這里可以獲得重新同步的機會疯兼。
IDR圖像之后的圖像永遠不會使用IDR之前的圖像的數(shù)據(jù)來解碼然遏,這樣可以避免前一個IDR圖像錯誤而導致整個視頻無法播放。
一個序列就是一段內(nèi)容差異不太大的圖像編碼后生成的一串數(shù)據(jù)流
當運動變化比較少時镇防,一個序列可以很長啦鸣,因為運動變化少就代表圖像畫面的內(nèi)容變動很小,所以就可以編一個I幀来氧,然后一直P幀诫给、B幀了。
當運動變化多時啦扬,可能一個序列就比較短了中狂,比如就包含一個I幀和3、4個P幀扑毡。
在視頻編碼序列中胃榕,GOP即Group of picture(圖像組),指兩個I幀之間的距離
I幀瞄摊、P幀勋又、B幀的預測方向
I幀苦掘、P幀、B幀實際順序&編碼后順序
五楔壤、H264分層設計
分層設計
H264算法在概念上分為兩層:
1.視頻編碼層(VCL:Video Coding Layer)負責高效的視頻內(nèi)容表示鹤啡,
2.網(wǎng)絡提取層(NAL:Network Abstraction Layer)負責以網(wǎng)絡所要求的恰當?shù)姆绞綄?shù)據(jù)進行打包和傳送
這樣,高效編碼和網(wǎng)絡友好性分別由VCL和NAL分別完成蹲嚣,而之前我們學習的編碼方式递瑰,都是屬于VCL層,VCL層可看做H264編碼算法中去除冗余數(shù)據(jù)的過程,更詳細的介紹請參考鏈接
NAL設計目的:
根據(jù)不同的網(wǎng)絡把數(shù)據(jù)打包成相應的格式隙畜,將VCL產(chǎn)生的比特字符串適配到各種各樣的網(wǎng)絡和多元環(huán)境中抖部。
NAL的封裝方式:
NAL是將每一幀數(shù)據(jù)寫入到一個NAL單元中,進行傳輸或存儲的
NALU分為NAL頭和NAL體
NALU頭通常為00 00 00 01议惰,作為一個新的NALU的起始標識
NALU體封裝著VCL編碼后的信息或者其他信息
封裝過程:
I幀慎颗、P幀、B幀都是被封裝成一個或者多個NALU進行傳輸或者存儲的
I幀開始之前也有非VCL的NAL單元换淆,用于保存其他信息哗总,比如:PPS几颜、SPS
PPS(Picture Parameter Sets):圖像參數(shù)集
SPS(Sequence Parameter Set):序列參數(shù)集
在實際的H264數(shù)據(jù)幀中倍试,往往幀前面帶有00 00 00 01 或 00 00 01分隔符,一般來說編碼器編出的首幀數(shù)據(jù)為PPS與SPS蛋哭,接著為I幀县习,后續(xù)是B幀、P幀等數(shù)據(jù)
六谆趾、編碼方式
編碼的方式有兩種:
硬編碼:使用非CPU進行編碼躁愿,如顯卡GPU、專用的DSP沪蓬、FPGA彤钟、ASIC芯片等
軟編碼:使用CPU進行編碼,軟編碼通常使用:ffmpeg+x264
ffmpeg:是一套開源的跷叉、用于對音視頻進行編碼&解碼&轉(zhuǎn)化計算機程序
x264:x264是一種免費的逸雹、開源的、具有更優(yōu)秀算法的H.264/MPEG-4 AVC視頻壓縮編碼方式
對比:
軟編碼:實現(xiàn)直接云挟、簡單梆砸,參數(shù)調(diào)整方便,升級易园欣,但CPU負載重帖世,性能較硬編碼低
硬編碼:性能高,對CPU沒有壓力沸枯,但是對其他硬件要求較高(如GPU等)
iOS中編碼方式:
在iOS8之前日矫,蘋果并沒有開放硬編碼的接口赂弓,所以只能采用ffpeng+x624進行軟編碼
在iOS8之后,蘋果開放了接口哪轿,并且封裝了VideoToolBox&AudioToolbox兩個框架拣展,分別用于對視頻&音頻進行硬編碼