I幀: 關(guān)鍵幀, 采用幀內(nèi)壓縮技術(shù)
舉個(gè)栗子, 如果攝像頭對著一個(gè)蝸牛拍攝, 1秒鐘之內(nèi), 這個(gè)蝸牛發(fā)生的變化是非常少的, 攝像機(jī)一般一秒鐘會抓取幾十幀的數(shù)據(jù), 我們看這個(gè)蝸牛這一秒鐘的幾十幀數(shù)據(jù), 會感覺每一幀都幾乎是一樣的, 蝸牛在一秒鐘里的變化實(shí)在太小了, 以至于肉眼幾乎感覺不到有變化.
像動畫, 是25幀/s, 一般視頻文件都是在30幀/s左右, 對于一些要求比較高的, 對動作的精細(xì)有要求, 想要捕捉到完整的動作的, 高級的攝像機(jī)一般是60幀/s, 比如100米短跑時(shí)拍攝運(yùn)動員的動作. 而對于像蝸牛這樣一組幀它的變化很小, 為了壓縮數(shù)據(jù)變小, 可以將第一幀完整的保存下來, 作為后面的幀的依賴, 這樣后面的第二幀存儲第一幀的差異就可以了, 以此類推. 如果沒有這個(gè)關(guān)鍵幀, 后面要解碼數(shù)據(jù)是完成不了的, 所以I幀特別關(guān)鍵.
P幀: 向前參考幀, 壓縮時(shí)只參考前一個(gè)幀, 采用幀間壓縮技術(shù)
視頻的第一幀會被作為關(guān)鍵幀保存下來. 而后面的幀會向前依賴, 也就是第二幀依賴于第一幀, 后面所有的幀只存儲前一幀的差異. 這樣就能將數(shù)據(jù)大大的減少, 從而達(dá)到一個(gè)高壓縮率的效果.
B幀: 雙向參考幀, 壓縮時(shí)既參考前一幀也參考后一幀, 采用幀間壓縮技術(shù)
B幀, 即參考前一幀, 也參考后一幀, 這樣使得它的壓縮率更高, 存儲的數(shù)據(jù)量更小, 因?yàn)榍耙粠秃笠粠械臄?shù)據(jù), 都可以不用存儲了, 所以為了數(shù)據(jù)更小, 可以使用B幀. 使用B幀的數(shù)量越多, 你的壓縮率就越高, 這是B幀的優(yōu)點(diǎn).
B幀的缺點(diǎn)就是, 在實(shí)時(shí)互動直播中, B幀要參考后面的幀才能解碼, 那在網(wǎng)絡(luò)傳輸中就要等待后面的幀傳輸過來. 這樣子的話, 解碼的快慢就跟網(wǎng)絡(luò)有關(guān)了, 如果網(wǎng)絡(luò)好, 解碼就快一些, 如果網(wǎng)絡(luò)不好解碼就慢一些, 丟包時(shí)還要等待重傳, 等待時(shí)間的長短,就要看當(dāng)時(shí)的網(wǎng)絡(luò)情況了, 這對于實(shí)時(shí)互動直播是無法忍受的, 所以對于實(shí)時(shí)互動直播, 一般不會使用B幀.
有了B幀, 我們就可以根據(jù)情況選擇使用了, 比如在泛娛樂直播中, 可以接受一定程度的延時(shí), 又需要比較高的壓縮比就可以使用B幀.
GOF(Group of Frame)或者說GOP(Group of Picture)一組幀
如果在一秒鐘內(nèi), 有30幀, 這30幀可以畫成一組, 如果攝像機(jī)或者鏡頭它一分鐘內(nèi)都沒有發(fā)生變化, 那也可以把這一分鐘內(nèi)所有的幀畫做一組.
什么叫一組幀?
就是一個(gè)I幀到下一個(gè)I幀, 這一組的數(shù)據(jù), 包括B幀/P幀, 我們稱為GOF.

