前言
做直播APP也有一段時(shí)間,自身是多年直播觀眾县习,總結(jié)下這段時(shí)間研發(fā)的收獲以及業(yè)務(wù)介紹涮母。
1.功能介紹
直播APP的常用業(yè)務(wù)如下。
躁愿。1叛本、聊天
私聊、聊天室彤钟、點(diǎn)亮来候、推送、黑名單等逸雹;
营搅。2、禮物
普通禮物梆砸、豪華禮物转质、紅包、排行榜辫樱、第三方充值峭拘、內(nèi)購(gòu)、禮物動(dòng)態(tài)更新狮暑、提現(xiàn)等鸡挠;
。3搬男、直播列表
關(guān)注拣展、熱門(mén)、最新缔逛、分類(lèi)直播用戶(hù)列表等备埃;
。4褐奴、自己直播
錄制按脚、推流、解碼敦冬、播放辅搬、美顏、心跳脖旱、后臺(tái)切換堪遂、主播對(duì)管理員操作介蛉、管理員對(duì)用戶(hù)等;
溶褪。5币旧、房間邏輯
創(chuàng)建房間、進(jìn)入房間猿妈、退出房間吹菱、關(guān)閉房間、切換房間彭则、房間管理員設(shè)置毁葱、房間用戶(hù)列表等;
贰剥。6、用戶(hù)邏輯
普通登陸筷频、第三方登陸蚌成、注冊(cè)、搜索凛捏、修改個(gè)人信息担忧、關(guān)注列表、粉絲列表坯癣、忘記密碼瓶盛、查看個(gè)人信息、收入榜示罗、關(guān)注和取關(guān)惩猫、檢索等;
蚜点。7轧房、觀看直播
聊天信息、滾屏彈幕绍绘、禮物顯示奶镶、加載界面等;
陪拘。8厂镇、統(tǒng)計(jì)
APP業(yè)務(wù)統(tǒng)計(jì)、第三方統(tǒng)計(jì)等左刽;
捺信。9、超管
禁播悠反、隱藏残黑、審核等馍佑;
2.直播原理
。直播原理:把主播錄制的視頻梨水,推送到服務(wù)器拭荤,在由服務(wù)器分發(fā)給觀眾觀看。
疫诽。直播環(huán)節(jié):推流端(采集舅世、美顏處理、編碼奇徒、推流)
雏亚。服務(wù)端處理(轉(zhuǎn)碼、錄制摩钙、截圖罢低、鑒黃)
。播放器(拉流胖笛、解碼网持、渲染)
〕び唬互動(dòng)系統(tǒng)(聊天室功舀、禮物系統(tǒng)、贊)
3.直播的實(shí)現(xiàn)流程
4.架構(gòu)設(shè)計(jì)
業(yè)務(wù)模塊
視圖
1身弊、GiftView
顯示禮物辟汰,管理小禮物與豪華禮物動(dòng)畫(huà);
核心:
小禮物連擊效果阱佛,隊(duì)列存儲(chǔ)豪華禮物消息帖汞,播放完畢回調(diào)。
小禮物用CAAnimation動(dòng)畫(huà)和UIView Block動(dòng)畫(huà)凑术;
豪華禮物用CAAnimation動(dòng)畫(huà)和UIView Block動(dòng)畫(huà)+GCD協(xié)調(diào)涨冀;
2、MessageView
顯示聊天消息麦萤,彈幕消息鹿鳖。
核心:
聊天tableView,用NSMutableAttributedString顯示富文本壮莹;
- (CGRect)boundingRectWithSize:options: attributes:context:計(jì)算高度并緩存翅帜;
彈幕消息用隊(duì)列存儲(chǔ)彈幕,UIViewBlock動(dòng)畫(huà)循環(huán)播放命满,最多同時(shí)顯示條數(shù)限制涝滴;
3、RoomTableView
顯示房間列表
核心:
MJRefresh做上下拉刷新,以時(shí)間為軸歼疮;
4杂抽、ChatView
聊天界面,直播間內(nèi)半屏顯示韩脏,直播間外全屏顯示缩麸;
核心:
用第三方聊天界面,直播間內(nèi)用addChildViewController的方式赡矢,直接加載第三方ViewController杭朱;
控制器
1、ChatViewController
第三方聊天控制器做基類(lèi)吹散,自定義業(yè)務(wù)邏輯弧械,包括私聊送禮物、廣告屏蔽等空民,包括ChatListViewController和ChatDetailViewController刃唐。
2、WatchLiveViewController
觀看直播控制器界轩,包括LivePlayer(視頻流播放器)唁桩,房間業(yè)務(wù)邏輯相關(guān),接受聊天消息轉(zhuǎn)發(fā)給MessageView耸棒,切換前后臺(tái)(APP生命周期)控制;
3报辱、PushLiveViewController
推流直播控制器与殃,包括推流相關(guān)邏輯,直播定時(shí)器碍现,房間業(yè)務(wù)邏輯相關(guān)幅疼,聊天消息轉(zhuǎn)發(fā)給MessageView,主播離開(kāi)昼接、切換后臺(tái)等控制爽篷;
數(shù)據(jù)層
1、LiveRoom
房間的數(shù)據(jù)結(jié)構(gòu)慢睡,存儲(chǔ)房間信息逐工,包括管理員、主播ID漂辐、房間推流泪喊、拉流地址、房間用戶(hù)列表等等髓涯;
2袒啼、LiveUser
直播的用戶(hù)數(shù)據(jù)結(jié)構(gòu),包括昵稱(chēng)、頭像蚓再、ID、等級(jí)摘仅、榜單等靶庙;
3、ChatUser/Message
聊天的用戶(hù)數(shù)據(jù)結(jié)構(gòu)实檀,包括頭像惶洲、昵稱(chēng)、ID等膳犹,Message是消息類(lèi)型恬吕,包括直播間普通的Message、(節(jié)省流量)打包用的QueueMessage须床,私聊聊天的TextMessage铐料、PhotoMessage等;
服務(wù)層
1豺旬、IMService
IM功能钠惩,提供私聊,直播間消息廣播等族阅。
2篓跛、LiveService
推流和拉流功能,提供錄制坦刀、推送視頻流到服務(wù)器愧沟,拉取視頻流和播放視頻;
3鲤遥、LoginService
登陸功能沐寺,手機(jī)號(hào)碼登陸,第三方(QQ盖奈、微信混坞、新浪)登陸;
4钢坦、IAPService
內(nèi)購(gòu)功能究孕,蘋(píng)果內(nèi)購(gòu);
5爹凹、PayService
第三方支付蚊俺,微信支付和支付寶支付;
6逛万、PushService
推送功能泳猬,聊天消息推送批钠,直播開(kāi)播推送,活動(dòng)推送等得封;
7埋心、AnalysisService
統(tǒng)計(jì)功能,APP自身統(tǒng)計(jì)上傳到服務(wù)器忙上,第三方統(tǒng)計(jì)拷呆;
Pod庫(kù)
1、AFNetworking
負(fù)責(zé)所有Http請(qǐng)求疫粥,業(yè)務(wù)層會(huì)封裝Manager茬斧;
2、GPUImage
采集視頻梗逮,并對(duì)視頻流進(jìn)行美顏處理项秉;
3、RMStore
蘋(píng)果內(nèi)購(gòu)支持慷彤;
4娄蔼、SDWebImage
負(fù)責(zé)加載圖片,包括頭像底哗、禮物圖片等岁诉;
業(yè)務(wù)問(wèn)題分析
1、聊天室消息過(guò)多
產(chǎn)品運(yùn)營(yíng)一段時(shí)間后跋选,消息量不斷攀升涕癣,最高到100billion,后來(lái)IM方優(yōu)化后前标,量級(jí)穩(wěn)定在10billion坠韩,但是消息量仍舊過(guò)大。
通過(guò)對(duì)消息歷史記錄進(jìn)行數(shù)據(jù)分析候生,發(fā)現(xiàn)瓶頸在enter和exit消息,占比為84%绽昼。
分析:在線(xiàn)用戶(hù)交多唯鸭,頻繁進(jìn)出房的動(dòng)作導(dǎo)致需要不斷發(fā)送enter和exit消息,可以預(yù)計(jì)硅确,當(dāng)房間內(nèi)人數(shù)越來(lái)越多之后目溉,將會(huì)有更多的進(jìn)出房消息,同時(shí)增長(zhǎng)速度為平方級(jí)別菱农。
總結(jié):客戶(hù)端和服務(wù)器之間的實(shí)時(shí)消息過(guò)多缭付,同時(shí)都是密集操作。
解決方案:
人數(shù)較多的房間循未,等級(jí)小于一定級(jí)別(服務(wù)器下發(fā))則不發(fā)送進(jìn)出房消息陷猫;
級(jí)別較高的用戶(hù)進(jìn)入房間時(shí),會(huì)在進(jìn)房消息攜帶數(shù)據(jù)以同步房間信息;
2绣檬、房間活躍度計(jì)算
設(shè)有活躍度(禮物G足陨、聊天M) 、 在線(xiàn)人數(shù)N娇未、 直播時(shí)間T
G為本次直播收到的Y幣數(shù)
M為本次直播發(fā)出的消息數(shù)
N為本次直播在線(xiàn)人數(shù)
T為本次直播的分鐘數(shù)
本次直播的成本為N * k1 + M * k2墨缘,k1為帶寬成本常數(shù),k2為IM成本常數(shù)零抬。
聊天成本暫不考慮镊讼,那么成本為N * k1。
視頻帶寬的價(jià)格20元/M每個(gè)月平夜,用戶(hù)觀看的速度為150k/s左右蝶棋,那么每個(gè)用戶(hù)高峰成本為7元每個(gè)月,每日成本為2.3元褥芒。用戶(hù)人均每日觀看2小時(shí)嚼松,那么每分鐘的成本為0.02元。
我們的最高在線(xiàn)/活躍人數(shù)是0.18锰扶,那么一個(gè)普通用戶(hù)每分鐘的期望成本k1 = 0.18*0.02 = 0.004元献酗。
我們的每分鐘收入為x = G / T * 0.66 - N * 0.004
對(duì)于一個(gè)已經(jīng)在直播的主播,如果x 大于0坷牛,那么屬于為平臺(tái)賺錢(qián)主播罕偎,可以放在列表前面。
預(yù)計(jì):
按照目前的水平京闰,假設(shè)一個(gè)1000人觀看的主播颜及,每天2個(gè)小時(shí)的直播,收入應(yīng)該在10000Y幣蹂楣。
每小時(shí)應(yīng)該有5000Y幣俏站,每分鐘應(yīng)該有84個(gè)Y幣。我們的收入有5.6元痊土。
那么對(duì)于一個(gè)新開(kāi)直播的主播肄扎,她的預(yù)設(shè)x值為1.6。
總結(jié):
每分鐘按照收入x排序,
如果是已經(jīng)開(kāi)播的主播赁酝,x = G / T0.66 - N0.004犯祠;
如果是剛開(kāi)未滿(mǎn)一分鐘的主播,x=1.6酌呆。
3衡载、HTTP代理篡改get參數(shù)
通過(guò)HTTP代理工具,篡改移動(dòng)端發(fā)給服務(wù)器的get參數(shù)隙袁。舉個(gè)例子痰娱,用戶(hù)點(diǎn)的是豪華禮物弃榨,通過(guò)HTTP代理工具把發(fā)送給服務(wù)器的請(qǐng)求的禮物ID改為普通禮物的ID。
解決方案:
1猜揪、改用HTTPS惭墓;
2、添加校驗(yàn)碼而姐;
解釋下方案2腊凶,把所有的get參數(shù),key按照字符串順序排序拴念,value用"/"串起來(lái)钧萍,最后再加一串特定的字符,最終對(duì)這串值進(jìn)行MD5政鼠,把MD5的串添加到code字段风瘦。客戶(hù)端公般、服務(wù)器都對(duì)核心邏輯收到的消息万搔,進(jìn)行一次校驗(yàn)。