DEV Club 分享筆記(視屏直播)

???? 首先,要感謝 DEV Club 能給我一個(gè)這么好的平臺(tái),在那里學(xué)到大牛們分享的技術(shù).這次感謝的是呂鳴,呂哥的這么好的分享.從中學(xué)到很多,在這做個(gè)摘抄筆記.這是呂哥的博客,大家可以去學(xué)習(xí)哦! http://www.nihaoshijie.com.cn

1.移動(dòng)視頻直播的發(fā)展,大家看下面這張圖

移動(dòng)視屏直播發(fā)展.png

????可以看到,直播從PC到一直發(fā)展到移動(dòng)端,越來(lái)越多的直播類app上線坞嘀,同時(shí)移動(dòng)直播進(jìn)入了前所未有的爆發(fā)階段,但是對(duì)于大多數(shù)移動(dòng)直播來(lái)說(shuō),還是要以Native客戶端實(shí)現(xiàn)為主,但是H5在移動(dòng)直播端也承載著不可替代的作用,例如H5有著傳播快旭咽,易發(fā)布的優(yōu)勢(shì)贞奋,同時(shí)最為關(guān)鍵的時(shí)H5同樣可以播放直播視頻。大家可以看下面這張大概的實(shí)現(xiàn)圖


![直播大致流程.jpeg](http://upload-images.jianshu.io/upload_images/1242073-7be821b8ddb7d0a8.jpeg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

完整的直播可以分為以下幾塊:
1) 視頻錄制端:一般是電腦上的音視頻輸入設(shè)備或者手機(jī)端的攝像頭或者麥克風(fēng)穷绵,目前以移動(dòng)端的手機(jī)視頻為主轿塔。
2) 視頻播放端:可以是電腦上的播放器,手機(jī)端的native播放器仲墨,還有就是h5的video標(biāo)簽等勾缭,目前還是已手機(jī)端的native播放器為主。
3) 視頻服務(wù)器端:一般是一臺(tái)nginx服務(wù)器目养,用來(lái)接受視頻錄制端提供的視頻源俩由,同時(shí)提供給視頻播放端流服務(wù)。
大家可以看下大致的結(jié)構(gòu)圖:


直播大致流程.jpeg

2.怎樣使用H5錄制視頻:

????對(duì)于H5視頻錄制癌蚁,可以使用強(qiáng)大的webRTC(Web Real-Time Communication)是一個(gè)支持網(wǎng)頁(yè)瀏覽器進(jìn)行實(shí)時(shí)語(yǔ)音對(duì)話或視頻對(duì)話的技術(shù)幻梯,缺點(diǎn)是只在PC的chrome上支持較好,移動(dòng)端支持不太理想努释。使用webRTC錄制視頻基本流程是:
1)調(diào)用window.navigator.webkitGetUserMedia()獲取用戶的PC攝像頭視頻數(shù)據(jù)碘梢。
2)將獲取到視頻流數(shù)據(jù)轉(zhuǎn)換成window.webkitRTCPeerConnection(一種視頻流數(shù)據(jù)格式)苗胀。
3)利用webscoket將視頻流數(shù)據(jù)傳輸?shù)椒?wù)端
由于許多方法都要加上瀏覽器前綴忠寻,所以很多移動(dòng)端的瀏覽器還不支持webRTC,所以真正的視頻錄制還是要靠客戶端(ios,android)來(lái)實(shí)現(xiàn),效果會(huì)好一些聋迎。

3.H5播放直播視頻:

????對(duì)于視頻播放,可以使用HLS(HTTP Live Streaming)協(xié)議播放直播流恩沛,ios和android都天然支持這種協(xié)議在扰,配置簡(jiǎn)單,直接使用video標(biāo)簽即可复唤。
下面是簡(jiǎn)單的代碼使用video播放直播視頻:


video標(biāo)簽.jpeg

4.下面說(shuō)一下什么是HLS協(xié)議:

????簡(jiǎn)單講就是把整個(gè)流分成一個(gè)個(gè)小的健田,基于HTTP的文件來(lái)下載,每次只下載一些佛纫,前面提到了用于H5播放直播視頻時(shí)引入的一個(gè).m3u8的文件妓局,這個(gè)文件就是基于HLS協(xié)議,存放視頻流元數(shù)據(jù)的文件呈宇。
每一個(gè).m3u8文件好爬,分別對(duì)應(yīng)若干個(gè)ts文件,這些ts文件才是真正存放視頻的數(shù)據(jù)甥啄,m3u8文件只是存放了一些ts文件的配置信息和相關(guān)路徑存炮,當(dāng)視頻播放時(shí),.m3u8是動(dòng)態(tài)改變的蜈漓,video標(biāo)簽會(huì)解析這個(gè)文件穆桂,并找到對(duì)應(yīng)的ts文件來(lái)播放,所以一般為了加快速度融虽,.m3u8放在web服務(wù)器上享完,ts文件放在cdn上。
.m3u8文件有额,其實(shí)就是以UTF-8編碼的m3u文件般又,這個(gè)文件本身不能播放,只是存放了播放信息的文本文件巍佑,打開(kāi)之后就是這個(gè)樣子


這是. m3u8文件.jpeg

這個(gè)是ts文件茴迁,就是存放視頻的文件:


這是 ts 文件.jpeg

5.接下來(lái)是HLS的請(qǐng)求流程:

 1) http請(qǐng)求m3u8的url。
 2) 服務(wù)端返回一個(gè)m3u8的播放列表萤衰,這個(gè)播放列表是實(shí)時(shí)更新的堕义,一般一次給出5段數(shù)據(jù)的url。
 3) 客戶端解析m3u8的播放列表脆栋,再按序請(qǐng)求每一段的url胳螟,獲取ts數(shù)據(jù)流。
 大概是這個(gè)流程:
文件獲取過(guò)程.jpeg

6.關(guān)于HLS直播延時(shí):

????更多關(guān)于延遲的問(wèn)題可以參考蘋(píng)果官方地址:https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/StreamingMediaGuide/FrequentlyAskedQuestions/FrequentlyAskedQuestions.html
但是H5直播視頻卻有一些不可替代的優(yōu)勢(shì):
1)傳播性好筹吐,利于分享等操作糖耸。
2)可以動(dòng)態(tài)發(fā)布,有利于實(shí)時(shí)迭代產(chǎn)品需求并迅速上線丘薛。
3)不用安裝app嘉竟,直接打開(kāi)瀏覽器即可

7.下面說(shuō)一下怎樣利用ios來(lái)采集(錄制)音視頻數(shù)據(jù)

????關(guān)于音視頻采集錄制,首先明確下面幾個(gè)概念:
????視頻編碼:所謂視頻編碼就是指通過(guò)特定的壓縮技術(shù),將某個(gè)視頻格式的文件轉(zhuǎn)換成另一種視頻格式文件的方式舍扰,我們使用的iphone錄制的視頻倦蚪,必須要經(jīng)過(guò)編碼,上傳边苹,解碼陵且,才能真正的在用戶端的播放器里播放。
????編解碼標(biāo)準(zhǔn):視頻流傳輸中最為重要的編解碼標(biāo)準(zhǔn)有國(guó)際電聯(lián)的H.261个束、H.263慕购、H.264,其中HLS協(xié)議支持H.264格式的編碼茬底。
音頻編碼:同視頻編碼類似沪悲,將原始的音頻流按照一定的標(biāo)準(zhǔn)進(jìn)行編碼,上傳阱表,解碼殿如,同時(shí)在播放器里播放,當(dāng)然音頻也有許多編碼標(biāo)準(zhǔn)最爬,例如PCM編碼涉馁,WMA編碼,AAC編碼等等爱致,這里我們HLS協(xié)議支持的音頻編碼方式是AAC編碼烤送。
利用ios上的攝像頭,進(jìn)行音視頻的數(shù)據(jù)采集蒜鸡,主要分為以下幾個(gè)步驟:
1) 音視頻的采集胯努,ios中牢裳,利用AVCaptureSession和AVCaptureDevice可以采集到原始的音視頻數(shù)據(jù)流逢防。
2) 對(duì)視頻進(jìn)行H264編碼,對(duì)音頻進(jìn)行AAC編碼蒲讯,在ios中分別有已經(jīng)封裝好的編碼庫(kù)來(lái)實(shí)現(xiàn)對(duì)音視頻的編碼忘朝。
3) 對(duì)編碼后的音、視頻數(shù)據(jù)進(jìn)行組裝封包判帮;
4) 建立RTMP連接并上推到服務(wù)端局嘁。
下面是具體的采集音視頻數(shù)據(jù)的流程:


