轉(zhuǎn) 映客 LFLiveKit 推流

想做一套像映客的直播系統(tǒng)抚芦?

2016-07-07 22:19

一亮瓷、直播現(xiàn)狀簡介

想做一套像映客的直播系統(tǒng)颈抚?Linkee.10

1.技術(shù)實現(xiàn)層面:

技術(shù)相對都比較成熟读虏,設(shè)備也都支持硬編碼。IOS還提供現(xiàn)成的 Video ToolBox框架钠右,可以對攝像頭和流媒體數(shù)據(jù)結(jié)構(gòu)進行處理赋元,但Video ToolBox框架只兼容8.0以上版本,8.0以下就需要用x264的庫軟編了飒房。

github上有現(xiàn)成的開源實現(xiàn),推流媚值、美顏狠毯、水印、彈幕褥芒、點贊動畫嚼松、濾鏡、播放都有锰扶。技術(shù)其實不是很難献酗,而且現(xiàn)在很多云廠商都提供SDK,七牛云坷牛、金山云罕偎、樂視云、騰訊云京闰、百度云颜及、斗魚直播伴侶推流端,功能幾乎都是一樣的蹂楣,沒啥亮點俏站,不同的是整個直播平臺服務(wù)差異和接入的簡易性。后端現(xiàn)在 RTMP/HTTP-FLV 清一色痊土,App掛個源站直接接入云廠商或CDN就OK肄扎。想做一套像映客的直播系統(tǒng)?

2.直播優(yōu)化層面

其實最難的難點是提高首播時間、服務(wù)質(zhì)量即Qos(Quality of Service犯祠,服務(wù)質(zhì)量)萌丈,如何在丟包率20%的情況下還能保障穩(wěn)定、流暢的直播體驗雷则,需要考慮以下方案:

1.為加快首播時間辆雾,收流服務(wù)器主動推送 GOP :(Group of Pictures:策略影響編碼質(zhì)量)所謂GOP,意思是畫面組月劈,一個GOP就是一組連續(xù)的畫面至邊緣節(jié)點度迂,邊緣節(jié)點緩存 GOP,播放端則可以快速加載猜揪,減少回源延遲

想做一套像映客的直播系統(tǒng)惭墓?

GOP.1

2.GOP丟幀,為解決延時而姐,為什么會有延時腊凶,網(wǎng)絡(luò)抖動、網(wǎng)絡(luò)擁塞導(dǎo)致的數(shù)據(jù)發(fā)送不出去拴念,丟完之后所有的時間戳都要修改钧萍,切記,要不客戶端就會卡一個 GOP的時間政鼠,是由于 PTS(Presentation Time Stamp风瘦,PTS主要用于度量解碼后的視頻幀什么時候被顯示出來) 和 DTS 的原因,或者播放器修正 DTS 和 PTS 也行(推流端丟GOD更復(fù)雜公般,丟 p 幀之前的 i 幀會花屏)

想做一套像映客的直播系統(tǒng)万搔?

幀.2

3.純音頻丟幀,要解決音視頻不同步的問題官帘,要讓視頻的 delta增量到你丟掉音頻的delta之后瞬雹,再發(fā)音頻,要不就會音視頻不同步

4.源站主備切換和斷線重連

5.根據(jù)TCP擁塞窗口做智能調(diào)度刽虹,當(dāng)擁塞窗口過大說明節(jié)點服務(wù)質(zhì)量不佳酗捌,需要切換節(jié)點和故障排查

6.增加上行、下行帶寬探測接口状婶,當(dāng)帶寬不滿足時降低視頻質(zhì)量意敛,即降低碼率

7.定時獲取最優(yōu)的推流、拉流鏈路IP膛虫,盡可能保證提供最好的服務(wù)

8.監(jiān)控必須要草姻,監(jiān)控各個節(jié)點的Qos狀態(tài),來做整個平臺的資源配置優(yōu)化和調(diào)度

想做一套像映客的直播系統(tǒng)稍刀?

直播過程.3

9.如果產(chǎn)品從推流端撩独、CDN敞曹、播放器都是自家的,保障 Qos 優(yōu)勢非常大

10.當(dāng)直播量非常大時综膀,要加入集群管理和調(diào)度澳迫,保障 Qos

11.播放端通過增加延時來減少網(wǎng)絡(luò)抖動,通過快播來減少延時

3.運營成本和客戶體驗

根據(jù)網(wǎng)上的數(shù)據(jù)剧劝,斗魚 TV 為 3 億人民幣橄登,戰(zhàn)旗 TV 為 1.5 億人民幣,龍珠為 1.2 億人民幣讥此,虎牙為 3000 萬 + 人民幣拢锹。

