音視頻學(xué)習(xí)從零到整--(1)
音視頻學(xué)習(xí)從零到整--(2)
音視頻學(xué)習(xí)從零到整--(3)
音視頻學(xué)習(xí)從零到整--(4)
音視頻學(xué)習(xí)從零到整--(5)
音視頻學(xué)習(xí)從零到整--(6)
音視頻學(xué)習(xí)從零到整--(8)
音視頻學(xué)習(xí)從零到整--(9)
音視頻學(xué)習(xí)從零到整--(10)
一. H264基本概念.
I幀: 關(guān)鍵幀,采用幀內(nèi)壓縮技術(shù).
- 舉個(gè)例子,如果攝像頭對著你拍攝,1秒之內(nèi),實(shí)際你發(fā)生的變化是非常少的.1秒鐘之內(nèi)實(shí)際少很少有大幅度的變化.攝像機(jī)一般一秒鐘會抓取幾十幀的數(shù)據(jù).比如像動畫,就是25幀/s,一般視頻文件都是在30幀/s左右.對于一些要求比較高的,對動作的精細(xì)度有要求,想要捕捉到完整的動作的,高級的攝像機(jī)一般是60幀/s.那些對于一組幀的它的變化很小.為了便于壓縮數(shù)據(jù),那怎么辦了?將第一幀完整的保存下來.如果沒有這個(gè)關(guān)鍵幀后面解碼數(shù)據(jù),是完成不了的.所以I幀特別關(guān)鍵.
P幀: 向前參考幀.壓縮時(shí)只參考前一個(gè)幀.屬于幀間壓縮技術(shù).
- 視頻的第一幀會被作為關(guān)鍵幀完整保存下來.而后面的幀會向前依賴.也就是第二幀依賴于第一個(gè)幀.后面所有的幀只存儲于前一幀的差異.這樣就能將數(shù)據(jù)大大的減少.從而達(dá)到一個(gè)高壓縮率的效果.
B幀: 雙向參考幀,壓縮時(shí)即參考前一幀也參考后一幀.幀間壓縮技術(shù).
- B幀,即參考前一幀,也參考后一幀.這樣就使得它的壓縮率更高.存儲的數(shù)據(jù)量更小.如果B幀的數(shù)量越多,你的壓縮率就越高.這是B幀的優(yōu)點(diǎn),但是B幀最大的缺點(diǎn)是,如果是實(shí)時(shí)互動的直播,那時(shí)與B幀就要參考后面的幀才能解碼,那在網(wǎng)絡(luò)中就要等待后面的幀傳輸過來.這就與網(wǎng)絡(luò)有關(guān)了.如果網(wǎng)絡(luò)狀態(tài)很好的話,解碼會比較快,如果網(wǎng)絡(luò)不好時(shí)解碼會稍微慢一些.丟包時(shí)還需要重傳.對實(shí)時(shí)互動的直播,一般不會使用B幀.
- 如果在泛娛樂的直播中,可以接受一定度的延時(shí),需要比較高的壓縮比就可以使用B幀.
- 如果我們在實(shí)時(shí)互動的直播,我們需要提高時(shí)效性,這時(shí)就不能使用B幀了.
二. GOF(Group of Frame)一組幀
如果在一秒鐘內(nèi),有30幀.這30幀可以畫成一組.如果攝像機(jī)或者鏡頭它一分鐘之內(nèi)它都沒有發(fā)生大的變化.那也可以把這一分鐘內(nèi)所有的幀畫做一組.
什么叫一組幀?
就是一個(gè)I幀到下一個(gè)I幀.這一組的數(shù)據(jù).包括B幀/P幀.我們稱為GOF.
GOF有什么好處了?它能解決什么問題了?
這個(gè)與我們接下來所學(xué)習(xí)的內(nèi)容有關(guān)了.
三. SPS/PPS
SPS/PPS實(shí)際上就是存儲GOP的參數(shù).
SPS: (Sequence Parameter Set,序列參數(shù)集)存放幀數(shù),參考幀數(shù)目,解碼圖像尺寸,幀場編碼模式選擇標(biāo)識等.
- 一組幀的參數(shù)集.
PPS:(Picture Parameter Set,圖像參數(shù)集).存放熵編碼模式選擇標(biāo)識,片組數(shù)目,初始量化參數(shù)和去方塊濾波系數(shù)調(diào)整標(biāo)識等.(與圖像相關(guān)的信息)
- 熵編碼模式,片組數(shù)目等這些我們會在后面的內(nèi)容講解到.大家在這里主要了解到SPS/PPS即可.
大家只要記住,在一組幀之前我們首先收到的是SPS/PPS數(shù)據(jù).如果沒有這組參數(shù)的話,我們是無法解碼.
如果我們在解碼時(shí)發(fā)生錯(cuò)誤,首先要檢查是否有SPS/PPS.如果沒有,是因?yàn)閷Χ藳]有發(fā)送過來還是因?yàn)閷Χ嗽诎l(fā)送過程中丟失了.
SPS/PPS數(shù)據(jù),我們也把其歸類到I幀.這2組數(shù)據(jù)是絕對不能丟的.
那么下面我們來看一下實(shí)際開發(fā)中遇到的問題.
四. 視頻花屏/卡頓原因
我們在觀看視頻時(shí),會遇到花屏或者卡頓現(xiàn)象.那這個(gè)與我們剛剛所講的GOF就息息相關(guān)了.
- 如果GOP分組中的P幀丟失就會造成解碼端的圖像發(fā)生錯(cuò)誤.
- 為了避免花屏問題的發(fā)生,一般如果發(fā)現(xiàn)P幀或者I幀丟失.就不顯示本GOP內(nèi)的所有幀.只到下一個(gè)I幀來后重新刷新圖像.
- 當(dāng)這時(shí)因?yàn)闆]有刷新屏幕.丟包的這一組幀全部扔掉了.圖像就會卡在哪里不動.這就是卡頓的原因.
所以總結(jié)起來,花屏是因?yàn)槟銇G了P幀或者I幀.導(dǎo)致解碼錯(cuò)誤. 而卡頓是因?yàn)闉榱伺禄ㄆ?將整組錯(cuò)誤的GOP數(shù)據(jù)扔掉了.直達(dá)下一組正確的GOP再重新刷屏.而這中間的時(shí)間差,就是我們所感受的卡頓.
五. 視頻都有哪些視頻編解碼器?
X264/X265
X264: 是目前最使用最廣泛X264編解碼器.這個(gè)性能也是非常優(yōu)秀.如果是使用軟編解碼基本上都是使用的X264. 那么X265也逐漸開始成熟了.但是在直播系統(tǒng)里,因?yàn)樗膲嚎s比更高,它占用的CPU也是非常高的.在直播里,如果用X265的話,CPU就抖然就上去了.所以直播間里一般不會用H265.在點(diǎn)播系統(tǒng)里可以嘗試使用X265.
OpenH264. 相對于X264性能要低一些.但是它有一個(gè)特點(diǎn).支持SVC視頻技術(shù).什么是SVC視頻技術(shù),就是將視頻分層傳輸.將數(shù)據(jù)分為小中大.3個(gè)部分.如果網(wǎng)絡(luò)差,就只發(fā)最小的內(nèi)核的視頻幀.那么網(wǎng)絡(luò)稍好就將中間的幀發(fā)送出去.如果網(wǎng)絡(luò)補(bǔ)充就把全部的數(shù)據(jù)發(fā)送出去.發(fā)送到對端.將3層疊加在一起就還原原來的視頻數(shù)據(jù).如果網(wǎng)絡(luò)差,只發(fā)送了內(nèi)核層數(shù)據(jù).那么就能看到視頻圖像的大概信息,但是不夠清晰.每加一層就清晰一些.這就是SVC技術(shù).但是它不好的一點(diǎn)就是移動端.因?yàn)槲覀円苿佣薙VC技術(shù)標(biāo)準(zhǔn)很多硬件不支持.如果你要用SVC,你的移動端就不能用硬件來編解碼.只能使用軟編.使用軟編就意味著只能用CPU. 對CPU是有很大的消耗的. 這就是一個(gè)取舍.你想要定制帶寬,就不能使用手機(jī)硬件來編碼.如果你要硬件編碼就不能使用SVC技術(shù).
vp8/vp9: 這是Google推出的.vp8是針對于x264.vp9是針對于x265.
推薦文集
* 抖音效果實(shí)現(xiàn)
* BAT—最新iOS面試題總結(jié)
* iOS面試題合集
原文作者:集才華美貌于一身的—C姐