音頻采集流程.jpeg

8.關(guān)于RTMP:

????Real Time Messaging Protocol(簡(jiǎn)稱 RTMP)是 Macromedia 開(kāi)發(fā)的一套視頻直播協(xié)議,現(xiàn)在屬于 Adobe晦墙。和HLS一樣都可以應(yīng)用于視頻直播悦昵,區(qū)別是RTMP基于flash無(wú)法在ios的瀏覽器里播放,但是實(shí)時(shí)性比HLS要好晌畅。所以一般使用這種協(xié)議來(lái)上傳視頻流但指,也就是視頻流推送到服務(wù)器。
下面是HLS和RTMP的對(duì)比:


HLS 和 RTMP 對(duì)比.jpeg

9.下面說(shuō)一下推流

????所謂推流,就是將我們已經(jīng)編碼好的音視頻數(shù)據(jù)發(fā)往視頻流服務(wù)器中棋凳,在ios代碼里面一般常用的是使用rtmp推流拦坠,可以使用第三方庫(kù)librtmp-iOS進(jìn)行推流,librtmp封裝了一些核心的api供使用者調(diào)用剩岳。例如推流api等等贞滨,配置服務(wù)器地址,即可將轉(zhuǎn)碼后的視頻流推往服務(wù)器拍棕。
那么如何搭建一個(gè)推流服務(wù)器呢
簡(jiǎn)單的推流服務(wù)器搭建晓铆,由于我們上傳的視頻流都是基于rtmp協(xié)議的,所以服務(wù)器也必須要支持rtmp才行莫湘,大概需要以下幾個(gè)步驟:
1) 安裝一臺(tái)nginx服務(wù)器尤蒿。
2) 安裝nginx的rtmp擴(kuò)展,目前使用比較多的是https://github.com/arut/nginx-rtmp-module
3) 配置nginx的conf文件

nginx 配置文件.jpeg

4) 重啟nginx幅垮,將rtmp的推流地址寫(xiě)為rtmp://ip:1935/hls/mystream腰池,其中hls_path表示生成的.m3u8和ts文件所存放的地址,hls_fragment表示切片時(shí)長(zhǎng)忙芒,mysteam表示一個(gè)實(shí)例示弓,即將來(lái)要生成的文件名可以先自己隨便設(shè)置一個(gè)。更多配置可以參考:https://github.com/arut/nginx-rtmp-module/wiki/
下面是nginx的配置文件

10.直播中的用戶交互:

????對(duì)于直播中的用戶交互大致可以分為:
1)送禮物
2)發(fā)表評(píng)論或者彈幕
對(duì)于彈幕來(lái)說(shuō)呵萨,要稍微復(fù)雜一些奏属,可能需要關(guān)注以下幾點(diǎn):
對(duì)于送禮物,在H5端可以利用dom和css3實(shí)現(xiàn)送禮物邏輯和一些特殊的禮物動(dòng)畫(huà)潮峦,實(shí)現(xiàn)技術(shù)難點(diǎn)不大囱皿。
1) 彈幕實(shí)時(shí)性,可以利用webscoket來(lái)實(shí)時(shí)發(fā)送和接收新的彈幕并渲染出來(lái)忱嘹。
3) 對(duì)于不支持webscoket的瀏覽器來(lái)說(shuō)嘱腥,只能降級(jí)為長(zhǎng)輪詢或者前端定時(shí)器發(fā)送請(qǐng)求來(lái)獲取實(shí)時(shí)彈幕。
3)彈幕渲染時(shí)的動(dòng)畫(huà)和碰撞檢測(cè)(即彈幕不重疊)等等
11.最后講一下目前較為成熟的直播產(chǎn)品拘悦,大致都是以server端和H5和Native(android,ios)搭配實(shí)現(xiàn)直播:
基本是下圖這個(gè)套路:

