MLVBLiveRoom直播PK方案

功能介绍

主播 PK 是在秀场直播场景中经常使用的一种吸引热度的方式,两个分处不同房间的主播可以相互分屏连麦(视频通话),主播与主播之间的延迟可以达到 500ms 以内,而观众在不需要切换流地址的情况下,就可以在原来的 CDN 直播流中看到主播 PK 的效果。

MLVBLiveRoom

主播 PK 是 MLVBLiveRoom 组件的一项基本功能(MLVBLiveRoom 还支持观众同主播连麦),它分成 Client 和 Server 两个部分:

  • 终端部分(Client) MLVBLiveRoom 组件的终端部分是对腾讯视频云 LiteAVSDK(主要用于音视频,包括 TXLivePusher、TXLivePlayer 等接口) 和 IMSDK (主要用于收发消息,包括 TIMManager 和 TIMConversation 等接口)的封装。直接使用 LiteAVSDK 和 IMSDK 实现直播 + 主播PK功能是非常耗时耗力的,但通过 MLVBLiveRoom 组件,您可以直接调用 createRoom,enterRoom 和 leaveRoom 等接口就可以完成您想要的直播 + 主播PK功能。
  • 后台部分(Server) RoomService 是 MLVBLiveRoom 对应的后台组件,其职责有两个:一是房间管理(直播间的增、删、改、查)和成员管理(维护房间里有几个人正在推流,主要是连麦场景下使用,主播PK场景暂未使用);二是对腾讯云直播服务、实时音视频服务以及 IM 云通讯服务的控制(主要通过腾讯云的后台 REST API 进行调用)。

终端对接

step1: 下载 SDK 开发包

  • LiteAV SDK 位于 ZIP 包解压后的 SDK 文件夹中,用于实现音视频相关功能
  • IM SDK 位于 ZIP 包解压后的 SDK 文件夹中,用于实现 IM 通讯相关功能
  • MLVBLiveRoom 位于 ZIP 包解压后的 Demo \ lvb 文件夹中,代码开源,方便您进行调试和定制。

step2: 登录(login)

MLVBLiveRoom 单靠一个终端的组件无法独自运行,它依赖一个后台服务为其实现房间管理和状态协调,这个后台服务我们称之为房间服务RoomService)。而要使用这个房间服务,MLVBLiveRoom 就需要先进行登录(login)。

step3: 获取房间列表(getRoomList)

不管是主播还是观众,都需要有一个房间列表,调用 MVLBLiveRoom 的 getRoomList 接口可以获取到该列表。列表中每一个房间都有其对应的 roomInfo,是在 createRoom 时传入的,推荐您将 roomInfo 定义为 json 格式,这样可以有很强的扩展性。

如果您希望使用自己的房间列表,这一步可以省略,但是需要您在 step 4 中自行指定 roomID,且全局不能有重复。

step4: 主播开播(createRoom)

主播要开播,需要先调用 MVLBLiveRoom 的 startLocalPreview 接口开启本地摄像头预览,该函数需要传入一个 view 对象,该对象用于显示摄像头的视频影像。这期间 MLVBLiveRoom 会申请摄像头使用权限,同时,主播也可以对着摄像头调整一下美颜和美白的具体效果。

之后,通过调用 createRoom 接口,MLVBLiveRoom 会在后台的房间列表中新建一个直播间,同时主播端会进入推流模式。

参数roomID 如果您在调用 createRoom 时不填写 roomId,后台会为您分配一个 roomID, 并通过 createRoom 的回调接口返回给您。如果您希望自己管理房间列表,roomID 可以由您的服务器分配,那么只需要在调用 createRoom 时填写您后台分配的 roomId 即可。

step5: 观看直播(enterRoom)

观众通过 MLVBLiveRoom 的 enterRoom 接口可以进入直播间观看视频直播,enterRoom 函数需要传入一个 view 对象,用于显示直播流的视频影像。

