I幀: 關(guān)鍵幀, 采用幀內(nèi)壓縮技術(shù)
舉個(gè)栗子, 如果攝像頭對(duì)著一個(gè)蝸牛拍攝, 1秒鐘之內(nèi), 這個(gè)蝸牛發(fā)生的變化是非常少的, 攝像機(jī)一般一秒鐘會(huì)抓取幾十幀的數(shù)據(jù), 我們看這個(gè)蝸牛這一秒鐘的幾十幀數(shù)據(jù), 會(huì)感覺(jué)每一幀都幾乎是一樣的, 蝸牛在一秒鐘里的變化實(shí)在太小了, 以至于肉眼幾乎感覺(jué)不到有變化.
像動(dòng)畫(huà), 是25幀/s, 一般視頻文件都是在30幀/s左右, 對(duì)于一些要求比較高的, 對(duì)動(dòng)作的精細(xì)有要求, 想要捕捉到完整的動(dòng)作的, 高級(jí)的攝像機(jī)一般是60幀/s, 比如100米短跑時(shí)拍攝運(yùn)動(dòng)員的動(dòng)作. 而對(duì)于像蝸牛這樣一組幀它的變化很小, 為了壓縮數(shù)據(jù)變小, 可以將第一幀完整的保存下來(lái), 作為后面的幀的依賴, 這樣后面的第二幀存儲(chǔ)第一幀的差異就可以了, 以此類(lèi)推. 如果沒(méi)有這個(gè)關(guān)鍵幀, 后面要解碼數(shù)據(jù)是完成不了的, 所以I幀特別關(guān)鍵.
P幀: 向前參考幀, 壓縮時(shí)只參考前一個(gè)幀, 采用幀間壓縮技術(shù)
視頻的第一幀會(huì)被作為關(guān)鍵幀保存下來(lái). 而后面的幀會(huì)向前依賴, 也就是第二幀依賴于第一幀, 后面所有的幀只存儲(chǔ)前一幀的差異. 這樣就能將數(shù)據(jù)大大的減少, 從而達(dá)到一個(gè)高壓縮率的效果.
B幀: 雙向參考幀, 壓縮時(shí)既參考前一幀也參考后一幀, 采用幀間壓縮技術(shù)
B幀, 即參考前一幀, 也參考后一幀, 這樣使得它的壓縮率更高, 存儲(chǔ)的數(shù)據(jù)量更小, 因?yàn)榍耙粠秃笠粠械臄?shù)據(jù), 都可以不用存儲(chǔ)了, 所以為了數(shù)據(jù)更小, 可以使用B幀. 使用B幀的數(shù)量越多, 你的壓縮率就越高, 這是B幀的優(yōu)點(diǎn).
B幀的缺點(diǎn)就是, 在實(shí)時(shí)互動(dòng)直播中, B幀要參考后面的幀才能解碼, 那在網(wǎng)絡(luò)傳輸中就要等待后面的幀傳輸過(guò)來(lái). 這樣子的話, 解碼的快慢就跟網(wǎng)絡(luò)有關(guān)了, 如果網(wǎng)絡(luò)好, 解碼就快一些, 如果網(wǎng)絡(luò)不好解碼就慢一些, 丟包時(shí)還要等待重傳, 等待時(shí)間的長(zhǎng)短,就要看當(dāng)時(shí)的網(wǎng)絡(luò)情況了, 這對(duì)于實(shí)時(shí)互動(dòng)直播是無(wú)法忍受的, 所以對(duì)于實(shí)時(shí)互動(dòng)直播, 一般不會(huì)使用B幀.
有了B幀, 我們就可以根據(jù)情況選擇使用了, 比如在泛娛樂(lè)直播中, 可以接受一定程度的延時(shí), 又需要比較高的壓縮比就可以使用B幀.
GOF(Group of Frame)或者說(shuō)GOP(Group of Picture)一組幀
如果在一秒鐘內(nèi), 有30幀, 這30幀可以畫(huà)成一組, 如果攝像機(jī)或者鏡頭它一分鐘內(nèi)都沒(méi)有發(fā)生變化, 那也可以把這一分鐘內(nèi)所有的幀畫(huà)做一組.
什么叫一組幀?
就是一個(gè)I幀到下一個(gè)I幀, 這一組的數(shù)據(jù), 包括B幀/P幀, 我們稱為GOF.
SPS/PPS
SPS/PPS 實(shí)際上就是存儲(chǔ) GOP 的參數(shù), 存儲(chǔ)著GOP的相關(guān)信息, 沒(méi)有這些信息, 我們的解碼工作就無(wú)法順利做好
SPS(Sequence Parameter Set, 序列參數(shù)集)存放幀數(shù), 參考幀數(shù)目, 解碼圖像尺寸, 幀場(chǎng)編碼模式選擇標(biāo)識(shí)等.
PPS(Picture Parameter Set, 圖像參數(shù)集), 存放熵編碼模式選擇標(biāo)識(shí), 片組數(shù)目, 初始量化參數(shù)和去方塊濾波系數(shù)調(diào)整標(biāo)識(shí)等(與圖像相關(guān)的信息)
在一組幀之前我們首先收到的是SPS/PPS數(shù)據(jù), 如果沒(méi)有這2組數(shù)據(jù)我們是無(wú)法解碼的, 如果我們?cè)诮獯a時(shí)發(fā)生錯(cuò)誤, 首先要檢查是否有SPS/PPS, 如果沒(méi)有, 可能是因?yàn)闆](méi)有發(fā)送過(guò)來(lái), 或者是發(fā)送過(guò)程中丟失了. SPS/PPS數(shù)據(jù), 我們也將其歸類(lèi)到I幀, 這2組數(shù)據(jù)是絕對(duì)不能丟的.
視頻花屏/卡頓的原因
我們?cè)谟^看視頻時(shí), 如果遇到花屏/卡頓現(xiàn)象, 一般都是GOF的問(wèn)題
- 如果GOF分組中的P幀丟失, 就會(huì)造成解碼端的圖像發(fā)生錯(cuò)誤.
- 為了避免發(fā)生花屏, 一般發(fā)現(xiàn)P幀或I幀丟失, 就不顯示本GOF內(nèi)的所有幀, 等到下一個(gè)I幀過(guò)來(lái)后才重新刷新圖像
- 這是因?yàn)闆](méi)有刷新屏幕, 而且丟包的這一組幀全部扔掉了, 圖像就會(huì)卡住那里不動(dòng), 這就是卡頓的原因.
所以總結(jié)起來(lái)就是, 花屏是因?yàn)閬G失了數(shù)據(jù). 而卡頓是因?yàn)榕禄ㄆ? 而主動(dòng)把數(shù)據(jù)丟了, 從而產(chǎn)生了卡頓.
視頻都有哪些視頻編解碼器
x264/x265
x264是目前使用最廣泛的編解碼器, 它的性能非常優(yōu)秀, 如果使用軟編的話, 基本上都是用的x264. x265也在走向成熟, 在直播系統(tǒng)里, 因?yàn)樗膲嚎s比非常高, 所以占用的CPU也非常高, 就目前來(lái)說(shuō), 在直播系統(tǒng)里是不可用的. 在點(diǎn)播系統(tǒng)里可以嘗試使用x265了.
openH264
相對(duì)于X264性能要低一些, 但是它有一個(gè)特點(diǎn), 支持SVC視頻技術(shù), 就是將視頻分層傳輸, 將視頻數(shù)據(jù)分為小中大三個(gè)部分, 如果網(wǎng)絡(luò)差, 就只傳輸最小的內(nèi)核視頻幀. 如果網(wǎng)絡(luò)稍微好點(diǎn)就將中間的一層也傳輸過(guò)去, 如果網(wǎng)絡(luò)很好, 就把全部的三層都傳輸過(guò)去, 然后可以將三層數(shù)據(jù)疊加在一起就形成了原來(lái)的視頻. 如果只有最小的內(nèi)核層, 只能看到圖像的大概信息, 這是不清晰的, 每加一層就清晰一些.
缺點(diǎn)是SVC在移動(dòng)端不是一個(gè)標(biāo)準(zhǔn), 很多硬件都不支持, 如果使用SVC就不能使用硬編碼, 只能使用軟編碼, 這對(duì)CPU的消耗相當(dāng)大, 就會(huì)造成手機(jī)容易發(fā)燙罪治、耗電等問(wèn)題.
vp8/vp9
由谷歌退出, vp8對(duì)應(yīng)的是x264, vp9對(duì)應(yīng)的是x265.
H.265(H.264的升級(jí)版)
H.265是一種新的視頻壓縮標(biāo)準(zhǔn), 核心價(jià)值是在原來(lái)帶寬條件下傳輸更高質(zhì)量的網(wǎng)絡(luò)視頻. 只需要原先一半左右的帶寬即可播放相同質(zhì)量的視頻.
H.265編碼后的結(jié)果是我們想要的, 但是在編碼過(guò)程中, H.265比H.264的復(fù)雜度高很多, 所需要功耗更大, 耗時(shí)更長(zhǎng), 也就對(duì)設(shè)備要求更高, 而且還有目前的主流瀏覽器不支持H.265, 這就導(dǎo)致了即使H.265有著很大的優(yōu)勢(shì), 也沒(méi)有取代H.264成為主流.