通過計算機上的音視頻輸入設備或者手機端攝像頭和麥克風實時錄制的音視頻流洪灯,編好碼后通過直播協(xié)議將數(shù)據(jù)包實時發(fā)送給服務器端,服務器端通過流媒體協(xié)議把實時流分發(fā)出去竟痰,其他終端通過直播協(xié)議實時請求數(shù)據(jù)包签钩,并進行解碼解放掏呼。
直播過程主要設計采集數(shù)據(jù)、渲染處理边臼、編碼數(shù)據(jù)哄尔、推流假消、CDN分發(fā)柠并、拉流、播放流數(shù)據(jù)等富拗。
渲染處理
這里所說的渲染處理臼予,主要是對從相機中采集來的數(shù)據(jù)進行二次處理,如果自己做美顏封裝啃沪,可用的開源庫主要是GPUImage.
GPU工作原理:GPU 指圖像運算工作的微處理器粘拾,GPU只要利用顯卡對圖像的頂點左邊,通過圖元組配创千,進行光柵化缰雇,頂點著色等一系列管線操作。
GPUImage:基于OpenGL圖像和視頻處理的跨平臺框架追驴。提供了各種各樣的濾鏡械哟。
濾鏡處理的原理:把靜態(tài)圖像或者視頻的每一幀進行圖片轉(zhuǎn)換后展示出來。它的本質(zhì)是像素點坐標的坐標和顏色變化殿雪。
GPUImage處理畫面的原理:GPU采用鏈條式方式處理畫面暇咆,通過addTarget函數(shù)為鏈條添加每個環(huán)節(jié)的對象,處理完一個target丙曙,就回把上一個環(huán)節(jié)處理好的圖像數(shù)據(jù)傳遞給下一個target區(qū)域處理,這被稱為GPUImage處理鏈亏镰。
編碼數(shù)據(jù)
視頻編碼指的是通過特定的壓縮技術索抓,將某個視頻格式文件轉(zhuǎn)換成另一種視頻格式文件的方式。
壓縮原理
巨大的原始視頻壓縮成小的視頻核心的思想就是去除冗余信息惰瓜。
1.空間冗余汉矿。在很多圖像數(shù)據(jù)中,像素間在行奈揍、列方向上都有很大的相關性,相鄰像素的值比較接近或者完全相同男翰,這種數(shù)據(jù)冗余叫做空間冗余。
2.時間冗余昆箕。在視頻圖像序列中租冠,相鄰兩幀圖像數(shù)據(jù)有許多共通的地方顽爹,這種共通性叫做時間冗余,可采用運動補償算法來去除冗余信息捏题。
3.視覺冗余肉渴。視覺冗余是相對人眼的視覺特性而言的,人類視覺系統(tǒng)對圖像的敏感性是非均勻和非線形的稚矿,即人眼觀察不到圖像中的所有變化捻浦。
常用的壓縮編碼方法
推流
推流過程就是把編碼后的數(shù)據(jù)打包并通過直播協(xié)議發(fā)送給流媒體服務器的過程朱灿。
常用的推流協(xié)議
1.RTMP
RTMP是基于TCP,是一種被設計用來實行數(shù)據(jù)通信的網(wǎng)絡協(xié)議跪楞,主要用在Flash平臺和支持RTMP協(xié)議的流媒體/交互服務器之間進行音視頻和數(shù)據(jù)通信侣灶。
RTMP是主流的流媒體傳輸協(xié)議胰舆,廣泛用于直播領域啰脚,可以說市面上絕大多數(shù)直播都采用了這個協(xié)議俏脊。
優(yōu)點:
1.對CDN友好,主流的CDN廠商都支持該協(xié)議
2.協(xié)議簡單寨典,在各個平臺實現(xiàn)容易
缺點:
1.基于TCP,傳輸成本高报亩,在弱網(wǎng)環(huán)境丟包率高的情況下問題明顯墓猎。
2.不支持瀏覽器推送
3.Adobe私有協(xié)議赚楚,Adobe已經(jīng)不再更新該協(xié)議。
2.WebRTC
3.基于UDP的私有協(xié)議
有些直播應用會通過UDP作為底層協(xié)議開發(fā)自己的私有協(xié)議左胞。由于UDP在弱網(wǎng)環(huán)境下的優(yōu)勢烤宙,因此通過一些定制化的調(diào)優(yōu)可以達到比較好的弱網(wǎng)優(yōu)化效果俭嘁。
優(yōu)點:
有更多的空間進行定制化優(yōu)化
缺點:
- 開發(fā)成本高
- 對CDN不友好,需要自建CDN或者和CDN達成協(xié)議
CDN分發(fā)
CDN即內(nèi)容分發(fā)網(wǎng)絡拐云,是一個策略型部署的整理系統(tǒng)近她,主要用來解決由于網(wǎng)絡帶寬小、用戶訪問量大薇缅、網(wǎng)點分布不均勻等造成的用戶訪問網(wǎng)絡速度慢的問題泳桦。簡單理解就是相當于讓計算機選擇最優(yōu)網(wǎng)絡娩缰。具體實現(xiàn)是通過在現(xiàn)有的網(wǎng)絡中增加一層新的網(wǎng)絡架構(gòu),將網(wǎng)站內(nèi)容發(fā)布到離用戶最近的網(wǎng)絡節(jié)點上梧奢。這樣用戶可以就近獲取所需內(nèi)容,解決之前的網(wǎng)絡擁塞趋惨。訪問延時高的問題惦蚊,提高用戶體驗。
CDN主要包含源站兆沙、緩存服務器莉掂、智能DNS、客戶端等幾個主要組成部分库正。
整個流程如下
主播進行直播厘唾,向智能DNS發(fā)送解析請求;智能DNS返回最優(yōu)的CDN節(jié)點的IP地址喷楣;主播端采用音視頻數(shù)據(jù)鹤树,發(fā)送CDN節(jié)點铣焊,CDN節(jié)點進行緩存處理粗截;觀眾要觀看這個主播的視頻熊昌,向智能DNS發(fā)送解析請求,智能DNS返回最優(yōu)CDN節(jié)點的IP地址婿屹;觀眾向CDN節(jié)點請求音視頻數(shù)據(jù)昂利;CDN節(jié)點同步其他節(jié)點的音視頻數(shù)據(jù);CDN節(jié)點將音視頻發(fā)給觀眾犁苏。
CDN缺點
播放延時:從主播端采集到觀眾播放之間的時間差扩所。
網(wǎng)絡抖動:數(shù)據(jù)包的到達順序,間隔等與發(fā)出時不一致助赞。
網(wǎng)絡丟包:當網(wǎng)絡中丟包率開始升高時袁勺,重傳會導致延時不斷增大,甚至導致不斷嘗試重連等情況群叶,這樣不能有效緩存咐汞,在嚴重情況下會導致用戶端無法觀看視頻。
拉流
根據(jù)協(xié)議類型(如RTMP,RTP约炎,HTTP等)與服務器建立連接并接受數(shù)據(jù)。
播放流數(shù)據(jù)
播放流數(shù)據(jù)掠手,一般涉及幾個過程喷鸽。首先進行access操作灸拍,也就是獲取數(shù)據(jù)流;然后進行demux操作混槐,也就是解復用轩性,將數(shù)據(jù)流分離成音頻流和視頻流;接著將音頻流送入音頻解碼器悯嗓,將視頻流送入視頻解碼器;最后進行音視頻同步輸出芦圾。通常使用第三方播放器俄认。
end
文字來源《 Android 音視頻開發(fā)》-何俊林 著