另外,进入房间后,调用 MLVBLiveRoom 的 getAudienceList 接口可以获取观众列表,这里的列表不是全量数据,如果少于30 个人就全部返回,如果多于 30 个人,就只返回新进入的 30 个人。(出于性能方面的考虑, 而且 UI 界面上最多能也就能放下 10 个头像。)

step6: 主播PK(sendPKRequest)

主播PK是两个房间的主播在直播的同时,互相拉取对方的视频流,建立实时视频通话互动,每个房间的观众都可以看到两个主播互动的过程,流程图如下:

a. 选择目标主播

调用 getRoomList 获取当前正在直播的主播列表, 返回在线主播的详细信息,包含昵称、头像、用户ID等;然后显示一个 UI 列表,以便选择一个主播进行PK。

b. 启动 PK
  • 第一步(主播一):调用 sendPKRequest ,向主播二发起 PK 请求。
  • 第二步(主播二):会收到 onRecvPKMessage回调通知,之后可以展示一个 UI 提示,询问主播二要不要接受 PK。
  • 第三步(主播二):可以调用 responseRoomPK接受 PK 请求(accept),也可以拒绝 PK 请求;如果接受了 PK 请求(reject),请同时调用 startPK 播放主播一的视频流。
  • 第四步(主播一):通过 RequestPKCallback 可以了解到 PK 请求是否被接受。
  • 第五步(主播一):如果 PK 请求被接受,请调用 startPK 播放主播二的视频流。

函数 PlayPK 除了完成拉流播放的功能;同时会触发后台混流,即把对方主播的视频流叠加到自己的流上。普通观众不需要重新拉流,可以自动观看到两个主播PK的视频画面。

c. 结束 PK

主播PK过程中,任何一方都可以主动结束PK,假设主播一主动结束PK

  • 第六步(主播一):调用 sendC2CCustomMessage(stop) ,向主播二发起结束 PK 的请求;同时调用 stopRemoteView结束播放主播二的视频流。
  • 第七步(主播二):会收到 onRecvPKMessage回调通知。
  • 第八步(主播二):调用 stopPK 结束播放主播一的视频流。

函数 stopPlayPKStream 除了结束播放视频流,同时会取消后台混流。普通观众不需要重新拉流,可以自动切换到直播模式。

step7: 弹幕消息(sendMsg)

MVLBLiveRoom 自带了消息发送接口,可以通过 sendRoomTextMsg 函数发送普通的文本消息(用来弹幕),也可以通过sendRoomCustomMsg 发送自定义消息(用于点赞,送花等等)。

通过 IMLVBLiveRoomListenerCallback 里的 onRecvRoomTextMsgonRecvRoomCustomMsg 可以收取聊天室里别人发来的文本消息和自定义消息。

注意 腾讯云 IM 每秒钟最多可以收取 40 条以上的消息,如果您要把所有这些消息都按照接收频率刷新到屏幕 UI 上,那您的直播体验一定是非常卡顿的,这里一定要注意刷新频率控制。 有太多的客户在测试期间顺顺利利,APP一上线就卡的不行,都是这个原因导致的。

后台对接

MLVBLiveRoom 为什么需要 login?

MLVBLiveRoom 单靠一个终端的组件无法独自运行,它依赖一个后台服务为其实现房间管理和状态协调,这个后台服务我们称之为房间服务RoomService)。而要使用这个房间服务,MVLBLiveRoom 就需要先进行登录(login)。

选择【云直播控制台】>【直播SDK】>【应用管理】,单击【创建应用】开始创建一个新的应用。

说明: 这一步的目的是创建一个 TIM 即时通信 IM 应用,并将当前直播账号和即时通信 IM 应用绑定起来,即时通信 IM 应用主要提供聊天室和连麦互动的能力。

获得 login 所需参数

RoomService 需要终端调用 login(loginInfo, callback) 登录成功后才能使用,其中loginInfo中sdkappid、userid、userName、userAvatar四个信息都可以在客户端写死,但是 UserSig 必须由您的后台服务器签发,因为让 Client 计算 UserSig 就需要将签名私钥写在终端的代码里,这会有私钥被 hack 窃取的安全风险。

