原理篇
直播模型及其實(shí)現(xiàn)
一個(gè)通用的直播模型一般包括三個(gè)模塊:主播方、服務(wù)器端和播放端。
首先是主播方态蒂,它是產(chǎn)生視頻流的源頭,由一系列流程組成:第一掺逼,通過一定的設(shè)備來采集數(shù)據(jù)吃媒;第二瓤介,將采集的這些視頻進(jìn)行一系列的處理吕喘,比如水印、美顏和特效濾鏡等處理刑桑;第三氯质,將處理后的結(jié)果視頻編碼壓縮成可觀看可傳輸?shù)囊曨l流;第四祠斧,分發(fā)推流闻察,即將壓縮后的視頻流通過網(wǎng)絡(luò)通道傳輸出去赐写。
其次是播放端览濒,播放端功能有兩個(gè)層面,第一個(gè)層面是關(guān)鍵性的需求尼摹;另一層面是業(yè)務(wù)層面的吴超。先看第一個(gè)層面钉嘹,它涉及到一些非常關(guān)鍵的指標(biāo),比如秒開鲸阻,在很多場(chǎng)景當(dāng)中都有這樣的要求跋涣,然后是對(duì)于一些重要內(nèi)容的版權(quán)保護(hù)。為了達(dá)到更好的效果鸟悴,我們還需要配合服務(wù)端做智能解析陈辱,這在某些場(chǎng)景下也是關(guān)鍵性需求。再來看第二個(gè)層面也即業(yè)務(wù)層面的功能细诸,對(duì)于一個(gè)社交直播產(chǎn)品來說沛贪,在播放端,觀眾希望能夠?qū)崟r(shí)的看到主播端推過來的視頻流震贵,并且和主播以及其他觀眾產(chǎn)生一定的互動(dòng)利赋,因此它可能包含一些像點(diǎn)贊、聊天和彈幕這樣的功能屏歹,以及禮物這樣更高級(jí)的道具隐砸。
直播服務(wù)器端提供的最核心功能是收集主播端的視頻推流,并將其放大后推送給所有觀眾端蝙眶。除了這個(gè)核心功能季希,還有很多運(yùn)營級(jí)別的訴求褪那,比如鑒權(quán)認(rèn)證,視頻連線和實(shí)時(shí)轉(zhuǎn)碼式塌,自動(dòng)鑒黃博敬,多屏合一,以及云端錄制存儲(chǔ)等功能峰尝。另外偏窝,對(duì)于一個(gè)主播端推出的視頻流,中間需要經(jīng)過一些環(huán)節(jié)才能到達(dá)播放端武学,因此對(duì)中間環(huán)節(jié)的質(zhì)量進(jìn)行監(jiān)控祭往,以及根據(jù)這些監(jiān)控來進(jìn)行智能調(diào)度,也是非常重要的訴求火窒。
實(shí)際上無論是主播端還是播放端硼补,他們的訴求都不會(huì)僅僅是拍攝視頻和播放視頻這么簡(jiǎn)單。在這個(gè)核心訴求被滿足之后熏矿,還有很多關(guān)鍵訴求需要被滿足已骇。比如,對(duì)于一個(gè)消費(fèi)級(jí)的直播產(chǎn)品來說票编,除了這三大模塊之外褪储,還需要實(shí)現(xiàn)一個(gè)業(yè)務(wù)服務(wù)端來進(jìn)行推流和播放控制,以及所有用戶狀態(tài)的維持慧域。如此鲤竹,就構(gòu)成了一個(gè)消費(fèi)級(jí)可用的直播產(chǎn)品。
思路篇
錄制->編碼->網(wǎng)絡(luò)傳輸->解碼->播放
以上為直播的整體流程吊趾,根據(jù)該流程分為以下技術(shù)點(diǎn):
怎樣錄制直播視頻(流媒體源/編碼/封裝)
怎樣實(shí)時(shí)上傳直播視頻(視頻推流: 如何推/往哪里推/推流服務(wù)器)
怎樣播放直播視頻(如何看: HLS/rtmp/flv)
直播間的用戶是如何交互(送禮物/聊天室/彈幕)
正如 @姚冬 所說,一個(gè)完整的直播系統(tǒng)大致包含這幾個(gè)環(huán)節(jié):采集论泛、前處理揩尸、編碼、傳輸屁奏、解碼和渲染岩榆。在兩端傳輸?shù)倪^程中再加上一個(gè)服務(wù)端處理。大致的模型如下:
直播系統(tǒng)解決方案-搭建你自己的直播平臺(tái)
視頻采集與編碼:JavaCVFFmpeg
直播流服務(wù)器:SRS
播放器: 網(wǎng)頁端Video.js安卓端Vitamio
實(shí)踐篇
如何快速的開發(fā)一個(gè)完整的iOS直播app 原理篇/播放篇/采集篇/美顏篇
直播難:個(gè)人認(rèn)為要想把直播從零開始做出來坟瓢,絕對(duì)是牛逼中的牛逼勇边,大牛中的大牛,因?yàn)橹辈ブ羞\(yùn)用到的技術(shù)難點(diǎn)非常之多折联,視頻/音頻處理粒褒,圖形處理,視頻/音頻壓縮诚镰,CDN分發(fā)奕坟,即時(shí)通訊等技術(shù)祥款,每一個(gè)技術(shù)都?jí)蚰銓W(xué)幾年的。
直播易:已經(jīng)有各個(gè)領(lǐng)域的大牛月杉,封裝好了許多牛逼的框架刃跛,我們只需要用別人寫好的框架,就能快速的搭建一個(gè)直播app苛萎,也就是傳說中的站在大牛肩膀上編程桨昙。
一個(gè)完整直播app功能
聊天/禮物/直播列表/自己直播/房間邏輯/用戶邏輯/觀看直播/統(tǒng)計(jì)/超管
一個(gè)完整直播app原理
直播原理:把主播錄制的視頻,推送到服務(wù)器腌歉,在由服務(wù)器分發(fā)給觀眾觀看蛙酪。
直播環(huán)節(jié):推流端(采集、美顏處理究履、編碼滤否、推流)、服務(wù)端處理(轉(zhuǎn)碼最仑、錄制、截圖炊甲、鑒黃)泥彤、播放器(拉流、解碼卿啡、渲染)吟吝、互動(dòng)系統(tǒng)(聊天室、禮物系統(tǒng)颈娜、贊)
一個(gè)完整直播app實(shí)現(xiàn)流程
采集/濾鏡處理/編碼/推流/CDN分發(fā)/拉流/解碼/播放/聊天互動(dòng)
一個(gè)完整直播app架構(gòu)
一個(gè)完整直播app技術(shù)點(diǎn)
如何快速的開發(fā)一個(gè)完整的iOS直播app
利用第三方直播SDK快速的開發(fā)
直播功能:自研還是使用第三方直播SDK開發(fā)剑逃?
第三方SDK開發(fā): 對(duì)于一個(gè)初創(chuàng)團(tuán)隊(duì)來講,自研直播不管在技術(shù)門檻官辽、CDN蛹磺、帶寬上都是有很大的門檻的,而且需要耗費(fèi)大量的時(shí)間才能做出成品同仆,不利于拉投資萤捆。
自研:公司直播平臺(tái)大,從長遠(yuǎn)看俗批,自研可以節(jié)省成本俗或,技術(shù)成面比直接用SDK可控多了。
第三方SDK好處
降低成本/提升效率/降低風(fēng)險(xiǎn)/專業(yè)的事岁忘,找專業(yè)的人來做
技術(shù)實(shí)現(xiàn)層面
技術(shù)相對(duì)都比較成熟,設(shè)備也都支持硬編碼
github上有現(xiàn)成的開源實(shí)現(xiàn)干像,推流帅腌、美顏辱志、水印、彈幕狞膘、點(diǎn)贊動(dòng)畫揩懒、濾鏡、播放都有挽封。技術(shù)其實(shí)不是很難已球,而且現(xiàn)在很多云廠商都提供SDK,七牛云辅愿、金山云智亮、樂視云、騰訊云点待、百度云阔蛉、斗魚直播伴侶推流端,功能幾乎都是一樣的癞埠,沒啥亮點(diǎn)状原,不同的是整個(gè)直播平臺(tái)服務(wù)差異和接入的簡(jiǎn)易性。后端現(xiàn)在 RTMP/HTTP-FLV 清一色苗踪,App掛個(gè)源站直接接入云廠商或CDN就OK颠区。
運(yùn)營成本和客戶體驗(yàn)
根據(jù)網(wǎng)上的數(shù)據(jù),斗魚 TV 為 3 億人民幣通铲,戰(zhàn)旗 TV 為 1.5 億人民幣毕莱,龍珠為 1.2 億人民幣,虎牙為 3000 萬 + 人民幣颅夺。
項(xiàng)目搭建
流媒體傳輸: RTMP
美顏:BeautifyFace
技術(shù)坑 : 降噪, 音頻解碼器, 藍(lán)牙適配, 回聲消除, 信令控制, 登錄, 鑒權(quán), 權(quán)限管理, 狀態(tài)管理, 應(yīng)用消息, 消息推送, 禮物系統(tǒng), 即時(shí)聊天, 支付系統(tǒng), 統(tǒng)計(jì)系統(tǒng), 數(shù)據(jù)庫, 緩存, 分布式文件存儲(chǔ), 消息隊(duì)列, 運(yùn)維系統(tǒng)等等大小不一的坑等你來填!!!
資金坑 :以帶寬為例, 2萬人同時(shí)在線, 手機(jī)碼率在600KB, 每個(gè)月的帶寬費(fèi)用至少在30萬左右. 根據(jù)歡聚時(shí)代(YY)15年四季度財(cái)務(wù)報(bào), 他們的帶寬成本為人民幣1.611億元, 折合每月5000萬+. 人力成本+渠道支出和其他支出就不詳談了.
社會(huì)坑: 還得每時(shí)每刻與各種黑暗勢(shì)力斗爭(zhēng), 包括色情, 廣告, 刷小號(hào), 刷充值, 告侵權(quán), DDos...(我反編譯喵播的官方APP, 他們的項(xiàng)目名就叫Shehui, O(∩_∩)O哈哈~)
LaiFeng-Android/SopCastComponent
來瘋直播安卓控件朋截,支持flv,支持rtmp吧黄,支持添加視頻特效等等
整個(gè)項(xiàng)目完成了采集部服、 視音頻處理、編碼稚字、數(shù)據(jù)發(fā)送前處理饲宿、數(shù)據(jù)發(fā)送的功能。整個(gè)項(xiàng)目支持flv封包胆描,rtmp上傳
LaiFeng IOS Live Kit,H264 and AAC Hard coding瘫想,support GPUImage Beauty, rtmp transmission昌讲,weak network lost frame国夜,Dynamic switching rate
方案篇
各種云廠商提供的直播云解決方案
視頻直播
聊天互動(dòng)
主播端/觀眾端
前端篇
對(duì)于視頻播放,可以使用 HLS(HTTP Live Streaming)協(xié)議播放直播流短绸, ios 和 android 都天然支持這種協(xié)議车吹,配置簡(jiǎn)單筹裕,直接使用 video 標(biāo)簽即可。
到底什么是HLS協(xié)議窄驹?
簡(jiǎn)單講就是把整個(gè)流分成一個(gè)個(gè)小的朝卒,基于HTTP的文件來下載,每次只下載一些乐埠,前面提到了用于H5播放直播視頻時(shí)引入的一個(gè).m3u8(extended M3U playlist)的文件抗斤,這個(gè)文件就是基于HLS協(xié)議,存放視頻流元數(shù)據(jù)的文件丈咐。
H5直播起航 | Aotu.io「凹凸實(shí)驗(yàn)室」
WEB 上主流的視頻直播方案有 HLS 和 RTMP瑞眼,移動(dòng) WEB 端目前以 HLS 為主(HLS存在延遲性問題,也可以借助 video.js 采用RTMP)棵逊,PC端則以 RTMP 為主實(shí)時(shí)性較好
移動(dòng)端 iOS 和 Android 都天然支持HLS協(xié)議伤疙,做好視頻采集端、視頻流推流服務(wù)之后辆影,便可以直接在H5頁面配置 video 標(biāo)簽播放直播視頻, HLS 在 PC 端僅支持safari瀏覽器徒像,類似chrome瀏覽器使用HTML5 video標(biāo)簽無法播放 m3u8 格式,可直接采用網(wǎng)上一些比較成熟的方案
HTTP Live Streaming (HLS) has become a de-facto standard for streaming video on mobile devices thanks to its native support on iOS and Android. Unfortunately, all the major desktop browsers except for Safari are missing HLS support.
移動(dòng)端可直接通過標(biāo)簽來播放.m3u8格式的視頻:mobile-hls-video.html
PC端需要通過其他手段(例如 videojs-contrib-hls)來解碼.m3u8格式的視頻, 才能夠通過標(biāo)簽或者 flash 來播放:pc-hls-video.html
更多參考
fir.im Weekly - 揭秘直播移動(dòng) APP 技術(shù)實(shí)現(xiàn)
如何開發(fā)出一款仿映客直播APP項(xiàng)目實(shí)踐篇
總結(jié)
如果想最快的實(shí)現(xiàn)直播功能, 最好選用直播云, 因?yàn)槠涮峁┝送晟频?SDK, 從推流到流服務(wù)器再到最終的播放器, 一條龍服務(wù)下來.
如果想自己搭建整個(gè)一套, 技術(shù)選型可以參考
(主播)采集推流: iOSLaiFengiOS/LFLiveKitAndroidLaiFeng-Android/SopCastComponent
(上傳)流服務(wù)器:SRS
(觀眾)播放器: App 端Bilibili/ijkplayer網(wǎng)頁端Video.js
來自:https://github.com/f2e-journey/xueqianban/issues/61