實(shí)現(xiàn)直播套路.jpeg

所以H5在整個(gè)直播中齿兔,還是有著重要的地位的!
最后础米,根據(jù)本次分享的內(nèi)容分苇,呂哥這邊實(shí)現(xiàn)了一個(gè)ios端錄制,推流屁桑,NGINX接收流医寿,同時(shí)分發(fā)的HLS直播流的一整套demo,感興趣的同學(xué)可以看下面這個(gè)鏈接https://github.com/lvming6816077/LMVideoTest
下面互動(dòng)問(wèn)答:
A0:移動(dòng)端這邊怎么進(jìn)行編碼轉(zhuǎn)碼蘑斧?用ffmpeg編譯時(shí)很麻煩
答:關(guān)于ios這邊靖秩,其實(shí)不用關(guān)心轉(zhuǎn)碼問(wèn)題艾帐,因?yàn)橐呀?jīng)有了很多開(kāi)源的庫(kù)提供給我們了例如x264編碼:https://github.com/kewlbear/x264-ios
faac編碼:https://github.com/fflydev/faac-ios-build
A1.您介紹的都是native 播放和還有 h5的 video 標(biāo)簽播放, iOS端有沒(méi)有考慮過(guò)整個(gè)用原生的 oc或者 swift 實(shí)現(xiàn)?
答:關(guān)于播放端,其實(shí)真正體驗(yàn)好的還是要用native來(lái)實(shí)現(xiàn)的盆偿,而且native實(shí)現(xiàn)可以用rtmp來(lái)播放直播柒爸,延遲會(huì)好很多,H5來(lái)播直播主要是考慮到易傳播性好事扭。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末捎稚,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子求橄,更是在濱河造成了極大的恐慌今野,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,185評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件罐农,死亡現(xiàn)場(chǎng)離奇詭異条霜,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)涵亏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門(mén)宰睡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人气筋,你說(shuō)我怎么就攤上這事拆内。” “怎么了宠默?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,524評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵麸恍,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我搀矫,道長(zhǎng)抹沪,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,339評(píng)論 1 293
  • 正文 為了忘掉前任瓤球,我火速辦了婚禮融欧,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘冰垄。我一直安慰自己蹬癌,他們只是感情好权她,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評(píng)論 6 391
  • 文/花漫 我一把揭開(kāi)白布虹茶。 她就那樣靜靜地躺著,像睡著了一般隅要。 火紅的嫁衣襯著肌膚如雪蝴罪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,287評(píng)論 1 301
  • 那天步清,我揣著相機(jī)與錄音要门,去河邊找鬼虏肾。 笑死,一個(gè)胖子當(dāng)著我的面吹牛欢搜,可吹牛的內(nèi)容都是我干的封豪。 我是一名探鬼主播,決...
    沈念sama閱讀 40,130評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼炒瘟,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼吹埠!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起疮装,我...
    開(kāi)封第一講書(shū)人閱讀 38,985評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤缘琅,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后廓推,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體刷袍,經(jīng)...
    沈念sama閱讀 45,420評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評(píng)論 3 334
  • 正文 我和宋清朗相戀三年樊展,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了呻纹。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,779評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡专缠,死狀恐怖居暖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情藤肢,我是刑警寧澤太闺,帶...
    沈念sama閱讀 35,477評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站嘁圈,受9級(jí)特大地震影響省骂,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜最住,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評(píng)論 3 328
  • 文/蒙蒙 一钞澳、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧涨缚,春花似錦轧粟、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,716評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至茂翔,卻和暖如春混蔼,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背珊燎。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,857評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工惭嚣, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留遵湖,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,876評(píng)論 2 370
  • 正文 我出身青樓晚吞,卻偏偏與公主長(zhǎng)得像延旧,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子槽地,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容