運營和推廣:這個就比較燒錢了,一些做移動直播萄喳、游戲直播卒稳、秀場直播的A輪至少得上千萬。

用戶體驗:流暢他巨、不卡頓充坑、不花屏、斷線重連染突、丟包策略捻爷、首畫加載速度、豐富的禮物系統(tǒng)觉痛,為了提高用戶體驗役衡,可以在后臺加載其他頁面數(shù)據(jù),但要在用戶體驗和內(nèi)存優(yōu)化方面找到平衡點薪棒。

二、流媒體傳輸

1.TCP:TCP為點對點的協(xié)議榕莺,雖然能保證了數(shù)據(jù)傳輸?shù)目煽啃岳荆菍Ψ?wù)器資源耗費較大,在數(shù)據(jù)流大的場合難以保證數(shù)據(jù)流傳輸?shù)膶崟r性钉鸯。

2.UDP:UDP為不可靠傳輸協(xié)議吧史,不需要維護連接狀態(tài),也不認為每個數(shù)據(jù)包都必須到達接受端唠雕,因此網(wǎng)絡(luò)負荷比TCP小贸营,傳輸速度也要比TCP快;但在網(wǎng)絡(luò)越擁擠時岩睁,越有更多的數(shù)據(jù)包丟失钞脂。

3.RTMP:RTMP一個專門為高效傳輸視頻,音頻和數(shù)據(jù)而設(shè)計的協(xié)議捕儒。它通過建立一個二進制TCP連接或者連接HTTP隧道實現(xiàn)實時的視頻和聲音傳輸冰啃。

4.FFmpeg:FFmpeg是一套可以用來記錄邓夕、轉(zhuǎn)換數(shù)字音頻、視頻阎毅,并能將其轉(zhuǎn)化為流的開源計算機程序焚刚。采用LGPL或GPL許可證。它提供了錄制扇调、轉(zhuǎn)換以及流化音視頻的完整解決方案

想做一套像映客的直播系統(tǒng)矿咕?

協(xié)議差異.4

三、項目搭建:采集端

1.目前比較知名的有VideoCore

目前國內(nèi)很多知名的推流框架都是對VideoCore的二次開發(fā)狼钮。這個框架主要使用C++寫的碳柱,支持RTMP推流,但對于iOS開發(fā)者來說有點晦澀難懂(精通C++的除外)燃领。想開源和免費的可以選擇現(xiàn)在的幾個知名項目VideoCore + GPUImage+基于GPU的美顏濾鏡 ,播放用IJKPlayer自己修改士聪。

2.國內(nèi)比較火的LiveVideoCoreSDK

框架提供IOS蘋果手機的RTMP推流填寫RTMP服務(wù)地址,直接就可以進行推流猛蔽,SDK下載后簡單的工程配置后能直接運行剥悟,實現(xiàn)了美顏直播和濾鏡功能,基于OpenGL曼库,前后攝像頭隨時切換区岗,提供RTMP連接狀態(tài)的回調(diào)。

這個框架是國內(nèi)比較早的一款推流框架有不少在使用這個SDK毁枯,功能非常齊全慈缔,作者也比較牛,用來學(xué)習(xí)推流采集相關(guān)內(nèi)容非常好种玛,但是集成到工程中有些困難(對于我來說)藐鹤。總的來說這是一款非常厲害的推流SDK赂韵,幾乎全部使用C++寫的娱节,編譯效率非常好,如果有實力的話推薦使用這個框架來做自己項目的推流端祭示。

3.可讀性比較好的推流LFLiveKit

框架支持RTMP(Real Time Messaging Protocol ):實時消息傳輸協(xié)議肄满,Adobe公司的。

HlS (HTTP Live Streaming) :蘋果自家的動態(tài)碼率自適應(yīng)技術(shù)质涛。主要用于PC和Apple終端的音視頻服務(wù)稠歉。包括一個m3u(8)的索引文件,TS媒體分片文件和key加密串文件汇陆。

推薦這個框架第一是因為它主要使用OC寫的怒炸,剩下的用C語言寫的,框架文件十分清晰瞬测,這對不精通C++的初學(xué)者提供了很大的便利横媚,并且拓展性非常強纠炮,支持動態(tài)切換碼率功能,支持美顏功能灯蝴。

4.美顏功能

