常见案例:
主播自由开播(UGC OGC)解决方案,是指主播可以随时拿起手机开始直播,映客、花椒、斗鱼、Now 等直播平台都是采用这种直播解决方案。由于LiteAVSDK的高解耦性,终端sdk只提供了TXLivePusher、TXLivePlayer的上行推流组件和下行拉流组件,自由开播方案需要您关注 房间管理 相关的逻辑,也就是维护一个所有用户可见的“直播间列表”。
针对房间列表的管理和维护,无外乎增(ADD)、删(DELETE)、改(MODIFY)、查(QUERY)四个操作:
实现步骤:
ADD:房间开播
当一个主播开播前需要先申请创建一个直播房间,这就等于是在您服务器的房间列表中增加一条新的数据。
- step1:主播请求开播(Client -> Server) Client 需要把主播的账号ID、直播间标题、直播封面URL、地理位置(非必须)等等信息统一提交给您的 Server。
- step2:Server预创建房间(Server -> Client) Server 要在直播间列表中添加一条记录,并将其状态设置为 “等待开播(unactive)”,在 Server -> Client 的回包中需要返回推流 URL,这是主播开播所必须的。
- step3:主播开始推流(TXLivePusher) Client 在拿到推流 URL 后,就可以交给 SDK 开始推流,SDK 会将推流成功与否的情况通过 TXLivePushListener 回调通知给您的代码。
- step4:主播确认开播(Client -> Server) 主播并不一定能够成功推流,比如:推流用的端口 1935 被所处网络的安全防火墙禁用了,或者是 App刚刚安装,在看到摄像头权限申请提示时误点了拒绝。所以,step4 的目的就是在 Cleint 收到 SDK 的推流成功事件(ID: 1003)后,再通知后台把房间状态从 “等待开播(unactive)” 切换到 “正在直播(active)”。
DELETE:关闭房间
直播结束后,Client 要通知后台把当前房间状态修改为 “直播已结束(close)”,或者干脆将其从列表中删除。
- step1:主播停播(Client -> Server) 主播停播时,Client 要通知服务器停播的直播流 ID,服务器可以把对应的房间状态改成 “直播已结束(close)”,或直接将其从房间列表删除。
- step2:解决黑屏房间(Server -> 腾讯云) 如果主播的手机意外断网,或者 App 意外崩溃了,Client 会丧失通知服务器的机会,从而在房间列表中残留一些黑屏房间(主播已经没法推流了,但是没有人关闭这些房间,所以观众进入房间后看到的是黑屏)。
您的 Server 可以通过腾讯云 REST API(LiveChannelGetStatus)定时(推荐 10s 一次)地检查所有 “正在直播(active) ” 状态中的房间是不是真的都是“正在推流”状态。如果某个房间在连续三次的查询结果中均为“离线”状态,Server 就可以判定其为 “黑屏房间” 并将其关闭了。
SDK 在网络短暂断开又恢复后会自动重连,重连期间您查询到的房间状态可能不准确,所以推荐以三次查询结果均为“离线”作为最终判定结论。
MODIFY:房间信息
很多场景下,我们都需要修改某一个房间的信息,比如:
- 加观众数(Client -> Server) 当有新的观众加入时,意味着某个房间的观众数要 1,可以让 App 的观众端在进入房间时向 Server 发送一次累加请求。
- 加点赞数(Client -> Server) 当有观众给主播点赞,意味着某个房间的点赞数要 1,可以让 App 在点赞按钮的响应函数中向 Server 发送一次累加请求。
补充:完整的点赞实现方案还要用聊天室的消息通道将点赞消息广播给所有的观众。
- 违规禁播(Server -> 腾讯云) 当监管人员发现某一房间内容涉及违规行为时,需要对其禁播,意味着该房间的状态要改为 “直播已结束(close)”,同时,禁播需要您的 Server 通过 REST API 开启关闭推流 通知腾讯云立刻中断推流。
补充:腾讯视频云的鉴黄服务,是通过定时截图的方式,帮您甄别众多直播间中是否有疑似涉黄的直播流,并将嫌疑直播流的 ID 通过您指定的地址通知给您的后台 Server。这项服务目前还处于 beta 阶段,暂不支持自助开通,如有请通过 400 电话或者工单联系我们。
QUERY:房间列表
每一个打开App的观众,都会到直播后台查询一下当前的房间列表,所以直播后台要提供列表拉取的相关接口供 App 使用。
- 注意分页逻辑 如果列表中房间数量比较多,比如100个以上,就推荐要加上分页逻辑了,分页逻辑对于减少服务器压力,提高列表展示速度方面非常有帮助。
- 拼装播放地址 有了直播码(或者房间ID),播放地址就可以简单拼装出来,下图是用直播码 8888test12345_test 拼装出来的rtmp flv 和 hls 三种播放地址,App拿到播放URL后就可以直接丢给腾讯云的RTMP SDK进行播放:
- 不要 在 Client 拼装播放地址 播放地址要由服务器下发,而不是 Client 拼装,这样能让您的系统更具灵活性。随着业务的发展,您可能会考虑在播放端增加播放防盗链,避免您的直播视频被盗用,而播放防盗链签名只有可能在服务器签发,故客户端拼装逻辑根本无法满足这个需求。
FAQ
1、上面这套方案,腾讯有演示demo吗?
答:有,扫码下载小直播app体验;或者部署前后台源码,修改配置文件,拥有自己的小直播app。
2、文档里面只提到的房间管理,不涉及到连麦PK,请问连麦PK要如何管理前后台。
答:可以参考云直播连麦实现原理。
腾讯云通信连麦的核心在于后台混流、低延时互通,当产品需求只有2人连麦时,房间里面两位主播同步状态略显复杂:比如需要注意连麦时发起混流、取消连麦时发起取消混流、小主播退出时其他主播停止拉取他的低延时流等等。这种需求,一般的研发团队可以轻松胜任。
但是如果连麦人数大于2人,需要3~8人连麦,那么每增加一个人,房间里面的主播状态同步复杂度将会倍增,处理不好很容易出现混乱:比如主播D已经退房了,主播B、C收到了退房通知,停止播放D的画面,但是主播A没收到通知,依然保持与D连麦,界面上D的画面一直是黑的,混流出去的cdn流,观众们看到的画面D也是一个黑窗口。这种缺陷想要避免,需要周密的后台管理逻辑。
腾讯云提供了后台roomservice连麦方案,配套终端MLVBLiveRoom方案,可以轻松实现上述连麦过程。