RoomService 所使用的 UserSig 的签发同 IM 云通讯服务是一样的,所以同一个 UserSig 既可以用来登录 IM,又可以用来登录 RoomService,您可以参考文档 派发UserSig 进行接入。

实现原理

1. 两种“通道”

腾讯云采用了两套通道实现直播+主播PK功能,其中直播采用标准的 (RTMP + FLV )协议,走标准CDN线路,没有并发观看人数的限制,且带宽成本很低,但延迟一般在2s以上。主播PK采用私有的 UDP 协议,走特殊专线线路,延迟一般在500ms左右,但最多支持16人同时视频通话,且单路费用高于普通直播。

通道

直播通道

连麦通道

通讯延迟

≥ 3s

≤ 500ms

底层协议

HTTP-FLV 协议

UDP 协议

价格/费用

按带宽计费

按时长计费

最高并发

无上限

≤ 16人

TXLivePusher

setVideoQuality 为 SD、HD、FHD

setVideoQuality 为 MAINPUBLISHER

TXLivePlayer

PLAYTYPELIVEFLV

PLAYTYPELIVERTMPACC

播放 URL

普通的 FLV 地址

带防盗链签名的 RTMP-ACC 地址

2. 内部原理

您完全不需要了解 MLVBLiveRoom 的内部原理便可轻松接入,但是如果您确实感兴趣,可以通过下图了解其内部运作机制。

FAQ

1、MLVBLiveRoom实现了哪些功能?

答:实现了:

①:主播建房直播,观众进房观看。

②、直播间内发字幕互动。

③、观众申请与主播连麦

④、两个房主PK

⑤、云直播后台混流,观众观看连麦、PK画面时,不需要切换播放地址。

⑥、录制后台录制整场直播,回看文件存储在点播后台,回调播放url。

暂未实现:

①、点赞、打赏。可以通过调用IM自定义消息实现。

②、主播邀请观众上麦。可以由主播向观众发送C2C消息邀请上麦。

③、实时统计房间人数、点赞数。可在业务服务器统计增删改查。

2、跑通MLVBLiveRoom,需要改动哪些地方,购买哪些服务?

答:只需要在直播控制台开通房间管理服务,然后用你们云通信的sdkappid登录mlvbliveroom,就可以使用自己的直播服务了。

需要购买服务

①、cdn流量包(获赠直播licence)

②、acc连麦服务

③、IM套餐包

3、直播通用场景下的心跳保护方案?

答:LiteAVSDK和云直播后台都有保护机制。

①、LiteAVSDK有断网重连保护,setConnectRetryCount、setConnectRetryInterval可以设置断网下的重连次数和重连时间间隔。默认是3次、每次3S,这期间sdk内部断开会自动重连推流,如果都没有重连上,会有断流事件。需要手动调用startPusher重新推流。

②、云直播后台如果在70S内收到的音视频数据都是空的,会主动断开连接,后台会回调断流事件。

③、综上的直播保护方案,如果主播手机app意外被杀进程,sdk不会重连,等70又太久了。所以mlvbliveroom采用主动发送http心跳包的方式:当主播推流成功后,会向roomService发送心跳包,每5S发一次,后台的心跳超时时长是30S,当终端心跳超时,roomService后台就会关闭直播间。

4、如何录制整场直播,如何只录制连麦、PK时的片段?

答:在云直播控制台打开全局录制就可以录制整场直播。录制的视频文件会存在腾讯云点播里面,所以需要开通点播服务。

点播后台有剪裁接口,可以对已录制的视频进行剪裁出对应的时间片段。

全局录制会把所有的流id都录制下来。

5、如何知道一场直播结束了?

答:主播退房时终端上报

LiteAVSDK有断流事件,云直播后台也有断流回调。但是sdk会有断网重连保护机制,导致云直播后台会在短时间里出现3次推流、断流的回调。

最好的做法是主播关闭房间时发请求上报服务器直播结束,后台可根据腾讯云的流状态回调做检测保护。

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

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

编辑于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券