美顏的話一般都是使用的GPUImage基于OpenGl開發(fā)恢口,純OC語言,這個框架十分強大穷躁,可以做出各種不同濾鏡耕肩,可拓展性高。如果對美顏沒有具體思路可以直接用BeautifyFace问潭,可以加入到項目中猿诸,很方便的實現(xiàn)美顏效果。

四狡忙、項目具體搭建

1.如何實現(xiàn)美顏梳虽?

美顏功能使用的是BeautifyFace,它可以很快速的實現(xiàn)美顏功能灾茁,效果不錯窜觉,它的底層還是基于的GPUImage,對GPUImage十分喜愛的Developer北专,可以參照BeautifyFace禀挫,寫出一個屬于自己的美顏功能,并且添加各種濾鏡拓颓。

2.懸浮TabBar的實現(xiàn)

這個TabBar看著像是用自定義TabBar做的语婴,但事實上它還是用的系統(tǒng)的TabBar,給系統(tǒng)的tabBar.backgroundImage設(shè)置一張設(shè)計好的背景圖片。

想做一套像映客的直播系統(tǒng)驶睦?

TabBar.8

添加后會發(fā)現(xiàn)頂部有一條陰影線砰左,并且TabBar的高度也不夠。陰影線與上圖綠色線條之間變成了透明顏色场航,實現(xiàn)下面方法隱藏陰影線菜职,并且調(diào)高TabBar的高度。

想做一套像映客的直播系統(tǒng)旗闽?

TabBar.9

//隱藏陰影線

[[UITabBar appearance] setShadowImage:[UIImage new]];

- (void)setupTabBarBackgroundImage { UIImage *image = [UIImage imageNamed:@"tab_bg"]; CGFloat top = 40; // 頂端蓋高度

CGFloat bottom = 40 ; // 底端蓋高度

CGFloat left = 100; // 左端蓋寬度

CGFloat right = 100; // 右端蓋寬度

UIEdgeInsets insets = UIEdgeInsetsMake(top, left, bottom, right); // 指定為拉伸模式,伸縮后重新賦值

UIImage *TabBgImage = [image resizableImageWithCapInsets:insets resizingMode:UIImageResizingModeStretch]; self.tabBar.backgroundImage = TabBgImage;

[[UITabBar appearance] setShadowImage:[UIImage new]];

[[UITabBar appearance] setBackgroundImage:[[UIImage alloc]init]];

}//自定義TabBar高度- (void)viewWillLayoutSubviews { CGRect tabFrame = self.tabBar.frame;

tabFrame.size.height = 60;

tabFrame.origin.y = self.view.frame.size.height - 60; self.tabBar.frame = tabFrame;

}

3.播放端的實現(xiàn)

播放端用的針對RTMP優(yōu)化過的ijkplayer()蜜另,ijkplayer是基于FFmpeg的跨平臺播放器适室,這個開源項目已經(jīng)被多個 App 使用,其中映客举瑰、美拍和斗魚使用了 ijkplayer(5700+??) 。在本文的末未提供了,已經(jīng)打包好的ijkplayer厅各,直接拖入項目就可以使用。省去了編譯的過程(編譯十分麻煩旧巾,并且容易出錯)。

- (void)goPlaying { //獲取url

self.url = [NSURL URLWithString:_liveUrl];

_player = [[IJKFFMoviePlayerController alloc] initWithContentURL:self.url withOptions:nil]; UIView *playerview = [self.player view]; UIView *displayView = [[UIView alloc] initWithFrame:self.view.bounds]; self.PlayerView = displayView;

[self.view addSubview:self.PlayerView]; // 自動調(diào)整自己的寬度和高度

playerview.frame = self.PlayerView.bounds;

playerview.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;

[self.PlayerView insertSubview:playerview atIndex:1];

[_player setScalingMode:IJKMPMovieScalingModeAspectFill];

}

4.推送端的實現(xiàn)

使用的是LFLiveKit忍些,推流端可以選擇很多GitHub上的開源項目替代LFLiveKit鲁猩,比如上面所提到的VideoCore,和LiveVideoCoreSDK。商用的話可以選擇各大廠商的SDK罢坝,網(wǎng)易直播云廓握、七牛、騰訊嘁酿、百度隙券、新浪、其中金山直播云本人用過闹司。使用直播云的好處就是能快速上線App娱仔,功能十分齊全,可以播放器和推流端游桩,服務(wù)器一套下來牲迫,有專業(yè)客服人員幫助集成到工程中,缺點就是流量費太貴了众弓,具體可以了解下各大廠商的收費標準恩溅。

