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

2021-06-01 10:24:32 浏览数 (1)

导读:无论是秀场直播,还是直播带货,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、下载代码附件到本地

阶段一代码.zip

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.myzijiebao.com

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

其中xxx.livepush.myzijiebao.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.myzijiebao.com #此处填写阶段一步骤5第8点所绑定的推流域名

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

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

6、下载代码附件到本地

阶段二代码.zip

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

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

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

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

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

0 人点赞