研發(fā)直播APP的收獲-iOS

前言

做直播APP也有一段時間,自身是多年直播觀眾,總結下這段時間研發(fā)的收獲以及業(yè)務介紹。

歡迎關注文集-直播Live

功能介紹

直播APP的常用業(yè)務如下。

1、聊天

私聊、聊天室、點亮、推送、黑名單等;

2、禮物

普通禮物、豪華禮物、紅包、排行榜、第三方充值、內購、禮物動態(tài)更新、提現等;

3、直播列表

關注、熱門、最新、分類直播用戶列表等;

4、自己直播

錄制、推流、解碼、播放、美顏、心跳、后臺切換、主播對管理員操作、管理員對用戶等;

5、房間邏輯

創(chuàng)建房間、進入房間、退出房間、關閉房間、切換房間、房間管理員設置、房間用戶列表等;

6、用戶邏輯

普通登陸、第三方登陸、注冊、搜索、修改個人信息、關注列表、粉絲列表、忘記密碼、查看個人信息、收入榜、關注和取關、檢索等;

7、觀看直播

聊天信息、滾屏彈幕、禮物顯示、加載界面等;

8、統計

APP業(yè)務統計、第三方統計等;

9、超管

禁播、隱藏、審核等;

架構

直播APP的業(yè)務邏輯不復雜,使用基本的MVC框架即可。

  • 部分Controller的業(yè)務邏輯較多,獨立的業(yè)務可以拆分出去作為一個單獨的Catagory;
  • Model的數據變化采用event(notification)的形式通知,便于做多處數據綁定;
  • Model之間的相互獨立,如果由業(yè)務需要,需要交換Model的數據,由Controller代為處理;
  • HTTPService為AFNetworking封裝,回調Model以Block塊為主,特殊的業(yè)務邏輯以event(notification)的形式通知;

具體模塊

視圖

1、GiftView

顯示禮物,管理小禮物與豪華禮物動畫;
核心:
小禮物連擊效果,隊列存儲豪華禮物消息,播放完畢回調
小禮物用CAAnimation動畫和UIView Block動畫;
豪華禮物用CAAnimation動畫和UIView Block動畫+GCD協調

2、MessageView

顯示聊天消息,彈幕消息。
核心:
聊天tableView,用NSMutableAttributedString顯示富文本;
- (CGRect)boundingRectWithSize:options: attributes:context:計算高度并緩存;
彈幕消息用隊列存儲彈幕,UIViewBlock動畫循環(huán)播放,最多同時顯示條數限制;

3、RoomTableView

顯示房間列表
核心:
MJRefresh做上下拉刷新,以時間為軸

4、ChatView

聊天界面,直播間內半屏顯示,直播間外全屏顯示;
核心:
用第三方聊天界面,直播間內用addChildViewController的方式,直接加載第三方ViewController;

控制器

1、ChatViewController

第三方聊天控制器做基類,自定義業(yè)務邏輯,包括私聊送禮物、廣告屏蔽等,包括ChatListViewController和ChatDetailViewController。

2、WatchLiveViewController

觀看直播控制器,包括LivePlayer(視頻流播放器),房間業(yè)務邏輯相關,接受聊天消息轉發(fā)給MessageView,切換前后臺(APP生命周期)控制;

3、PushLiveViewController

推流直播控制器,包括推流相關邏輯,直播定時器,房間業(yè)務邏輯相關,聊天消息轉發(fā)給MessageView,主播離開、切換后臺等控制;

數據層

1、LiveRoom

房間的數據結構,存儲房間信息,包括管理員、主播ID、房間推流、拉流地址、房間用戶列表等等;

2、LiveUser

直播的用戶數據結構,包括昵稱、頭像、ID、等級、榜單等;

3、ChatUser/Message

聊天的用戶數據結構,包括頭像、昵稱、ID等,Message是消息類型,包括直播間普通的Message、(節(jié)省流量)打包用的QueueMessage,私聊聊天的TextMessage、PhotoMessage等;

服務層

1、IMService

IM功能,提供私聊,直播間消息廣播等。

2、LiveService

推流和拉流功能,提供錄制、推送視頻流到服務器,拉取視頻流和播放視頻;

3、LoginService

登陸功能,手機號碼登陸,第三方(QQ、微信、新浪)登陸;

4、IAPService

內購功能,蘋果內購;

5、PayService

第三方支付,微信支付和支付寶支付;

6、PushService

推送功能,聊天消息推送,直播開播推送,活動推送等;

