移动直播自由开播方案

常见案例:

主播自由开播(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方案,可以轻松实现上述连麦过程。

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

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

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Qt项目实战

Qt编写安防视频监控系统10-视频轮询

视频轮询在视频监控系统中是一个基础的核心功能,尤其是上了大屏以后,这个功能是必须的,根据预先设定的轮询间隔逐个加载视频到预先设定的通道画面数中,轮询间隔、轮询画...

13940
来自专栏Qt项目实战

Qt编写安防视频监控系统9-自动隐藏光标

这个效果的灵感来自于大屏电子看板系统,在很多系统中尤其是上了大屏的时候,其实在用户不在操作的时候,是很不希望看到那个鼠标箭头指针的,只有当用户操作的时候才显示出...

12320
来自专栏Qt项目实战

Qt编写安防视频监控系统11-动态换肤

Qt中的动态换肤技术是非常一流的,直接调用qApp->setStyleSheet(qss);就可以对整个应用程序进行换肤,如果样式表内容不多,或者对应的贴图不对...

13740
来自专栏Qt项目实战

Qt编写安防视频监控系统1-通道切换

通道切换在视频监控系统中是最基础的必备功能,一般都会提供1通道+4通道+6通道+8通道+9通道+16通道这几个通道切换,可能做得比较好的还会提供24通道+32通...

14140
来自专栏Qt项目实战

Qt编写安防视频监控系统4-删除视频

一般会有两种处理方式来删除视频,一种是鼠标右键菜单,删除当前视频或者删除所有视频,一种是直接按住当前视频,移到视频通道界面以外就表示删除当前视频,这也是个比较人...

9220
来自专栏Qt项目实战

Qt编写安防视频监控系统5-视频回放

一般视频回放都会采用GB28181国标来处理,这样可以保证兼容国内各大厂家的NVR,毕竟在同一的国家标准下,大家都会统一支持国标的,就不需要根据各个厂家的SDK...

18840
来自专栏Qt项目实战

Qt编写安防视频监控系统8-双击节点

在所有的视频监控系统中,双击摄像机的节点,对应摄像机加载到当前焦点通道显示,这个都是必须具备的功能,还有一些厂家会做双击NVR节点,自动加载该NVR下的所有摄像...

9120
来自专栏Qt项目实战

Qt编写安防视频监控系统6-面板开关

面板开关功能是整个系统最人性化的功能之一,可以对主界面中左侧右侧的各个小面板进行显示和隐藏,当隐藏的时候,另外的同级面板自动拉伸填充,这样就不会显得空洞,直接在...

9930
来自专栏Qt项目实战

Qt编写安防视频监控系统3-通道交换

最开始写通道交换的功能的时候,走了很多弯路,比如最开始用最初级的办法,触发交换的时候,先关闭视频,然后设置新的url重新打开视频,这样处理非常低级而且耗内存还卡...

13230
来自专栏Qt项目实战

Qt编写安防视频监控系统2-视频播放

视频播放功能是核心功能之一,为了统一管理接口,统一封装成一个控件,对外提供seturl open close方法即可,不用去管内部的具体处理,这样就可以提供多种...

15220

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励