导读:无论是秀场直播,还是直播带货,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:购买云Redis
购买云Redis,相关指引参考官网文档,不再赘述: https://cloud.tencent.com/document/product/239/30871
记录云Redis的内网IP、端口、登录密码、所属网络、所在子网,云Redis的配置已完成
步骤2:新建SCF
- 登录 云函数控制台,单击左侧导航栏的【函数服务】。
- 在主界面上方选择期望创建函数的地域,并单击【新建】,进入函数创建流程,选择运行环境为Python3.6,以空白函数方式创建,点击下一步后,按需填写内容,点击完成即可。
步骤3:新建云API网关
- 登录API网关控制台。
- 在左侧导航栏,单击【服务】,进入服务列表页。
- 在当前地域下,单击页面左上角的【新建】,新建一个服务。填写服务名为“livecallback” 【可自定义名称】,根据需要选择前端类型为http和https,勾选公网访问方式,点击提交即可
步骤4:新建通用API
1、在API网关控制台的左侧导航栏,单击【服务】,进入服务列表页。
2、在刚刚创建的API网关服务右边操作按钮中,点击“配置管理”进入基础配置页面,切换到管理API选项卡。
3、在通用API中,点击新建,进入新建API流程。
4、API名称填写livecb,前端类型按需选择http和https,路径填 /livecb/ ,请求方法选POST,免鉴权,点击下一步
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网关
- 登录API网关控制台。
- 在左侧导航栏,单击【服务】,进入服务列表页。
- 在当前地域下,单击页面左上角的【新建】,新建一个服务。填写服务名为“livecallback” 【可自定义名称】,根据需要选择前端类型为http和https,根据需要勾选公网或内网VPC方式,点击提交即可
步骤3:新建通用API
1、在API网关控制台的左侧导航栏,单击【服务】,进入服务列表页。
2、在刚刚创建的API网关服务右边操作按钮中,点击“配置管理”进入基础配置页面,切换到管理API选项卡。
3、在通用API中,点击新建,进入新建API流程。
4、API名称填写livestat;前端类型按需选择http和https;路径填 /livestat/ ;请求方法选GET;按需选择鉴权类型;点击下一步
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、下载代码附件到本地
7、切换到函数代码选项卡,选择提交方法为“本地上传zip包”,选择刚刚下载的附件,然后点击保存按钮。
自此,阶段二已经实现,可以通过云API网关所允许的方式发起HTTP请求验证
本文中API网关 livestat只勾选了内网访问,未开放外网调用
登录同一个子网的一台CVM,通过curl测试可验证服务可用性: