一.學習背景
5G網絡作為第5代的移動通信網絡,它的網絡峰值傳播速度可1以達到10Gbps/s
.這比4G的的傳輸速度快數(shù)百倍.舉個例子,整部超高畫質電影下載可在1秒鐘之內下載完成.
當然,隨著5G技術的誕生,用在智能終端分享3D電影,游戲或者超高畫質節(jié)目的時代已經毫無懸念的向我們走來.
想必大家也逐步了解,國內外的互聯(lián)網公司也已經布局音視頻,3D技術方面的開發(fā)者招聘和相關產品研發(fā).目前落地推廣最普遍的就是直播類項目和小視頻類的項目.當然未來的方向肯定不止如此.
那么我們現(xiàn)在帶著問題來學習?
- 為何編碼?
- 何為編碼?
1.1 為何編碼?
從存儲角度和網絡傳輸以及通用性 3個角度,壓縮已經成了不可或缺的動作.壓縮編碼最基本的指標,就是壓縮比. 壓縮比通常都是小于1(如果等于或者大于1,是不是就失去了編碼的意義了.編碼的目的就是為了壓縮數(shù)據體量).
1.2 何為編碼?
編碼就是按照一定的格式記錄采樣和量化后的數(shù)據.
1.2.1編碼中軟編碼和硬編碼的區(qū)別?
- 硬編碼: 使用非CPU進行編碼,例如使用GPU芯片處理
- 軟編碼: 使用CPU來進行編碼計算.
1.2.2 軟編碼與硬編碼的區(qū)分?
- 軟編碼: 實現(xiàn)直接科乎、簡單疮方,參數(shù)調整方便肢簿,升級易,但CPU負載重寺晌,性能較硬編碼低,低碼率下質量通常比硬編碼要好一點尔邓。
- 硬編碼:性能高名秀,低碼率下通常質量低于硬編碼器,但部分產品在GPU硬件平臺移植了優(yōu)秀的軟編碼算法(如X264)的,質量基本等同于軟編碼棚壁。
讀者理解:
硬編碼,就是使用GPU計算,獲取數(shù)據結果,優(yōu)點速度快,效率高.
軟編碼,就是通過CPU來計算,獲取數(shù)據結果.
1.2.3 壓縮算法
壓縮算法分為2種,有損壓縮與無損壓縮.
- 無損壓縮:解壓后的數(shù)據可以完全復原,在常用的壓縮格式中,無損壓縮使用頻次較低
- 有損壓縮:解壓后數(shù)據不能完全復原,會丟失一部分信息.壓縮比越小,丟失的信息就會越多.信號還原的失真就會越大.
需要根據不同的場景(考慮因素包括存儲設備,傳輸網絡環(huán)境,播放設備等)選用不同的壓縮編碼算法.
二. 直播APP需求剖析
2.1 直播項目流程
在直播項目中,一般常見有8個步驟.
- 音視頻采集
- 視頻濾鏡
- 音視頻編碼
- 推流
- 流媒體服務器處理
- 拉流
- 音視頻解碼
- 音視頻播放
這個在開發(fā)者面試一些有意向或者目前業(yè)務中包含直播需求的公司,最為常見的面試題.不管在我們過往的工作經驗是否有直播或音視頻相關經驗.這個一塊都是你必須能了解.希望大家可以簡單的了解.
2.2 相關框架的學習與使用場景
-
采集視頻,音頻
- 使用iOS原生框架
AVFoundation.framework
- 使用iOS原生框架
-
視頻濾鏡處理
- 使用iOS原生框架
CoreImage.framework
- 使用第三方框架
GPUImage.framework
- 使用iOS原生框架
CoreImage
與GPUImage
框架比較:
在實際項目開發(fā)中,開發(fā)者更加傾向使用于GPUImage
框架.
首先它在使用性能上與iOS提供的原生框架,并沒有差別;其次它的使用便利性高于iOS原生框架,最后也是最重要的GPUImage
框架是開源的.而大家如果想要學習GPUImage
框架,建議學習OpenGL ES
,其實GPUImage
的封裝和思維都是基于OpenGL ES
.
GPUImage OC版本下載地址
GPUImage Swift版本下載地址
-
視頻\音頻編碼壓縮
- 硬編碼
- 視頻:
VideoToolBox
框架 - 音頻:
AudioToolBox
框架
- 視頻:
- 軟編碼
- 視頻: 使用
FFmpeg
,X264
算法把視頻原數(shù)據YUV/RGB編碼成H264 - 音頻: 使用
fdk_aac
將音頻數(shù)據PCM轉換成AAC
- 視頻: 使用
- 硬編碼
-
推流
- 推流: 將采集的音頻.視頻數(shù)據通過流媒體協(xié)議發(fā)送到流媒體服務器
- 推流技術
- 流媒體協(xié)議: RTMP\RTSP\HLS\FLV
- 視頻封裝格式: TS\FLV
- 音頻封裝格式: Mp3\AAC
-
流媒體服務器
- 數(shù)據分發(fā)
- 截屏
- 實時轉碼
- 內容檢測
-
拉流
- 拉流: 從流媒體服務器中獲取音頻\視頻數(shù)據
- 流媒體協(xié)議: RTMP\RTSP\HLS\FLV
-
音視頻解碼
- 硬解碼
- 視頻:
VideoToolBox
框架 - 音頻:
AudioToolBox
框架
- 視頻:
- 軟解碼
- 視頻: 使用
FFmpeg
,X264
算法解碼 - 音頻: 使用
fdk_aac
解碼
- 視頻: 使用
- 硬解碼
-
播放
-
ijkplayer
播放框架 -
kxmovie
播放框架
ijkplayer
,kxmovie
都是基于FFmpeg框架封裝的 -