前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【云+社区年度征文】云直播:基于API+SCF+Redis实现流状态同步和查询

【云+社区年度征文】云直播:基于API+SCF+Redis实现流状态同步和查询

原创
作者头像
bellchen
修改2021-06-01 10:24:32
2.7K0
修改2021-06-01 10:24:32
举报

导读:无论是秀场直播,还是直播带货,App中获取正在推流直播间,以及查询某直播间是否正在推流,是很有必要的,App需要列出所有在线直播间,进入直播间后,需要查询当前房价是否正在推流,若已下播则提示观众“直播已结束”,在后台开发中,该如何查询直播流状态呢

一般情况下,直播流有三种状态:active活跃、inactive非活跃、forbid禁播,当主播上线推流了之后,该直播间就处于活跃状态,当主播下线断流了之后,就处于非活跃状态,或叫做断流状态;

在直播场景下,了解一个直播间当前是否正在推流是很重要的,用户打开APP之后,需要给他展示当前活跃的直播间列表,当直播断流之后,需要把该流从列表中移除,当进入主播页面时,需要提示用户该主播是否直播中

直播流状态的作用
直播流状态的作用

获取流状态

那么该怎么获取直播流状态呢?

腾讯云直播提供了两种方式获取,一种是主动查询,一种是被动接收事件通知;

主动查询:

主动查询是基于云API提供出来的,接口是DescribeLiveStreamState,查询频率限制为300次每秒,以及查询直播中的流接口DescribeLiveStreamOnlineList,查询频率限制也是300次每秒,如果每个用户打开App之后都请求一下腾讯云API,300次/秒的QPS肯定是不够的,而且随着用户的增长,这个QPS就更加不够了。

被动通知:

腾讯云提供了直播事件回调服务,每当主播开始推流或停止断流,腾讯云会以http+post形式发生一条消息给服务器,服务器以此实时感知直播流状态,具体细节可以看下云直播的文档:如何接收事件通知,虽然腾讯云提供了重试来保证消息通知可靠性,但如果我的服务器出现问题,或域名解析异常等各种不可预知因素,导致无法正常接收事件通知,那么我就无法拿到正确的直播流状态了。

事件通知流程
事件通知流程

解决方案:

考虑到各种因素,可以将两个方式联合使用,大概流程分为两个阶段:

1、业务服务器接收云直播推流断流事件后,写缓存,记录流状态,;

2、当用户过来查询流状态时,判断流状态和上次更新时间,若在2分钟内,则直接返回流状态,若在2分钟以外,则调用接口查询流状态,返回给用户同时更新缓存信息。

阶段一:主播上下线被动通知

主播推流断流
主播推流断流

这个阶段主要分为几个步骤:

1、主播登录APP,请求服务器获取推流地址,推流地址生成规则见文档:自主拼装直播 URL

2、获取到推流地址后,传递给移动直播SDK实现推流,云直播收到音视频数据:摄像头推流 ,也可以使用其他推流SDK;

3、云直播在收到音视频数据后,通过 推流事件通知 发送HTTP请求到业务服务器;

4、服务器收到推流通知后,在云Redis中记录流上线以及最近更新时间(也可用其他方案实现缓存服务);

5、当主播下播后,移动直播SDK断开推流,云直播收到推流SDK主动断流命令,通过断流事件通知 发送HTTP请求到业务服务器;

6、云服务器收到断流通知后,在云Redis中记录流下线以及最近更新时间;

基于云API网关+SCF+Redis实现

整体架构图如下

步骤0:前提条件

  1. 已开通腾讯云直播服务
  2. 已准备好云直播推流和播放域名,并完成域名备案;

步骤1:购买云Redis

购买云Redis,相关指引参考官网文档,不再赘述: https://cloud.tencent.com/document/product/239/30871

记录云Redis的内网IP端口登录密码所属网络所在子网,云Redis的配置已完成

步骤2:新建SCF

  1. 登录 云函数控制台,单击左侧导航栏的【函数服务】。
  2. 在主界面上方选择期望创建函数的地域,并单击【新建】,进入函数创建流程,选择运行环境为Python3.6,以空白函数方式创建,点击下一步后,按需填写内容,点击完成即可。

步骤3:新建云API网关

  1. 登录API网关控制台
  2. 在左侧导航栏,单击【服务】,进入服务列表页。
  3. 在当前地域下,单击页面左上角的【新建】,新建一个服务。填写服务名为“livecallback” 【可自定义名称】,根据需要选择前端类型为http和https,勾选公网访问方式,点击提交即可
新建API网关
新建API网关

步骤4:新建通用API

1、在API网关控制台的左侧导航栏,单击【服务】,进入服务列表页

2、在刚刚创建的API网关服务右边操作按钮中,点击“配置管理”进入基础配置页面,切换到管理API选项卡。

