作者:CC老師_HelloCoder
原文地址:http://www.lxweimin.com/p/0188ab0381ba
一. H264基本概念.
I幀: 關鍵幀,采用幀內壓縮技術.
- 舉個例子,如果攝像頭對著你拍攝,1秒之內,實際你發生的變化是非常少的.1秒鐘之內實際少很少有大幅度的變化.攝像機一般一秒鐘會抓取幾十幀的數據.比如像動畫,就是25幀/s,一般視頻文件都是在30幀/s左右.對于一些要求比較高的,對動作的精細度有要求,想要捕捉到完整的動作的,高級的攝像機一般是60幀/s.那些對于一組幀的它的變化很小.為了便于壓縮數據,那怎么辦了?將第一幀完整的保存下來.如果沒有這個關鍵幀后面解碼數據,是完成不了的.所以I幀特別關鍵.
P幀: 向前參考幀.壓縮時只參考前一個幀.屬于幀間壓縮技術.
- 視頻的第一幀會被作為關鍵幀完整保存下來.而后面的幀會向前依賴.也就是第二幀依賴于第一個幀.后面所有的幀只存儲于前一幀的差異.這樣就能將數據大大的減少.從而達到一個高壓縮率的效果.
B幀: 雙向參考幀,壓縮時即參考前一幀也參考后一幀.幀間壓縮技術.
- B幀,即參考前一幀,也參考后一幀.這樣就使得它的壓縮率更高.存儲的數據量更小.如果B幀的數量越多,你的壓縮率就越高.這是B幀的優點,但是B幀最大的缺點是,如果是實時互動的直播,那時與B幀就要參考后面的幀才能解碼,那在網絡中就要等待后面的幀傳輸過來.這就與網絡有關了.如果網絡狀態很好的話,解碼會比較快,如果網絡不好時解碼會稍微慢一些.丟包時還需要重傳.對實時互動的直播,一般不會使用B幀.
- 如果在泛娛樂的直播中,可以接受一定度的延時,需要比較高的壓縮比就可以使用B幀.
- 如果我們在實時互動的直播,我們需要提高時效性,這時就不能使用B幀了.
二. GOF(Group of Frame)一組幀
如果在一秒鐘內,有30幀.這30幀可以畫成一組.如果攝像機或者鏡頭它一分鐘之內它都沒有發生大的變化.那也可以把這一分鐘內所有的幀畫做一組.
什么叫一組幀?
就是一個I幀到下一個I幀.這一組的數據.包括B幀/P幀.我們稱為GOF.
GOF有什么好處了?它能解決什么問題了?
這個與我們接下來所學習的內容有關了.
三. SPS/PPS
SPS/PPS實際上就是存儲GOP的參數.
SPS: (Sequence Parameter Set,序列參數集)存放幀數,參考幀數目,解碼圖像尺寸,幀場編碼模式選擇標識等.
- 一組幀的參數集.
PPS:(Picture Parameter Set,圖像參數集).存放熵編碼模式選擇標識,片組數目,初始量化參數和去方塊濾波系數調整標識等.(與圖像相關的信息)
- 熵編碼模式,片組數目等這些我們會在后面的內容講解到.大家在這里主要了解到SPS/PPS即可.
大家只要記住,在一組幀之前我們首先收到的是SPS/PPS數據.如果沒有這組參數的話,我們是無法解碼.
如果我們在解碼時發生錯誤,首先要檢查是否有SPS/PPS.如果沒有,是因為對端沒有發送過來還是因為對端在發送過程中丟失了.
SPS/PPS數據,我們也把其歸類到I幀.這2組數據是絕對不能丟的.
那么下面我們來看一下實際開發中遇到的問題.
四. 視頻花屏/卡頓原因
我們在觀看視頻時,會遇到花屏或者卡頓現象.那這個與我們剛剛所講的GOF就息息相關了.
- 如果GOP分組中的P幀丟失就會造成解碼端的圖像發生錯誤.
- 為了避免花屏問題的發生,一般如果發現P幀或者I幀丟失.就不顯示本GOP內的所有幀.只到下一個I幀來后重新刷新圖像.
- 當這時因為沒有刷新屏幕.丟包的這一組幀全部扔掉了.圖像就會卡在哪里不動.這就是卡頓的原因.
所以總結起來,花屏是因為你丟了P幀或者I幀.導致解碼錯誤. 而卡頓是因為為了怕花屏,將整組錯誤的GOP數據扔掉了.直達下一組正確的GOP再重新刷屏.而這中間的時間差,就是我們所感受的卡頓.
五. 視頻都有哪些視頻編解碼器?
X264/X265
X264: 是目前最使用最廣泛X264編解碼器.這個性能也是非常優秀.如果是使用軟編解碼基本上都是使用的X264. 那么X265也逐漸開始成熟了.但是在直播系統里,因為它的壓縮比更高,它占用的CPU也是非常高的.在直播里,如果用X265的話,CPU就抖然就上去了.所以直播間里一般不會用H265.在點播系統里可以嘗試使用X265.
OpenH264. 相對于X264性能要低一些.但是它有一個特點.支持SVC視頻技術.什么是SVC視頻技術,就是將視頻分層傳輸.將數據分為小中大.3個部分.如果網絡差,就只發最小的內核的視頻幀.那么網絡稍好就將中間的幀發送出去.如果網絡補充就把全部的數據發送出去.發送到對端.將3層疊加在一起就還原原來的視頻數據.如果網絡差,只發送了內核層數據.那么就能看到視頻圖像的大概信息,但是不夠清晰.每加一層就清晰一些.這就是SVC技術.但是它不好的一點就是移動端.因為我們移動端SVC技術標準很多硬件不支持.如果你要用SVC,你的移動端就不能用硬件來編解碼.只能使用軟編.使用軟編就意味著只能用CPU. 對CPU是有很大的消耗的. 這就是一個取舍.你想要定制帶寬,就不能使用手機硬件來編碼.如果你要硬件編碼就不能使用SVC技術.
vp8/vp9: 這是Google推出的.vp8是針對于x264.vp9是針對于x265.
關于H265這篇文章我個人覺得非常不錯.通俗易懂,能讓開發者比較全面了解.
https://blog.csdn.net/shaoqigulang/article/details/72915477