前言
不管是手機攝像頭還是一些芯片,他所采集到的實際上都是一幀一幀的圖像,當(dāng)幀數(shù)大于24-30的時候,對這些圖像進行連續(xù)的播放,對人的感覺就像是視頻在播放 . 常見的圖片壓縮格式有:png,jpg等等.
我們?yōu)槭裁匆M行壓縮呢?做一個假設(shè),一張圖片是2M,如果一段視頻是30幀,那么他如果不經(jīng)過處理,這段視頻一秒鐘的數(shù)據(jù)量就是60M,這在本地或者局域網(wǎng)倒是問題比較小,對一些發(fā)達國家來說或許也勉強可以,但對中國目前的互聯(lián)網(wǎng)環(huán)境來說,一分鐘傳輸60M文件,還是壓力很大的,所以我們便不得不去研究壓縮,在這里順便提一句,一位前輩曾告訴過我,音視頻開發(fā)到了后面,網(wǎng)絡(luò)就成了瓶頸,這句話剛開始其實還不是很明白,但現(xiàn)在已經(jīng)開始理解起來了.
H.264的壓縮算法可以很有效的對單幅圖片進行壓縮,它的原理就是我第一篇文章中講到的IBP幀算法,兩幅圖片對前后不同的地方進行傳輸,這樣就可以對圖像進行大幅度的壓縮.如下圖所示,畫的不太好,意思一下.藍色地方就是兩幅圖不同的地方.
后來推出了H.265標(biāo)準(zhǔn)在720p畫質(zhì)以下時區(qū)別是不大的,在傳播4k這樣的畫質(zhì)時就可以看出明顯區(qū)別了,H.265的壓縮率會更高.
像iPhone和安卓手機內(nèi)部都是有硬編碼的芯片的,他的效率非常高,如果沒有硬編碼芯片,我們就需要使用FFmpeg,X264對其進行編碼了.而硬解碼的芯片一般第三方是沒有權(quán)限去使用的,所以這時候我們就要用到FFmpeg了,像這種解碼的方式我們就稱其為軟解,這種方式的解碼效率相比硬解碼來講是偏低的,而我們的目的就是通過一些手段和方法來提高軟解碼的效率。
H.264解碼工具
在項目這里的三個文件是封裝好的解碼工具,注釋這里我沒有詳細的注釋,若果有不明白的地方,請翻閱第三篇文章,基本是類似的.
在這個工具類中取消了使用sws_scale()函數(shù)來進行yuv->rgb的過程,他太消耗性能,我們可以使用libyuv或者交給Opengl的shader讓他利用硬件來進行轉(zhuǎn)換,這個效率非常高.下面推薦一篇關(guān)于yuv->rgb優(yōu)化算法的一篇文章:鏈接.
這是雷博關(guān)于sws_scale()函數(shù)的介紹:鏈接
這是雷博關(guān)于sws_scale()函數(shù)性能的測試:鏈接
Opengl ES渲染工具
這個大體的邏輯就是將YUV420P數(shù)據(jù)通過rander轉(zhuǎn)化為RGB數(shù)據(jù),再利用紋理貼圖顯示出來,這是我找到的一個比較好的渲染工具類.工具類本身是繼承自UIView的,上面的scrollerview可以實現(xiàn)縮放等功能.