3、在通用API中,点击新建,进入新建API流程。

4、API名称填写livecb,前端类型按需选择http和https,路径填 /livecb/ ,请求方法选POST免鉴权,点击下一步

新建API
新建API

5、进入后端配置页,后端类型选择云函数SCF,命名空间按需选择default,名称选择刚刚创建的云函数livecb勾选响应式集成,点击下一步

后端配置
后端配置

6、在响应结果页,直接点击完成,弹窗提示是否发布,点击发布服务

发布服务
发布服务

7、【可选】配置自定义域名,操作步骤见文档 https://cloud.tencent.com/document/product/628/11791

至此,云API网关的配置已经完成。

步骤5:云直播回调配置

1、在API网关控制台的左侧导航栏,单击【服务】,进入服务列表页

2、在刚刚创建的API网关服务右边操作按钮中,点击“配置管理”进入基础配置页面,

3、复制公网访问地址中的https部分,拼接直播回调地址

代码语言:javascript
复制
1、假设复制的地址为:https://service-xx-1253000000.gz.apigw.tencentcs.com:443
2、则回调地址为 https://service-xx-1253000000.gz.apigw.tencentcs.com:443/livecb/

4、登录 云直播控制台

5、在左侧菜单栏选择【事件中心】>【直播回调】

6、单击 【+】创建回调模板,在回调设置弹框中填写完成回调信息,单击【保存】即可。

模版名称按需填写:测试回调模版

回调密钥请填写随机字符串:593a4fcbd02c36c515d712557c120ba8

推流回调和断流回调填写刚刚拼接的回调地址:https://service-xx-1253000000.gz.apigw.tencentcs.com:443/livecb/ 此地址请根据实际情况填写,请勿直接复制

新建直播回调模板
新建直播回调模板

7、弹框提示绑定域名,点击去绑定域名

去绑定域名
去绑定域名

8、在绑定域名页面,选择所需要的推流域名,这里选择默认推流域名,然后点击确定完成

回调模版绑定推流域名
回调模版绑定推流域名

至此,云直播的配置已经完成。

步骤6、完成SCF云函数的代码编写

1、登录 云函数控制台,单击左侧导航栏中的【函数服务】。

2、选择刚刚创建的云函数livecb,点击函数名进入后,切换到函数配置选项卡,点击右侧编辑按钮;

3、在环境变量中,添加如下变量,然后点击保存

代码语言:javascript
复制
redisHost:172.16.0.44  #此处填写步骤2中你购买的redis内网IP
redisPort:6379  #此处填写步骤2中你购买的redis内网端口
redisPassword:*****  #此处填写为步骤2中购买的redis的登录密码
liveCallbackKey:593a4fcbd02c36c515d712557c120ba8  #此处填写步骤5中你配置的回调密钥
配置环境变量
配置环境变量

4、勾选私有网络,选择刚刚购买的Redis所在的VPC和子网

5、下载代码附件到本地

6、切换到函数代码选项卡,选择提交方法为“本地上传zip包”,选择刚刚下载的附件,然后点击保存按钮。

自此,阶段一已经实现,可以通过云直播推流断流验证方案实现情况

阶段二:查询流状态

观众进入主播个人页,查询主播流状态
观众进入主播个人页,查询主播流状态

这个阶段主要分为几个步骤:

1、观众进入主播个人主页,查询主播是否在开播(流状态)

2、业务服务器收到查询请求,并且查询云Redis当前流状态;

3、若流状态最近更新时间为2分钟以内,则直接返回流状态;

4、若流状态最新更新时间在2分钟以外,调用云API接口查询流状态,获取最新状态;

5、更新Redis流状态以及最近更新时间;

基于云API网关+SCF+Redis实现

下面步骤和上面的有点类似,但有些地方不大一样,不建议复用之前创建的API网关和云函数

步骤1:新建SCF用于查询

1、登录 云函数控制台,单击左侧导航栏的【函数服务】。

2、在主界面上方选择期望创建函数的地域,并单击【新建】,进入函数创建流程,选择运行环境为Python3.6,以空白函数方式创建,点击下一步后,按需填写内容,点击完成即可。

新建查询操作所需云函数
新建查询操作所需云函数

步骤2:新建云API网关

  1. 登录API网关控制台
  2. 在左侧导航栏,单击【服务】,进入服务列表页。
  3. 在当前地域下,单击页面左上角的【新建】,新建一个服务。填写服务名为“livecallback” 【可自定义名称】,根据需要选择前端类型为http和https,根据需要勾选公网或内网VPC方式,点击提交即可
新建用于查询的API网关
新建用于查询的API网关

步骤3:新建通用API

1、在API网关控制台的左侧导航栏,单击【服务】,进入服务列表页