- (UIButton*)startLiveButton{ if(!_startLiveButton){

_startLiveButton = [UIButton new]; //位置

_startLiveButton.frame = CGRectMake((XJScreenW - 200) * 0.5, XJScreenH - 100, 200, 40);

_startLiveButton.layer.cornerRadius = _startLiveButton.frame.size.height * 0.5;

[_startLiveButton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];

[_startLiveButton.titleLabel setFont:[UIFont systemFontOfSize:16]];

[_startLiveButton setTitle:@"開始直播" forState:UIControlStateNormal];

[_startLiveButton setBackgroundColor:[UIColor grayColor]];

_startLiveButton.exclusiveTouch = YES;

__weak typeof(self) _self = self;

[_startLiveButton addBlockForControlEvents:UIControlEventTouchUpInside block:^(id sender) {

_self.startLiveButton.selected = !_self.startLiveButton.selected; if(_self.startLiveButton.selected){

[_self.startLiveButton setTitle:@"結(jié)束直播" forState:UIControlStateNormal];

LFLiveStreamInfo *stream = [LFLiveStreamInfo new];

stream.url = @"rtmp://daniulive.com:1935/live/stream238";

[_self.session startLive:stream];

}else{

[_self.startLiveButton setTitle:@"開始直播" forState:UIControlStateNormal];

[_self.session stopLive];

}

}];

} return _startLiveButton;

}

stream.url是服務(wù)器的地址,推流完成后使用VLC播放谓娃。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末脚乡,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子滨达,更是在濱河造成了極大的恐慌奶稠,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件捡遍,死亡現(xiàn)場離奇詭異锌订,居然都是意外死亡,警方通過查閱死者的電腦和手機画株,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門辆飘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人谓传,你說我怎么就攤上這事蜈项。” “怎么了续挟?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵紧卒,是天一觀的道長。 經(jīng)常有香客問我诗祸,道長跑芳,這世上最難降的妖魔是什么轴总? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮博个,結(jié)果婚禮上怀樟,老公的妹妹穿的比我還像新娘。我一直安慰自己坡倔,他們只是感情好漂佩,可當(dāng)我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著罪塔,像睡著了一般投蝉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上征堪,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天瘩缆,我揣著相機與錄音,去河邊找鬼佃蚜。 笑死庸娱,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的谐算。 我是一名探鬼主播熟尉,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼洲脂!你這毒婦竟也來了斤儿?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤恐锦,失蹤者是張志新(化名)和其女友劉穎往果,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體一铅,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡陕贮,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了潘飘。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片肮之。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖卜录,靈堂內(nèi)的尸體忽然破棺而出局骤,到底是詐尸還是另有隱情,我是刑警寧澤暴凑,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站赘来,受9級特大地震影響现喳,放射性物質(zhì)發(fā)生泄漏凯傲。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一嗦篱、第九天 我趴在偏房一處隱蔽的房頂上張望冰单。 院中可真熱鬧,春花似錦灸促、人聲如沸诫欠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽荒叼。三九已至,卻和暖如春典鸡,著一層夾襖步出監(jiān)牢的瞬間被廓,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工萝玷, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留嫁乘,地道東北人。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓球碉,卻偏偏與公主長得像蜓斧,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子睁冬,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,722評論 2 345

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

  • 一痴突、直播現(xiàn)狀簡介 1.技術(shù)實現(xiàn)層面: 技術(shù)相對都比較成熟搂蜓,設(shè)備也都支持硬編碼。IOS還提供現(xiàn)成的 Video To...
    stlndm閱讀 61,375評論 220 870
  • 現(xiàn)今移動直播技術(shù)上的挑戰(zhàn)要遠遠難于傳統(tǒng)設(shè)備或電腦直播辽装,其完整的處理環(huán)節(jié)包括但不限于:音視頻采集帮碰、美顏/濾鏡/特效處...
    大榮紙閱讀 8,079評論 5 22
  • Swift版本點擊這里歡迎加入QQ群交流: 594119878最新更新日期:18-09-17 About A cu...
    ylgwhyh閱讀 25,286評論 7 249
  • 今天從紅旗搬到山水美地拓巧,真是累死了斯碌,夠慘烈,還好有文文的三姐夫還有他室友幫我們一起搬家肛度,這個時候才發(fā)覺大學(xué)就應(yīng)該處...
    咩咩的迷妹閱讀 93評論 0 0
  • 我如一只困頓的候鳥傻唾,飛躍過崇山峻嶺,悲春傷秋,一地漂浮的柳絮冠骄,一地難舍情懷伪煤,面對大山大河,你有何感凛辣,有何悲壯抱既。 總...
    青木汐閱讀 273評論 0 1