研发直播APP的收获-iOS

作者: 落影loyinglin | 来源:发表于2016-07-09 09:38 被阅读14027次

前言

做直播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是自己为下一波热潮的预热。

相关文章

网友评论

  • fb0472ee634d:楼主总结得挺好的,分层处理。现在有些公司已经将直播做成云服务了,按需购买,按量收费,都不需要从头开发自己的直播APP,类似SAAS服务,详见:http://weking.io
    落影loyinglin:是的,现在直播的生态已经成熟,技术这方面没有什么竞争力,全靠优质内容和运营。
  • dbe6d1c29bbe:礼物用SpriteKit,Apple自家游戏引擎 基于Metal 性能强劲 值得拥有
  • 暖风惜人:有没有demo可以参考,最近在做直播
  • 依赖糊涂:您好 ~ 楼主 ~ 请教个问题 ~ 就是直播间聊天室 半屏幕 你说用 addChildViewController 加载第三方的 但第三方都是全屏幕的 这个怎么解决
    ~ 谢谢 ~
    依赖糊涂:@落影loyinglin 能加下 qq 么 ~ 想问你下这个问题 ~
    依赖糊涂:@落影loyinglin 我知道啊 那addChildViewController 怎么能把全屏的 能成半瓶 ~
    落影loyinglin:@请叫我赵先生 一般直播内容全屏 聊天半瓶
  • 0d2758e4122b:博主你好,想请教你一下,关于礼物连击发送关联虚拟金额扣除的方案,礼物发送出去是点击一次请求一次网络然后扣除一次金额?像映客或者斗鱼那样的礼物发送所采用的方案有没有比较详细的文章介绍,或者是博主你们的app关于这个问题的解决方案,能不能详细描述下?
    落影loyinglin:@W4 单次礼物请求是可以的。
  • 暖风惜人:我们用的腾讯云第三方,但是用的是随心听的框架,有一个问题是里面的那个消息列表的左边不能填加等级图片,一直调不好
    落影loyinglin:@暖风惜人 demo没抽出来,可以说下实现。首先是富文本显示内容、TextKit判断点击、图片单独显示。
    暖风惜人:@落影loyinglin 是随心播,我的错。就是随心播弹出的消息列表只是名称和信息,我们现在要在左边加一个等级图片。我能看看你的demo吗:sweat:
    落影loyinglin:@暖风惜人 随心听?我怎么记得是随心播。你用什么添加等级图片的?我最近刚刚在等级图片左边又添加了一个特权图片。
  • 3c1818743d2a:楼主能不能给我一份送礼物弹出视图的demo,邮箱 849346518@qq.com 谢谢很着急
  • kinmo:有比较好的送礼物源码么
  • 狼之独步:谢谢分享,这个源码可以下载到吗?
  • 守护地中海的花:你好 礼物特效 是用帧动画还是openGL写的:stuck_out_tongue_winking_eye:
    落影loyinglin:@我们都一样321 写完知会一声,我来瞻仰一发
    守护地中海的花:嗯嗯 控制内存是一件大事 我最近准备写礼物方面 看到这样你这样的文章 赞一个
    落影loyinglin:@我们都一样321 帧动画。
  • IOS_绿豆糕:楼主 聊天区高度相关的 有demo么?
    落影loyinglin:@IOS_绿豆糕 没弄。有什么问题
  • xing_xing:写的很好,点个赞
  • xiaoheng:有没有礼物连击代码可以参考呢?我管理不好这个队列
    ff3f817542ea:@xiaoheng 解决了没,遇到和你同样的问题,能否指点一下
    xiaoheng:@落影loyinglin 我现在参考简书里的一篇文章使用两个队列,缓存操作缓存礼物信息,但是这样是有问题的,另外一个方案是使用一个队列,所以我现在陷入一种死角,没法思考了
    落影loyinglin:@xiaoheng 业务代码不好参考,你的思路是什么
  • 悟2023:嘲讽一下,如果聊天部分使用第三方的,视频直播也是用第三方的,还能称得上 “研发” 吗?
    七里小晴天:@wh_hack 我觉得有必要自己整点碳元素和硅元素还有铁元素,合成几个电脑原件,组装个电脑,然后自己在写个系统,再来开发比较合适
    wh_hack:我觉得这个很搞笑,什么才不算第三方?你要不要从怎么驱动屏幕显示东西讲起来呢?
    落影loyinglin:@JSMaker 确实。两个核心的功能都是用的第三方。有人挖金子,有人造背篓,有人造鞋子嘛。而且即使是接入第三方也要自己会,坑很多的
  • 9f94d02340f1:请问一下这句话:显示富文本;
    - (CGRect)boundingRectWithSize:options: attributes:context:计算高度并缓存;里面说计算高度并缓存。这个“缓存”指的是啥?要怎样缓存,缓存到哪里?谢谢!!
    落影loyinglin:@JamesYea 比如说你的cell对应的数据源 应该也是一个数组 数组的成员应该是个结构体。你在那里添加就行
    9f94d02340f1:这里“缓存起来”指的是将计算出来的值赋给一个属性或者成员变量吗?
    落影loyinglin:@JamesYea 高度计算是个耗时操作。对应的cell 的高度可以缓存下来,防止多次计算。放在哪里就看你放哪里方便,都可以
  • 丐帮头:能说下:礼物列表图片的动态更新吗?
    丐帮头:@落影loyinglin 谢谢
    落影loyinglin:@丐帮头的士 加礼物版本号。登录时判断当前版本号和服务器版本号
  • 陈_某_某:送礼物不是走tcp的吗??http那你怎么推送到其他客户端的 。。
    落影loyinglin:@_iOSer http是和业务服务器交互。tcp你说的是im吧。和业务是分开的
  • 480a52903ce5:学习一下. 谢谢博主, 多多加油! :+1:
    落影loyinglin:@叫我干苦力的小码农 个人首页还有两个文集,可以看看
  • 我大磊:希望楼主能多分享些直播技术,支持你,我目前也正在写直播项目,遇到不少问题
    落影loyinglin:@我大磊 看看另外一篇性能优化 有用
  • _风雨:正在做用腾讯云做这方面的东西,礼物连击的生命周期怎么管理比较好呢
    wh_hack:@_风雨 桶就是队列,或者栈
    _风雨:@落影loyinglin 居然没看懂桶的意思:joy:,再我再研究下,感谢提供思路:smile:
    落影loyinglin:@_风雨 礼物连击可以看成多个桶排成的队列,礼物赠送者id+礼物类型相同的放在一个桶内。连击过程中,可以不断往桶里放礼物。
    如果连击完成,桶里没有礼物,开始放下一个桶的礼物。
  • 再见远洋:博主写完这个项目之后 基本干其它项目无压力了 直播涉及的东西很广 需要了解的东西太多了 正在做直播相关的项目 以后向你请教
    我大磊:@再见远洋我也正在写直播项目
  • a67e02faf22f:醍醐灌顶, :+1: :+1:
  • zhq1992:直播怎么实现的,第三方直播服务还是自己弄的
    人工智能狂想曲:还有 又拍云 :stuck_out_tongue_winking_eye:
    落影loyinglin:@周焕强 直播有腾讯云、金山云、七牛云等等。
  • 779b68e64744:model层的数据改变用通知是怎么做的呢,可否详细的讲一下吗?
    落影loyinglin:@GainellMe 对,RAC我也用。 我之前的项目用RAC处理数据显示,还有UI操作,非常好用。
    779b68e64744:@落影loyinglin 好像rac的思想
    落影loyinglin:@GainellMe model层的数据显示,我参考的是web的一种数据绑定的思想。如果model不大,当model数据变化的时候,发出一个MODEL_DATA_**_CHANGE的notification,需要显示数据控制器添加监听,重新获取model数据并传给view显示;如果model内容较多,可以按照业务逻辑分出具体的notification。注意别在view里面添加监听。
  • wg689:app名字,我下一个
  • 爃少:弹幕功能是另外开发还是用类似环信的呢。?
    落影loyinglin:@爃少 聊天功能可以用第三方IM。

本文标题:研发直播APP的收获-iOS

本文链接:https://www.haomeiwen.com/subject/sbmrjttx.html