iOS中H264的編碼原理 - 音視頻總結(jié)

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.

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成為主流.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容