7、AnalysisService

統計功能,APP自身統計上傳到服務器,第三方統計;

Pod庫

1、AFNetworking

負責所有Http請求,業(yè)務層會封裝Manager;

2、GPUImage

采集視頻,并對視頻流進行美顏處理;

3、RMStore

蘋果內購支持;

4、SDWebImage

負責加載圖片,包括頭像、禮物圖片等;

業(yè)務問題分析

1、聊天室消息過多

產品運營一段時間后,消息量不斷攀升,最高到100billion,后來IM方優(yōu)化后,量級穩(wěn)定在10billion,但是消息量仍舊過大。
通過對消息歷史記錄進行數據分析,發(fā)現瓶頸在enter和exit消息,占比為84%。
分析:在線用戶交多,頻繁進出房的動作導致需要不斷發(fā)送enter和exit消息,可以預計,當房間內人數越來越多之后,將會有更多的進出房消息,同時增長速度為平方級別
總結:客戶端和服務器之間的實時消息過多,同時都是密集操作。
解決方案:
人數較多的房間,等級小于一定級別(服務器下發(fā))則不發(fā)送進出房消息;
級別較高的用戶進入房間時,會在進房消息攜帶數據以同步房間信息;

2、房間活躍度計算

設有活躍度(禮物G、聊天M) 、 在線人數N、 直播時間T
G為本次直播收到的Y幣數
M為本次直播發(fā)出的消息數
N為本次直播在線人數
T為本次直播的分鐘數
本次直播的成本為N * k1 + M * k2,k1為帶寬成本常數,k2為IM成本常數。
聊天成本暫不考慮,那么成本為N * k1。

視頻帶寬的價格20元/M每個月,用戶觀看的速度為150k/s左右,那么每個用戶高峰成本為7元每個月,每日成本為2.3元。用戶人均每日觀看2小時,那么每分鐘的成本為0.02元。
我們的最高在線/活躍人數是0.18,那么一個普通用戶每分鐘的期望成本k1 = 0.18*0.02 = 0.004元。

我們的每分鐘收入為x = G / T * 0.66 - N * 0.004
對于一個已經在直播的主播,如果x 大于0,那么屬于為平臺賺錢主播,可以放在列表前面。

預計:
按照目前的水平,假設一個1000人觀看的主播,每天2個小時的直播,收入應該在10000Y幣。
每小時應該有5000Y幣,每分鐘應該有84個Y幣。我們的收入有5.6元。
那么對于一個新開直播的主播,她的預設x值為1.6。

總結:
每分鐘按照收入x排序,
如果是已經開播的主播,x = G / T * 0.66 - N * 0.004;
如果是剛開未滿一分鐘的主播,x=1.6。

3、HTTP代理篡改get參數

通過HTTP代理工具,篡改移動端發(fā)給服務器的get參數。舉個例子,用戶點的是豪華禮物,通過HTTP代理工具把發(fā)送給服務器的請求的禮物ID改為普通禮物的ID。
解決方案:
1、改用HTTPS;
2、添加校驗碼;
解釋下方案2,把所有的get參數,key按照字符串順序排序,value用"/"串起來,最后再加一串特定的字符,最終對這串值進行MD5,把MD5的串添加到code字段。客戶端、服務器都對核心邏輯收到的消息,進行一次校驗。

總結

時間有限,大多數核心邏輯沒有深入介紹。感興趣的可以在評論區(qū)交流。

GPUImage僅是目前iOS用到的圖像處理庫,OpenGL ES是自己為下一波熱潮的預熱。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 全局創(chuàng)建context? 創(chuàng)建一個全局的context,然后退出SDK層房間時不銷毀只是停止context。 SD...
    Carden閱讀 1,559評論 0 2
  • 2016 年是直播元年,也是這個行業(yè)最輝煌的一年,不少平臺拿到了B輪,甚至是C輪融資。而直播行業(yè)的火爆,直接引來了...
    方弟閱讀 48,884評論 7 126
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,268評論 25 708
  • 經濟狀況讓我煩憂。我希望得到富足的生活,讓孩子有更好的生活條件和受教育條件;讓爸爸有足夠的錢養(yǎng)老;讓我們的生活更有...
    木子芳華閱讀 264評論 0 0
  • 黃執(zhí)中:證有不證無 概念闡述:只能證明有,不能證明沒有。要證明一件東西不存在在邏輯上是行不通的。 **舉例:**如...
    安的烈閱讀 3,791評論 3 25