2、在刚刚创建的API网关服务右边操作按钮中,点击“配置管理”进入基础配置页面,切换到管理API选项卡。

3、在通用API中,点击新建,进入新建API流程。

4、API名称填写livestat;前端类型按需选择http和https;路径填 /livestat/ ;请求方法选GET;按需选择鉴权类型;点击下一步

新建用于查询流状态的API
新建用于查询流状态的API

5、进入后端配置页,后端类型选择云函数SCF,命名空间按需选择default,名称选择刚刚创建的云函数livestat勾选响应式集成,点击下一步

后端配置
后端配置

6、在响应结果页,直接点击完成,弹窗提示是否发布,点击发布服务

发布服务
发布服务

步骤4:新建运行角色

1、登录访问管理控制台,单机左侧导航栏中的【策略】。

2、点击新建自定义策略,选择【按策略生成器创建】

新建自定义策略
新建自定义策略

3、进入创建自定义策略流程,

效果(Effect)选择【允许

服务选择【云直播(live)】;

操作(Action)选择【DescribeLivestreamState】;

资源(Resource)填写 * qcs::live:::domain/xxx.livepush.myqcloud.com

其中live为直播推流路径,一般为live,如果你的推流路径非live,则按需填写

其中xxx.livepush.myqcloud.com 为阶段一步骤5第8点所绑定的推流域名

添加声明
添加声明

4、点击【添加声明】,点击【下一步】填写策略名称为policygen-scf-livestat点击【完成】

5、点击左侧导航中的【角色】、点击【新建角色】、选择【腾讯云产品服务】

新建角色
新建角色

6、进入新建自定义角色流程

支持角色的服务中,勾选云直播(live),云函数(scf),点击【下一步】

输入角色载体信息
输入角色载体信息

选择策略,搜索刚刚创建的策略policygen-scf-livestat,勾选并点击【下一步】

配置角色策略
配置角色策略

角色名称按需填写:scf-livestat,点击【完成】

输入角色名称
输入角色名称

步骤5:完成SCF云函数的代码编写

1、登录 云函数控制台,单击左侧导航栏中的【函数服务】。

2、选择刚刚创建的云函数livestat,点击函数名进入后,切换到函数配置选项卡,点击右侧编辑按钮;

3、勾选运行角色,选择刚刚创建的角色scf-livestat

启用运行角色
启用运行角色

4、在环境变量中,添加如下变量,然后点击保存

代码语言:javascript
复制
redisHost:172.16.0.44  #此处填写阶段一步骤2中你购买的redis内网IP
redisPort:6379  #此处填写阶段一步骤2中你购买的redis内网端口
redisPassword:*****  #此处填写阶段一步骤2中购买的redis的登录密码
streamStateTimeout:120 #此值为流状态超时更新时间
appName:live #一般为live,如果你的推流路径非live,则按需填写
domainName:****.livepush.myqcloud.com #此处填写阶段一步骤5第8点所绑定的推流域名

5、勾选私有网络,选择刚刚购买的Redis所在的VPC和子网

配置环境变量和私有网络
配置环境变量和私有网络

6、下载代码附件到本地

7、切换到函数代码选项卡,选择提交方法为“本地上传zip包”,选择刚刚下载的附件,然后点击保存按钮。

自此,阶段二已经实现,可以通过云API网关所允许的方式发起HTTP请求验证

本文中API网关 livestat只勾选了内网访问,未开放外网调用

登录同一个子网的一台CVM,通过curl测试可验证服务可用性:

在同一个子网下的CVM发起请求验证服务可用性
在同一个子网下的CVM发起请求验证服务可用性

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 获取流状态
  • 主动查询:
  • 被动通知:
  • 解决方案:
  • 阶段一:主播上下线被动通知
  • 基于云API网关+SCF+Redis实现
    • 步骤0:前提条件
      • 步骤1:购买云Redis
        • 步骤2:新建SCF
          • 步骤3:新建云API网关
            • 步骤4:新建通用API
              • 步骤5:云直播回调配置
                • 步骤6、完成SCF云函数的代码编写
                • 阶段二:查询流状态
                • 基于云API网关+SCF+Redis实现
                  • 步骤1:新建SCF用于查询
                    • 步骤2:新建云API网关
                      • 步骤3:新建通用API
                        • 步骤4:新建运行角色
                          • 步骤5:完成SCF云函数的代码编写
                          相关产品与服务
                          云直播
                          云直播(Cloud Streaming Services,CSS)为您提供极速、稳定、专业的云端直播处理服务,根据业务的不同直播场景需求,云直播提供了标准直播、快直播、云导播台三种服务,分别针对大规模实时观看、超低延时直播、便捷云端导播的场景,配合腾讯云视立方·直播 SDK,为您提供一站式的音视频直播解决方案。
                          领券
                          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档