以前一直作直播方面的開發,不過一直沒機會接觸一些推流和播放器的技術,因此業餘時間本身去寫了一下推流器模塊的Demo。
html
本身也總結了一些經常使用的知識: git
我將推流器當作五塊知識點,分別是:採集、處理、編碼、封包、推流。
github
採集是將機器得到的圖片和視頻轉成一幀幀圖像數據返回到開發者手中。編程
如下是採集模塊一些知識點api
yuv、rgb、ycbcr的顏色空間模型知識點:緩存
硬知識點,請參考: blog.csdn.net/u010186001/…架構
iOS採集知識點app
iOS下經過硬件採集到的圖像數據會用CMSampleBufferRef來保存回調到使用者手中。 CMSampleBufferRef結構以下:(音頻:結構體內的CVPixelBuffer替換成CMBlockBuffer),CVPixelBuffer就是RGB/YUV/YCBCR的數據。框架
GPUImage知識點ide
GPUImage是IOS上基於opengl的圖像、視頻處理開源框架,裏面帶有大量的濾鏡,同時也很方便在原有基礎上加入本身的濾鏡Filter,全部濾鏡是基於opengl shader實現的,因此濾鏡效果圖像處理是在GPU上實現的,處理效率比較高。
GPUImage基本架構是chain式結構,主要由一個GPUImageOutput interface和一個GPUImageInput protocol串聯起來,GPUImageOutput輸出Texture,GPUImageInput輸入Texture,整個鏈式圖像數據傳遞由Texture負責。camera,stillimage等圖像、視頻sources繼承自GPUImageOutput,濾鏡Filters繼承自GPUImageOutput並實現GPUImageInput,View,FileWriter等Outputs實現GPUImageInput。
OpenGL ES 地址:www.khronos.org/opengles/
Metal 地址:developer.apple.com/documentati…
Metal 是一個和 OpenGL ES相似的面向底層的圖形編程接口,經過使用相關的 api 能夠直接操做 GPU ,最先在 2014 年的 WWDC 的時候發佈,並於今年發佈了 Metal 2,是蘋果的一個親兒子。
Metal框架支持GPU硬件加速、高級3D圖形渲染以及大數據並行運算。且提供了先進而精簡的API來確保框架的細粒度(fine-grain),而且在組織架構、程序處理、圖形呈現、運算指令以及指令相關數據資源的管理上都支持底層控制。其核心目的是儘量的減小CPU開銷,而將運行時產生的大部分負載交由GPU承擔。
(之後須要繼續研究Metal)
GPUImageFilter
能夠參考:www.jianshu.com/p/468788069…
最普遍最經常使用的格式 H264
I幀
幀內編碼幀 ,I幀表示關鍵幀,你能夠理解爲這一幀畫面的完整保留;解碼時只須要本幀數據就能夠完成(由於包含完整畫面)
幀內編碼用來縮減圖像的空間冗餘。爲了提升H.264幀內編碼的效率,在給定幀中充分利用相鄰宏塊的空間相關性,相鄰的宏塊一般含有類似的屬性。所以,在對一給定宏塊編碼時,首先能夠根據周圍的宏塊預測(典型的是根據左上角宏塊、左邊宏塊和上面宏塊,由於此宏塊已經被編碼處理),而後對預測值與實際值的差值進行編碼,這樣,相對於直接對該幀編碼而言,能夠大大減少碼率。
H.264提供9種模式進行4×4像素宏塊預測,包括1種直流預測和8種方向預測。在圖中,相鄰塊的A到I共9個像素均已經被編碼,能夠被用以預測,若是咱們選擇模式4,那麼,a、b、c、d4個像素被預測爲與E相等的值,e、f、g、h4個像素被預測爲與F相等的值,對於圖像中含有不多空間信息的平坦區,H.264也支持16×16的幀內編碼。
I幀特色:
- 它是一個全幀壓縮編碼幀。它將全幀圖像信息進行JPEG壓縮編碼及傳輸;
- 解碼時僅用I幀的數據就可重構完整圖像;
- I幀描述了圖像背景和運動主體的詳情;
- I幀不須要參考其餘畫面而生成;
- I幀是P幀和B幀的參考幀(其質量直接影響到同組中之後各幀的質量);
- I幀是幀組GOP的基礎幀(第一幀),在一組中只有一個I幀;
- I幀不須要考慮運動矢量;
- I幀所佔數據的信息量比較大。
P幀
前向預測編碼幀。P幀表示的是這一幀跟以前的一個關鍵幀(或P幀)的差異,解碼時須要用以前緩存的畫面疊加上本幀定義的差異,生成最終畫面。(也就是差異幀,P幀沒有完整畫面數據,只有與前一幀的畫面差異的數據) P幀的預測與重構:P幀是以I幀爲參考幀,在I幀中找出P幀「某點」的預測值和運動矢量,取預測差值和運動矢量一塊兒傳送。在接收端根據運動矢量從I幀中找出P幀「某點」的預測值並與差值相加以獲得P幀「某點」樣值,從而可獲得完整的P幀。
P幀特色:
- P幀是I幀後面相隔1~2幀的編碼幀;
- P幀採用運動補償的方法傳送它與前面的I或P幀的差值及運動矢量(預測偏差);
- 解碼時必須將I幀中的預測值與預測偏差求和後才能重構完整的P幀圖像;
- P幀屬於前向預測的幀間編碼。它只參考前面最靠近它的I幀或P幀;
- P幀能夠是其後面P幀的參考幀,也能夠是其先後的B幀的參考幀;
- 因爲P幀是參考幀,它可能形成解碼錯誤的擴散;
- 因爲是差值傳送,P幀的壓縮比較高。
B幀
雙向預測內插編碼幀。B幀是雙向差異幀,也就是B幀記錄的是本幀與先後幀的差異(具體比較複雜,有4種狀況,但我這樣說簡單些),換言之,要解碼B幀,不只要取得以前的緩存畫面,還要解碼以後的畫面,經過先後畫面的與本幀數據的疊加取得最終的畫面。B幀壓縮率高,可是解碼時CPU會比較累。因此移動端通常不解壓B幀。
B幀的預測與重構 B幀之前面的I或P幀和後面的P幀爲參考幀,「找出」B幀「某點」的預測值和兩個運動矢量,並取預測差值和運動矢量傳送。接收端根據運動矢量在兩個參考幀中「找出(算出)」預測值並與差值求和,獲得B幀「某點」樣值,從而可獲得完整的B幀。
B幀特色
- B幀是由前面的I或P幀和後面的P幀來進行預測的;
- B幀傳送的是它與前面的I或P幀和後面的P幀之間的預測偏差及運動矢量;
- B幀是雙向預測編碼幀;
- B幀壓縮比最高,由於它只反映丙參考幀間運動主體的變化狀況,預測比較準確;
- B幀不是參考幀,不會形成解碼錯誤的擴散。
VideoToolBox
iOS8以上才支持,硬編碼庫。
VideoToolBox:developer.apple.com/documentati…
FFmpeg
iOS暫時支持軟編碼,不過軟編碼適配比較多格式和機型。
Rtmp協議
是Adobe的一個沒有徹底公開的基於TCP上的協議。
優勢:延遲低,正常來講3s左右。並且支持加密。 缺點:iOS、安卓來講須要另外支持的播放器來播放,H5也沒辦法直接播放Rtmp協議的,因此不少H5也會用HLS來播放。還有一點是Rtmp基於TCP協議,因此RTMP會累積延時,因此當累積到一段時候須要清除延時。
HLS協議和HTTP協議
優勢:協議簡單,性能高。 缺點:延時比較高,並且HLS延時是根據分塊大小決定。
github:github.com/KoonChaoSo/…