上篇文章完成了直播的简单业务,我们可以慢慢完善这个直播类app开发, 例如附近直播,直播礼物,直播回放, 当然直播类app开发的实际业务要比我说的复杂,博主这里提供一个思路

附近直播

现在直播类app开发实现附近的人都是基本功能, 所以我们的直播也不例外, 本身附近的人功能就不复杂, 只不过是选择哪种方式来做合适罢了。要做这个附近的人,首先要收集用户的经纬度存放到数据库,也就是我们的数据表会变成这样

参数名

说明

id

自增主建

user_id

用户ID

live_url

播放地址

obs_url

推流地址

avatar

直播封面

title

直播标题

status

直播状态 是否在播

lat

纬度

lng

经度

city

给用户看的位置信息

获得了经纬度后,我们就可以通过技术手段获取附近的用户,按照位置信息、 热度等排序展示给用浏览了

常见附近的人处理方式有:

Mysql实现附近的人

mysql 实现附近的人也分2种方案

  • 每次都通过函数计算

这种就需要计算,消耗大一点,但是数据量小直径忽略,业务最大,开发效率最大

这里给出一点代码,大家可以看看

// 6371是计算公式的公里 英里是3959
$distanceRaw = <<<SQL
(6371*acos(cos(radians(%s))*cos(radians(lat))*cos(radians(lng)-radians(%s))+sin(radians(%s))*sin(radians(lat)))) AS distance
SQL;$data = LiveRoomModel::query()->where(['status' => 1])->having('distance', '<=', $km)->forPage($data['page'], $data['size'])->orderBy('distance')->get(['id','title','room_avatar','city','status',DB::raw(sprintf($distanceRaw, $data['lat'], $data['lng'], $data['lat']))])->toArray();

还有另一种方式, 设置 geometry 地理空间类型字段, 可以利用 mysql 的空间函数 ST_Distance_Sphere 进行计算得出距离, 以米为单位

  • 利用GeoHash 减少计算

GeoHash算法将二维的经纬度数据映射到一维的整数,这样所有的元素都将挂载到一条线上,距离靠近的二维坐标映射到一维后的点之间距离会很接近。当我们想要计算附近的人时,首先将目标位置映射到这条线上,然后在这条一维的线上获取附近的点就ok了。

我们使用对经纬度进行 geohash 算法计算得出hash值, 存入数据库使用like查询, 查出附近的人进行二次计算得出距离即可

Redis

Redis中处理这些地理位置坐标点的思想是:

Redis中经纬度使用52位的整数进行编码,放进zset中,zsetvalue元素是keyscoreGeoHash的52位整数值。在使用Redis进行Geo查询时,其内部对应的操作其实只是zset(skiplist)的操作。通过zsetscore进行排序就可以得到坐标附近的其它元素,通过将score还原成坐标值就可以得到元素的原始坐标

  1. 二维平面坐标点
  2. 一维整数编码值
  3. zset(score为编码值)
  4. zrangebyscore(获取score相近的元素)
  5. 通过score(整数编码值)反解坐标点
  6. 附近点的地理位置坐标

使用 redis geo 指令就可以实现了, 使用时务必再次想起,它只是一个普通的zset结构。

  • georadiusbymember 查询指定元素附近的其它元素
  • geodist 计算两个元素之间的距离

在一个地图应用中,车的数据、餐馆的数据、人的数据可能会有百万千万条,如果使用 RedisGeo 数据结构,它们将全部放在一个 zset 集合中。在 Redis 的集群环境中,集合可能会从一个节点迁移到另一个节点,如果单个 key 的数据过大,会对集群的迁移工作造成较大的影响,在集群环境中单个 key 对应的数据量不宜超过 1M,否则会导致集群迁移出现卡顿现象,影响线上服务的正常运行。

所以,这里建议 Geo 的数据使用单独的 Redis 实例部署,不使用集群环境。 如果数据量过亿甚至更大,就需要对 Geo 数据进行拆分,按国家拆分、按省拆分,按市拆分,在人口特大城市甚至可以按区拆分。这样就可以显著降低单个 zset 集合的大小。(注意:zset集合大小,进行合适地切分)

ElasticSearch

这个效率比较高,也是直播类app开发应用比较多,我们也介绍一下 es也有地理位置相关的数据类型, 例如: geo_point geo_shapes

那这两种有一定区别, 我们做一个简单的附近的人采用 geo_point 即可, geo_shapes 纯粹是用来过滤的

  • geo_point