SPS/PPS
SPS/PPS 實(shí)際上就是存儲 GOP 的參數(shù), 存儲著GOP的相關(guān)信息, 沒有這些信息, 我們的解碼工作就無法順利做好
SPS(Sequence Parameter Set, 序列參數(shù)集)存放幀數(shù), 參考幀數(shù)目, 解碼圖像尺寸, 幀場編碼模式選擇標(biāo)識等.
PPS(Picture Parameter Set, 圖像參數(shù)集), 存放熵編碼模式選擇標(biāo)識, 片組數(shù)目, 初始量化參數(shù)和去方塊濾波系數(shù)調(diào)整標(biāo)識等(與圖像相關(guān)的信息)
在一組幀之前我們首先收到的是SPS/PPS數(shù)據(jù), 如果沒有這2組數(shù)據(jù)我們是無法解碼的, 如果我們在解碼時(shí)發(fā)生錯誤, 首先要檢查是否有SPS/PPS, 如果沒有, 可能是因?yàn)闆]有發(fā)送過來, 或者是發(fā)送過程中丟失了. SPS/PPS數(shù)據(jù), 我們也將其歸類到I幀, 這2組數(shù)據(jù)是絕對不能丟的.
視頻花屏/卡頓的原因
我們在觀看視頻時(shí), 如果遇到花屏/卡頓現(xiàn)象, 一般都是GOF的問題
- 如果GOF分組中的P幀丟失, 就會造成解碼端的圖像發(fā)生錯誤.
- 為了避免發(fā)生花屏, 一般發(fā)現(xiàn)P幀或I幀丟失, 就不顯示本GOF內(nèi)的所有幀, 等到下一個(gè)I幀過來后才重新刷新圖像
- 這是因?yàn)闆]有刷新屏幕, 而且丟包的這一組幀全部扔掉了, 圖像就會卡住那里不動, 這就是卡頓的原因.
所以總結(jié)起來就是, 花屏是因?yàn)閬G失了數(shù)據(jù). 而卡頓是因?yàn)榕禄ㄆ? 而主動把數(shù)據(jù)丟了, 從而產(chǎn)生了卡頓.
視頻都有哪些視頻編解碼器
x264/x265
x264是目前使用最廣泛的編解碼器, 它的性能非常優(yōu)秀, 如果使用軟編的話, 基本上都是用的x264. x265也在走向成熟, 在直播系統(tǒng)里, 因?yàn)樗膲嚎s比非常高, 所以占用的CPU也非常高, 就目前來說, 在直播系統(tǒng)里是不可用的. 在點(diǎn)播系統(tǒng)里可以嘗試使用x265了.
openH264
相對于X264性能要低一些, 但是它有一個(gè)特點(diǎn), 支持SVC視頻技術(shù), 就是將視頻分層傳輸, 將視頻數(shù)據(jù)分為小中大三個(gè)部分, 如果網(wǎng)絡(luò)差, 就只傳輸最小的內(nèi)核視頻幀. 如果網(wǎng)絡(luò)稍微好點(diǎn)就將中間的一層也傳輸過去, 如果網(wǎng)絡(luò)很好, 就把全部的三層都傳輸過去, 然后可以將三層數(shù)據(jù)疊加在一起就形成了原來的視頻. 如果只有最小的內(nèi)核層, 只能看到圖像的大概信息, 這是不清晰的, 每加一層就清晰一些.
缺點(diǎn)是SVC在移動端不是一個(gè)標(biāo)準(zhǔn), 很多硬件都不支持, 如果使用SVC就不能使用硬編碼, 只能使用軟編碼, 這對CPU的消耗相當(dāng)大, 就會造成手機(jī)容易發(fā)燙、耗電等問題.
vp8/vp9
由谷歌退出, vp8對應(yīng)的是x264, vp9對應(yīng)的是x265.
H.265(H.264的升級版)
H.265是一種新的視頻壓縮標(biāo)準(zhǔn), 核心價(jià)值是在原來帶寬條件下傳輸更高質(zhì)量的網(wǎng)絡(luò)視頻. 只需要原先一半左右的帶寬即可播放相同質(zhì)量的視頻.
H.265編碼后的結(jié)果是我們想要的, 但是在編碼過程中, H.265比H.264的復(fù)雜度高很多, 所需要功耗更大, 耗時(shí)更長, 也就對設(shè)備要求更高, 而且還有目前的主流瀏覽器不支持H.265, 這就導(dǎo)致了即使H.265有著很大的優(yōu)勢, 也沒有取代H.264成為主流.