研发直播APP的收获-iOS

前言

做直播APP也有一段时间,自身是多年直播观众,总结下这段时间研发的收获以及业务介绍。

欢迎关注文集-直播Live

功能介绍

直播APP的常用业务如下。

1、聊天

私聊、聊天室、点亮、推送、黑名单等;

2、礼物

普通礼物、豪华礼物、红包、排行榜、第三方充值、内购、礼物动态更新、提现等;

3、直播列表

关注、热门、最新、分类直播用户列表等;

4、自己直播

录制、推流、解码、播放、美颜、心跳、后台切换、主播对管理员操作、管理员对用户等;

5、房间逻辑

创建房间、进入房间、退出房间、关闭房间、切换房间、房间管理员设置、房间用户列表等;

6、用户逻辑

普通登陆、第三方登陆、注册、搜索、修改个人信息、关注列表、粉丝列表、忘记密码、查看个人信息、收入榜、关注和取关、检索等;

7、观看直播

聊天信息、滚屏弹幕、礼物显示、加载界面等;

8、统计

APP业务统计、第三方统计等;

9、超管

禁播、隐藏、审核等;

架构

直播APP的业务逻辑不复杂,使用基本的MVC框架即可。

  • 部分Controller的业务逻辑较多,独立的业务可以拆分出去作为一个单独的Catagory;
  • Model的数据变化采用event(notification)的形式通知,便于做多处数据绑定;
  • Model之间的相互独立,如果由业务需要,需要交换Model的数据,由Controller代为处理;
  • HTTPService为AFNetworking封装,回调Model以Block块为主,特殊的业务逻辑以event(notification)的形式通知;

具体模块

视图

1、GiftView

显示礼物,管理小礼物与豪华礼物动画;
核心:
小礼物连击效果,队列存储豪华礼物消息,播放完毕回调
小礼物用CAAnimation动画和UIView Block动画;
豪华礼物用CAAnimation动画和UIView Block动画+GCD协调

2、MessageView

显示聊天消息,弹幕消息。
核心:
聊天tableView,用NSMutableAttributedString显示富文本;
- (CGRect)boundingRectWithSize:options: attributes:context:计算高度并缓存;
弹幕消息用队列存储弹幕,UIViewBlock动画循环播放,最多同时显示条数限制;

3、RoomTableView

显示房间列表
核心:
MJRefresh做上下拉刷新,以时间为轴

4、ChatView

聊天界面,直播间内半屏显示,直播间外全屏显示;
核心:
用第三方聊天界面,直播间内用addChildViewController的方式,直接加载第三方ViewController;

控制器

1、ChatViewController

第三方聊天控制器做基类,自定义业务逻辑,包括私聊送礼物、广告屏蔽等,包括ChatListViewController和ChatDetailViewController。

2、WatchLiveViewController

观看直播控制器,包括LivePlayer(视频流播放器),房间业务逻辑相关,接受聊天消息转发给MessageView,切换前后台(APP生命周期)控制;

3、PushLiveViewController

推流直播控制器,包括推流相关逻辑,直播定时器,房间业务逻辑相关,聊天消息转发给MessageView,主播离开、切换后台等控制;

数据层

1、LiveRoom

房间的数据结构,存储房间信息,包括管理员、主播ID、房间推流、拉流地址、房间用户列表等等;

2、LiveUser

直播的用户数据结构,包括昵称、头像、ID、等级、榜单等;

3、ChatUser/Message

聊天的用户数据结构,包括头像、昵称、ID等,Message是消息类型,包括直播间普通的Message、(节省流量)打包用的QueueMessage,私聊聊天的TextMessage、PhotoMessage等;

服务层

1、IMService

IM功能,提供私聊,直播间消息广播等。

2、LiveService

推流和拉流功能,提供录制、推送视频流到服务器,拉取视频流和播放视频;

3、LoginService

登陆功能,手机号码登陆,第三方(QQ、微信、新浪)登陆;

4、IAPService

内购功能,苹果内购;

5、PayService

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

6、PushService

推送功能,聊天消息推送,直播开播推送,活动推送等;

7、AnalysisService

统计功能,APP自身统计上传到服务器,第三方统计;

Pod库

1、AFNetworking

负责所有Http请求,业务层会封装Manager;

2、GPUImage

采集视频,并对视频流进行美颜处理;

3、RMStore

苹果内购支持;

4、SDWebImage

负责加载图片,包括头像、礼物图片等;

业务问题分析

1、聊天室消息过多

产品运营一段时间后,消息量不断攀升,最高到100billion,后来IM方优化后,量级稳定在10billion,但是消息量仍旧过大。
通过对消息历史记录进行数据分析,发现瓶颈在enter和exit消息,占比为84%。
分析:在线用户交多,频繁进出房的动作导致需要不断发送enter和exit消息,可以预计,当房间内人数越来越多之后,将会有更多的进出房消息,同时增长速度为平方级别
总结:客户端和服务器之间的实时消息过多,同时都是密集操作。
解决方案:
人数较多的房间,等级小于一定级别(服务器下发)则不发送进出房消息;
级别较高的用户进入房间时,会在进房消息携带数据以同步房间信息;

2、房间活跃度计算

设有活跃度(礼物G、聊天M) 、 在线人数N、 直播时间T
G为本次直播收到的Y币数
M为本次直播发出的消息数
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代理工具,篡改移动端发给服务器的get参数。举个例子,用户点的是豪华礼物,通过HTTP代理工具把发送给服务器的请求的礼物ID改为普通礼物的ID。
解决方案:
1、改用HTTPS;
2、添加校验码;
解释下方案2,把所有的get参数,key按照字符串顺序排序,value用"/"串起来,最后再加一串特定的字符,最终对这串值进行MD5,把MD5的串添加到code字段。客户端、服务器都对核心逻辑收到的消息,进行一次校验。

总结

时间有限,大多数核心逻辑没有深入介绍。感兴趣的可以在评论区交流。

GPUImage仅是目前iOS用到的图像处理库,OpenGL ES是自己为下一波热潮的预热。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容

  • 全局创建context? 创建一个全局的context,然后退出SDK层房间时不销毁只是停止context。 SD...
    Carden阅读 1,418评论 0 2
  • 2016 年是直播元年,也是这个行业最辉煌的一年,不少平台拿到了B轮,甚至是C轮融资。而直播行业的火爆,直接引来了...
    方弟阅读 48,359评论 7 126
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,389评论 25 707
  • 经济状况让我烦忧。我希望得到富足的生活,让孩子有更好的生活条件和受教育条件;让爸爸有足够的钱养老;让我们的生活更有...
    木子芳华阅读 246评论 0 0
  • 黄执中:证有不证无 概念阐述:只能证明有,不能证明没有。要证明一件东西不存在在逻辑上是行不通的。 **举例:**如...
    安的烈阅读 3,740评论 3 25