用于计算距离、排序、打分以及聚合, 有时候距离并不是影响排序的唯一因素, 可能和热度, 好评也相关, 所以打分也是一个很重要的功能, 如果大家的排序多样化 可以选择 es

  • geo_shapes

geo_pointgeo_shape的最大区别是: geo_point表示一个点;geo_shape则表示有多个点连成线组成的形状。 学过数学的肯定很容易理解。

他的主要作用就是: 判断查询的形状与索引的形状的关系

  1. 查询的形状与索引的形状有重叠 或者不重叠
  2. 索引的形状完全被包含在查询的形状中, 假如我们的想要查询落在一个凹多边形内的点, 使用geo_point类型的就满足不了我们的需求了

Geo-shapes 不能用于计算距离、排序、打分以及聚合。


MongoDB也可以利用2d索引, 本质上还是geohash,附近的人只是一种基础功能, 做的时候考虑是否需要引入新技术, 新增成本是否能够接受? 我们不需要盲目使用各种各样的技术,根据业务挑选最合适的,就算技术最新又怎样,解决不了业务,导致项目延期,你这次采用的技术毫无价值


直播礼物

这个是直播类app开发必不可少的一项了, 做起来也不困难, 博主完整说一下, 这里包含一些前后端的交互

在直播类app开发的过程中,需要在APP中实现设计同学的UE效果动画,一般都是通过代码实现的,当对于较复杂的动画时,例如直播中刷礼物时的动画,这时利用代码实现会比较复杂。而且AndroidiOS两端不好统一效果,如果用gif图片来实现的话,在图片大小和动画帧数之间很难权衡。而且会导致内存吃紧。为了解决这样的问题,介绍两款实现复杂动画的开源库:LottieSVGA

  • Lottie

爱彼迎的好东西, 别说, 他们APP效果很不错, JS 代码风格也是业内标杆, 我以前严格要求项目组按照这种风格编码. 但是这个对平台有限制,iOS 8.0 以上,Android API 14 以上。交互动画不可行,主要是播放类型动画。开发成本也比较低, 设计师导出json后,开发同学只需引用文件即可。

  • Svga

动画设计师专注动画设计,通过工具输出 svga 动画文件,提供给开发工程师在集成 svga player 之后直接使用。方便,跨平台好, 我们公司选择的就是这个, 我们还有一个微信小程序, 当时小程序Lottie支持不太好,并且公司前端技术也比较倾向于这个

然后我们说一下后端, 如果按照数据驱动开发的方式的话, 我们需要将礼物相关表建立一下, 例如: 礼物表、礼物类别、直播间礼物打赏日志、其他用户消费日志等等

这里我说一下礼物表, 基本字段

参数名

说明

id

自增主建

title

礼物名称

image

礼物图片

svga

SVGA的URL

price

礼物价值的虚拟币

is_animation

1特效 0 为特效

time

特效持续时间 s为单位

sort

礼物排序

礼物如果需要抽点的, 做一个系统配置。看到这,我相信大家应该都有一个大概了, 怎么做心里应该有点数了, 还有一个没说到的就是, 礼物发送之后是需要让所有人看到的, 这样我们就需要做消息广播了, 这个可以使用 IM 实现, 后面再说

直播回放

因为直播是在线看的, 用户又不一定每次都有时间在某个点去看, 所以回放也变成了直播类app开发必不可少的功能。在云直播的功能配置里面有录制配置,每次直播完后的视频会保存到云点播里面,那这个视频是需要和用户绑定的, 所以提供了回调给我们,当直播断流时会回调我们的接口,将本次录播的文件等信息传递给我们,我们进行保存。

那么直播类app开发还可以利用点播做一个类似抖音的东西, 我们可以让用户上传视频到云点播、直播视频保存在云点播,做一个视频列表,向下滑动来观看,只要将视频和用户关联起来就可以了。可以做的很多,就不一一介绍了

声明:本文由云豹科技转发自憧憬博客,如有侵权请联系作者删除

