跨房间媒体流转发
本部分介绍跨房间媒体流转发的使用以及使用场景
跨房间媒体流转发使用
使用前注意事项
请注意当前跨房功能仅对房间类型为直播,且角色为主播的场景下才能使用。请确保加入房间前调用以下接口:
[engine setRoomType:QNRoomTypeLiveBroadcasting];
[engine setClientRole:QNClientRoleBroadcaster];
对于以下几种情况:
- 已加入房间,且房间类型为
QNRoomTypeCommunication
,则必须退出房间后以QNRoomTypeLiveBroadcasting
的房间类型加入,才可使用 - 已加入房间,且房间类型为
QNRoomTypeLiveBroadcasting
,但是角色为QNClientRoleAudience
,则不需要退出房间,执行以下步骤即可:- 调用
[engine setClientRole:QNClientRoleBroadcaster]
; - 等待
RTCEngine:didClientRoleChanged:
触发,且角色成功切换为QNClientRoleBroadcaster
。 - 调用跨房间媒体流转发 API。
- 调用
开启跨房间媒体流转发
通过 QNRTCEngine#startRoomMediaRelay
接口开启跨房间媒体流转发,在 QNRTCEngineDelegate
中收到回调 roomMediaRelayStateDidChange
- (void)startRoomMediaRelay:(QNRoomMediaRelayConfiguration *_Nonnull)config;
config,跨房间媒体流转发配置项
QNRoomMediaRelayConfiguration.sourceInfo 目前暂不使用,可以为空 QNRoomMediaRelayConfiguration.destinationInfoList 表示目前需要进行的跨房目标,允许同时跨到多个房间 例:
QNRoomMediaRelayConfiguration *config = [QNRoomMediaRelayConfiguration new];
QNRoomMediaRelayInfo *sourceInfo = [QNRoomMediaRelayInfo new];
sourceInfo.roomName = roomName;
sourceInfo.uid = userId;
sourceInfo.token = token;
QNRoomMediaRelayInfo *desInfo1 = [QNRoomMediaRelayInfo new];
desInfo1.roomName = roomName1;
desInfo1.uid = userId1;
desInfo1.token = token1;
QNRoomMediaRelayInfo *desInfo2 = [QNRoomMediaRelayInfo new];
desInfo2.roomName = roomName2;
desInfo2.uid = userId2;
desInfo2.token = token2;
config.sourceInfo = sourceInfo;
[config setDestinationInfo:desInfo1 forRoomName:roomName1];
[config setDestinationInfo:desInfo2 forRoomName:roomName2];
[engine startRoomMediaRelay:config];
更新跨房间媒体流转发
通过 QNRTCEngine#updateRoomMediaRelay
接口更新跨房间媒体流转发,在 QNRTCEngineDelegate
中收到回调 roomMediaRelayStateDidChange
注意此接口中的 config
为全量更新,如已经开启的跨房的目标房间未被包含,则会被停止
- (void)updateRoomMediaRelay:(QNRoomMediaRelayConfiguration *_Nonnull)config;
config,跨房间媒体流转发配置项
QNRoomMediaRelayConfiguration.sourceInfo 目前暂不使用,可以为空 QNRoomMediaRelayConfiguration.destinationInfoList 表示目前需要进行的跨房目标,允许同时跨到多个房间 例:同开启跨房间媒体流转发
停止跨房间媒体流转发
通过 QNRTCEngine#stopRoomMediaRelay
接口停止跨房间媒体流转发,所有已开启的跨房行为将被停止,在 QNRTCEngineDelegate
中收到回调 roomMediaRelayStateDidChange
- (void)stopRoomMediaRelay;
事件通知
- 主动跨房的主播 A,可在
QNRTCEngineDelegate
中收到roomMediaRelayStateDidChange
当前跨房请求的状态更新 - 被跨房的主播 B,当主播 A 跨房成功之后,会触发
QNRTCEngineDelegate
didJoinOfRemoteUserId/didLeaveOfRemoteUserId
等用户加入,离开,发布音视频等回调。
使用场景
连麦 pk
旧版方案
当前连麦 pk 方案为主播 A 先退出当前房间,然后再加入主播 B 的房间,连麦完成后需要再切回原房间。中间过程比较复杂,涉及了重复进出房间等比较复杂的操作,客户端需要保存较多的状态,容易出错。
跨房间媒体流转发方案
使用跨房间媒体流转发方案,可以很方便的解决连麦 pk 这类场景的需求。 主播 A 不再需要离开自己的房间,只需通过以下步骤即可:
- 业务协商,主播 A 通过
QNRTCKit
自定义消息或者业务服务器长连接向主播 B 发送连麦请求,如果请求通过,则进行下一步 - 主播 A 调用
QNRTCEngine#startRoomMediaRelay
,主播 B 收到主播 A 加入房间和发布音视频等一系列消息后,再使用setMergeStreamLayouts
方法更新合流布局即可。 - 主播 B 操作同主播 A。
- 连麦结束后,各自调用
QNRTCEngine#stopRoomMediaRelay
停止跨房,并调用removeMergeStreamLayouts
移除连麦布局。 - 结束