1.直播app原理
直播原理:把主播錄制的視頻梗顺,推送到服務(wù)器,然后由服務(wù)器CDN分發(fā)給觀眾车摄。
2.直播app流程
簡(jiǎn)單的流程:采集->濾鏡處理->編碼->推流->CDN分發(fā)->拉流->解碼->播放
直播環(huán)節(jié):推流端(采集寺谤、美顏處理仑鸥、編碼、推流)变屁、服務(wù)端(轉(zhuǎn)碼眼俊、錄制、截圖)敞贡、播放端(拉流泵琳、解碼、渲染)誊役、互動(dòng)(聊天获列、點(diǎn)亮、禮物)
流程圖如下:
3.直播架構(gòu)
二蛔垢、直播基礎(chǔ)知識(shí)
1击孩、采集視頻、音頻
AVFoundation: AVFoundation是用來(lái)播放和創(chuàng)建基于時(shí)間的視聽(tīng)媒體的框架鹏漆,它提供了Objective-C接口來(lái)處理這些數(shù)據(jù)巩梢,比如創(chuàng)建、編輯艺玲、重新編碼括蝠、回放等。
2.視頻處理(美顏)
利用OpenGL ES開(kāi)源圖形嵌入式系統(tǒng)框架饭聚,對(duì)視頻幀進(jìn)行加工忌警,通過(guò)GPU渲染到屏幕,從而實(shí)現(xiàn)各種不同的視頻效果秒梳。一般情況下app的個(gè)各種美顏和視頻特效都是通過(guò)GPUImage這個(gè)框架實(shí)現(xiàn)的法绵。
相關(guān)視頻框架介紹
GPUImage:GPUImage是一個(gè)基于OpenGL ES的一個(gè)圖像視頻處理框架,封裝了多達(dá)120多種常見(jiàn)的濾鏡效果酪碘,同時(shí)也支持自定義編寫(xiě)濾鏡效果朋譬。
OpenGL(Open Graphics Library):是一個(gè)跨編程語(yǔ)言、跨平臺(tái)的編程接口規(guī)定的專業(yè)的圖形程序接口兴垦,是一個(gè)功能強(qiáng)大徙赢、調(diào)用方便的底層圖形庫(kù)。
OpenGL ES(OpenGL for Embedded Systems ):是OpenGL三維圖形API的子集探越,針對(duì)手機(jī)等嵌入式設(shè)備而設(shè)計(jì)狡赐。
3.視頻編碼解碼
視頻編碼框架
FFmpeg:是一個(gè)跨平臺(tái)開(kāi)源視頻框架,提供了視頻錄制扶关、轉(zhuǎn)換以及流化音視頻的解決方案阴汇,也就是視頻編碼数冬、解碼节槐、轉(zhuǎn)碼搀庶、轉(zhuǎn)流、播放等功能铜异。FFmpeg支持了幾乎所有音視頻編解碼哥倔、封裝格式以及播放協(xié)議。它包含非常先進(jìn)的了音頻揍庄、視頻編解碼庫(kù)libavcodec咆蒿,保證了編解碼的質(zhì)量。
ps:
1. X264:把視頻原數(shù)據(jù)YUV編碼壓縮成H.264格式蚂子;
2.VideoToolbox:蘋(píng)果自帶的視頻硬解碼和硬編碼API沃测;
3.AudioToolbox:蘋(píng)果自帶的音頻硬解碼和硬編碼API。
視頻編碼
視頻壓縮標(biāo)準(zhǔn):MPEG食茎、H.264等蒂破,對(duì)視頻進(jìn)行壓縮(視頻編碼)或者解壓縮(視頻解碼)的編碼技術(shù),主要是將視頻像素壓縮成為視頻碼流别渔,從而達(dá)到降低視頻數(shù)量的目的附迷。
1.MPEG:一種視頻壓縮方式,采用幀間壓縮哎媚,存儲(chǔ)連續(xù)幀之間有差別的地方達(dá)到較大的壓縮比喇伯;
2.H.264:一種視頻壓縮方式,采用事先預(yù)測(cè)和與MPEG中的P-B幀一樣的幀間預(yù)測(cè)方法壓縮拨与,可以根據(jù)需要產(chǎn)生適合網(wǎng)絡(luò)情況傳輸?shù)囊曨l流稻据,有更高的壓縮比和更好的圖像質(zhì)量;
3.H.265:基于H.264的一種視頻壓縮方式截珍,保留原有的技術(shù)攀甚,并且對(duì)一些技術(shù)進(jìn)行優(yōu)化以改善碼流、編碼質(zhì)量岗喉、延時(shí)和算法復(fù)雜度之間的關(guān)系秋度。
音頻編碼
AAC、mp3:對(duì)音頻壓縮的音頻編碼技術(shù)钱床。
碼率控制
多碼率:根據(jù)用戶當(dāng)前網(wǎng)絡(luò)環(huán)境自定義碼率荚斯,例如視頻播放軟件中的1024、720查牌、高清事期、標(biāo)清、流暢等就是碼率纸颜。
視頻封裝格式
TS:流媒體封裝格式兽泣,流媒體封裝格式的好處就是不需要加載索引再播放,大大減少了首次載入的延遲胁孙。
FLV:流媒體封裝格式唠倦,由于其形成的文件極小称鳞、加載速度極快,使其成為當(dāng)前主流視頻格式稠鼻。
4.推流
librtmp:數(shù)據(jù)傳輸框架冈止,用來(lái)傳輸RTMP協(xié)議格式的數(shù)據(jù)
RTMP:流媒體數(shù)據(jù)傳輸協(xié)議,是Flash播放器和服務(wù)器之間音頻候齿、視頻和數(shù)據(jù)傳輸開(kāi)發(fā)的開(kāi)發(fā)協(xié)議熙暴,這個(gè)協(xié)議是建立在TCP協(xié)議或者輪訓(xùn)HTTP協(xié)議,主要用于對(duì)象慌盯、視頻周霉、音頻的傳輸。
5.流媒體服務(wù)器
SRS亚皂、BMS诗眨、nginx
5.1數(shù)據(jù)分發(fā)
CDN:(Content Delivery Network),內(nèi)容分發(fā)網(wǎng)絡(luò),是構(gòu)建在網(wǎng)絡(luò)之上的內(nèi)容分發(fā)網(wǎng)絡(luò)孕讳,依靠部署在各地的邊緣服務(wù)器匠楚,通過(guò)中心平臺(tái)的負(fù)載均衡、內(nèi)容分發(fā)厂财、調(diào)度等功能模塊芋簿,使用戶就近獲取所需內(nèi)容,降低網(wǎng)絡(luò)擁塞璃饱,提高用戶訪問(wèn)響應(yīng)速度和命中率与斤。
6.拉流
直播協(xié)議
RTMP、RTSP:即時(shí)要求較高或有互動(dòng)需求
HLS:有回放或者跨平臺(tái)需求
對(duì)比:
HLS是Apple公司定義的用于實(shí)時(shí)流傳輸?shù)膮f(xié)議荚恶,HLS協(xié)議基于HTTP協(xié)議實(shí)現(xiàn)撩穿,可實(shí)現(xiàn)流媒體的直播和點(diǎn)播,主要用于iOS系統(tǒng)谒撼。HLS的自適應(yīng)碼率流播食寡,客戶端可以根據(jù)網(wǎng)絡(luò)狀況自動(dòng)選擇不同碼率的視頻流,保證了移動(dòng)設(shè)備網(wǎng)絡(luò)狀況不穩(wěn)定的條件下流暢播放廓潜。
RTSP:
實(shí)時(shí)流傳輸協(xié)議抵皱,該協(xié)議定義了一對(duì)多應(yīng)用程序如何有效地通過(guò)IP網(wǎng)絡(luò)傳送多媒體數(shù)據(jù)。HTTP與RTSP相比辩蛋,HTTP請(qǐng)求由客戶機(jī)發(fā)出呻畸,服務(wù)器作出響應(yīng);使用RTSP時(shí)悼院,客戶機(jī)和服務(wù)器都可以發(fā)出請(qǐng)求伤为,即RTSP可以是雙向的。
HTTP-FLV:基于HTTP協(xié)議的流式傳輸協(xié)議
7.解碼
硬解碼:使用GPU來(lái)解碼据途,減少CPU運(yùn)算绞愚。播放流暢剑鞍、解碼速度快,但兼容性不好爽醋。
軟解碼:使用CPU來(lái)解碼。兼容性好便脊,但加大CPU負(fù)擔(dān)蚂四,功耗大,解碼速度慢哪痰,沒(méi)有硬解碼流暢遂赠。
8.播放
使用ijkplayer這個(gè)基于FFmpeg的開(kāi)源視頻播放器,iOS晌杰、Android都可集成跷睦,使用簡(jiǎn)單,使用指定拉流URL肋演,自動(dòng)解碼播放抑诸。
9.聊天
IM即時(shí)通訊,在直播中主要是觀眾與主播間的文字互動(dòng)爹殊。
第三方SDK:融云蜕乡、 騰訊云都提供了即時(shí)通訊的SDK,實(shí)現(xiàn)直播聊天的功能。
10.第三方直播SDK
七牛云梗夸、網(wǎng)易視頻云提供了全球化直播流服務(wù)层玲,提供穩(wěn)定流暢、低耗時(shí)反症、高并發(fā)的實(shí)時(shí)音頻服務(wù)辛块,可將視頻直播快速集成到自己的app當(dāng)中。
ps:
mac測(cè)試服務(wù)器:采用nginx+rtmp搭建铅碍,地址:http://www.reibang.com/p/a0397c98d907润绵。
拉流端:bilibili站有一個(gè)開(kāi)源項(xiàng)目叫ijkplayer,用起來(lái)很不錯(cuò)胞谈,地址:https://github.com/Bilibili/ijkplayer授药。
參考文獻(xiàn)
http://blog.csdn.net/leixiaohua1020/article/details/15814587
http://www.reibang.com/p/bd42bacbe4cc