直播类app开发,如何实现直播的相关功能相关推荐

  1. iOS 直播类APP开发流程

    (一) iOS 直播类APP开发流程分解: 1 . 音视频处理的一般流程: 数据采集→数据编码→数据传输(流媒体服务器) →解码数据→播放显示 1.数据采集: 摄像机及拾音器收集视频及音频数据,此时得 ...

  2. 分析一下,直播类app开发需要哪些技术

    直播技术总结 直播总结 1.概述 关于直播类app开发的技术文章不少,成体系的不多.我们将用这篇文章,更系统化地介绍当下大热的视频直播各环节的关键技术,帮助视频直播创业者们更全面.深入地了解视频直播类 ...

  3. 直播类app开发,实现一个进度条效果

    进度条是很多软件中必须存在的效果,今天我们就看看直播类app开发实现的进度条效果. 效果&使用 图例分别为: 修改读条起点为y轴正方向 消失性读条 正常读条 使用: 1 在xml中添加控件 & ...

  4. (转载)iOS直播类APP开发流程

    转载自博主:iOS_developer_zhong,博客地址: http://blog.csdn.net/zhonggaorong/article/details/51483282 本文为大家分享了i ...

  5. 直播类app开发的开屏广告是怎样实现的

    直播类app开发时,技术人员需要注意一个功能,那就是开屏广告,接下来就分析一下直播类app开发是怎样实现开屏广告的. 一) 开屏广告 效果如下 支持网络资源缓存策略 支持本地和网络6种类型广告 本地i ...

  6. 直播交友app开发,一对一视频直播聊天APP定制,语音直播交友软件源码

    直播类app近两年十分受欢迎,一对一视频直播交友,直播交友app目前主要是语音直播间陪玩,视频直播间打赏,pk,视频相亲,七人语音直播间,多人视频直播间,语音直播交友软件源码! 1,首页主播列表:包含 ...

  7. iOS直播类APP开发流程解析

    前言 个人认为要想把直播从零开始做出来,绝对是牛逼中的牛逼,大牛中的大牛,因为直播中运用到的技术难点非常之多,视频/音频处理,图形处理,视频/音频压缩,CDN分发,即时通讯等技术,每一个技术都够学几年 ...

  8. iOS 直播类APP开发流程解析

    1 . 音视频处理的一般流程: 数据采集→数据编码→数据传输(流媒体服务器) →解码数据→播放显示 1.数据采集:摄像机及拾音器收集视频及音频数据,此时得到的为原始数据 涉及技术或协议: 摄像机:CC ...

  9. iOS 直播类APP开发流程分解:

    1 . 音视频处理的一般流程: 数据采集→数据编码→数据传输(流媒体服务器) →解码数据→播放显示 1.数据采集:摄像机及拾音器收集视频及音频数据,此时得到的为原始数据 涉及技术或协议: 摄像机:CC ...

最新文章

  1. SAP MM 可以不用创建盘点凭证直接录入盘点结果?
  2. Failed to load JavaHL Library(windows和mac)
  3. sublime使用笔记
  4. Golang 一些基本功能使用记录
  5. 日常生活 -- UNIX再学习告一段落
  6. P1115 最大子段和
  7. 深度讲解spring的循环依赖以及三级缓存
  8. 【洛谷4001】 [ICPC-Beijing 2006]狼抓兔子(最小割)
  9. Cannot find source code based button in SE24 - modification assistant
  10. 细说Golang的JSON解析
  11. matlab中ndims函数,matlab中的size(),length(),ndims()函数的用法
  12. 编码神器 Sublime Text 包管理工具及扩展大全
  13. Centos 6.4 安装erlangrabbitmq
  14. 通信行业最齐全的英语缩语手册
  15. 【电子实验2】简单电子门铃
  16. 网页制作:制作一个官网
  17. VR火得不行 那么它商业化的突破点到底在哪里?
  18. excel表格,如何按编号换行
  19. 计算机无共放怎么播放音乐,笔记本电脑怎么放歌没声音
  20. 王阳明心学 量子物理_量子物理学论文的文本分类

热门文章

  1. 阿里云的WEB应用防火墙(WAF)能抵挡什么攻击
  2. 微信小程序实现手机屏幕左右旋转,页面元素左右移动,小程序加速计
  3. C#操作Excel文件(读取Excel,写入Excel)
  4. 详细分析关于Ip地址计算的题目。
  5. 开源项目Krita学习(二)
  6. python调用有道翻译_Python调用有道翻译
  7. PS四种扁平化设计风格
  8. 随机梯度下降(SGD)
  9. 如何用宏定义的方式实现MAX(A,B),MAX(A,B,C),MAX(A,B,C,D)
  10. python 拆分excel工作表_Python几行代码轻松拆分表格