同房间连麦
5.1.9 版本之前如需实现上下麦,需要让观众先退出房间,设置新的角色身份,再重新加入房间。
观众上麦
观众上麦本质上是切换身份变成当前房间的主播,然后以主播身份继续直播相关操作。App 处理步骤如下:
-
(可选)App 可提前获取当前用户需要发布的流。如果在切换为主播时传入流数组,SDK 会在角色切换成功后自动发布。
-
App 调用 RCRTCLocalUser 的 switchToBroadcaster 接口,将当前登录用户(观众角色)切换为主播角色。角色切换后,
RCRTCRoom
对象中数据会自动刷新。 角色切换后会保留之前注册的 RCRTCStatusReportDelegate、RCRTCEngineEventDelegate 和 RCRTCRoomEventDelegate 等 RTC SDK 全局类型的监听,其他监听需要切换角色成功后重新注册才能使用。 -
SDK 内部会取消当前登录用户之前(作为观众)订阅的音视频流。因此,在成功切换为主播角色后,App 需要为当前用户调用 subscribeStreams 重新订阅。注意,主播角色一般仅订阅其他主播发布的流,不订阅合流。
NSArray *streams = @[self.engine.defaultAudioStream,self.engine.defaultVideoStream];
[self.room.localUser switchToBroadcaster:streams onSucceed:^(RCRTCLiveInfo * _Nonnull liveInfo) {
//TODO:切换到主播成功,订阅房间内流资源
NSMutableArray *streams = [NSMutableArray array];
for (RCRTCRemoteUser *user in self.room.remoteUsers) {
if (user.remoteStreams.count) {
[streams addObjectsFromArray:user.remoteStreams];
}
}
if (streams.count) {
// 订阅资源
//[self subscribeStreams:streams];
}
} onFailed:^(RCRTCCode code) {
NSLog(@"OnFailed:%@",@(code));
} onKicked:^{
NSLog(@"OnKicked");
}];如果切换为主播时
publishStreams
为空(不发布资源),App 可以单独调用主播发布资源的方法。详见发布与订阅 · 主播端。参数 类型 说明 publishStreams NSArray<RCRTCOutputStream *> 切换成主播 ,需要发布的流数组(可以传空)。 onSucceed void (^)(RCRTCLiveInfo *liveInfo) 切换成功的回调,liveInfo 会携带发布资源后的 liveUrl onFailed void (^)(RCRTCCode code) 切换失败的回调,不会影响当前观众身份,用户可以继续音视频相关操作 onKicked void (^)(void) 切换失败,被 SDK 主动踢出的回调,需要用户重新加入房间才能继续音视频的相关操作 -
观众上麦后,RTC 房间内的其他用户(主播、观众)同房间内的其他用户会通过 RCRTCRoomEventDelegate 协议里面的
didSwitchRoleWithUser:roleType:
方法监听到远端用户切换身份为RCRTCLiveRoleTypeBroadcaster
。 -
观众上麦后,RTC 房间内的其他用户(主播、观众)会收到回调:
- 其他主播角色用户通过 RCRTCRoomEventDelegate 协议里面的
didSwitchRoleWithUser:roleType:
方法监听到远端用户切换身份为RCRTCLiveRoleTypeBroadcaster
。 - 观众角色用户通过 RCRTCRoomEventDelegate 协议里面的 didJoinUser 回调收到通知。
- 其他主播角色用户通过 RCRTCRoomEventDelegate 协议里面的
-
观众上麦后,RTC 房间内的其他用户(主播、观众)可通过 房间事件回调 中的
didPublishStreams
回调收到发流通知。App 端需要自行处理资源订阅。
主播下麦
主播下麦本质上是切换身份变成当前房间的观众,然后以观众身份继续观看直播等相关操作。App 处理步骤如下:
-
App 调用 RCRTCLocalUser 的 switchToAudienceOnSucceed 接口,将当前登录用户(观众角色)切换为主播角色。角色切换后,
RCRTCRoom
对象中数据会自动刷新。角色切换后会保留之前注册的 RCRTCStatusReportDelegate、RCRTCEngineEventDelegate 和 RCRTCRoomEventDelegate 等 RTC SDK 全局类型的监听,其他监听需要切换角色成功后重新注册才能使用。 -
SDK 内部会取消当前登录用户之前(作为主播)发布、订阅的音视频流。因此,在成功切换为观众角色后,App 需要为当前用户调用 subscribeStreams 重新订阅。注意,观众角色一般仅订阅合流。
[self.room.localUser switchToAudienceOnSucceed:^{
//TODO:观众订阅
NSArrry *streams = [self.room getLiveStreams];
//[self subscribeStreams:streams];
} onFailed:^(RCRTCCode code) {
NSLog(@"OnFailed:%@",@(code));
} onKicked:^{
NSLog(@"OnKicked");
}];参数 类型 说明 onSucceed void (^)(void) 切换成功的回调 onFailed void (^)(RCRTCCode code) 切换失败的回调,不会影响当前主播身份,用户可以继续音视频相关操作 onKicked void (^)(void) 切换失败,被 SDK 主动踢出的回调,需要用户重新加入房间才能 继续音视频的相关操作 提示如果当前用户在跨房间连麦中加入了
RCRTCOtherRoom
,切换为观众时,SDK 内部会帮其退出所有RCRTCOtherRoom
。不会结束本次连麦。如果需要结束连麦请在切换角色前调用 RCRTCEngine 的leaveOtherRoom:notifyFinished:completion:
方法,notifyFinished
参数传YES
即可。 -
主播下麦后,RTC 房间内的其他用户(主播、观众)会收到回调:
- 其他主播角色用户通过 RCRTCRoomEventDelegate 协议里面的
didSwitchRoleWithUser:roleType:
方法监听到远端用户切换身份为RCRTCLiveRoleTypeAudience
。 - 观众角色用户通过 RCRTCRoomEventDelegate 协议里面的 didLeaveUser 回调收到通知。
- 其他主播角色用户通过 RCRTCRoomEventDelegate 协议里面的
监听房间用户切换角色事件
当房间内的用户使用切换角色方式上下麦时,同房间内用户均会收到回调。其中主播用户会通过 RCRTCRoomEventDelegate 协议里面的 didSwitchRoleWithUser:roleType:
方法监听到远端用户切换身份。
如果主播用户订阅的其他主播下麦,SDK 内部会主动取消订阅不存在的音视频流,但 App 需要在此回调方法中移除当前视频流视图等操作。
/*!
远端用户切换身份通知
@param user 切换身份的用户
@param roleType 该用户当前的身份
@discussion
有切换身份时的回调,当有用户切换身份的时候,当前房间内其他主播会收到该消息。
如果订阅了当前 user 的流,SDK 会主动取消订阅,不需要手动取消订阅。
added from 5.1.9
@remarks 代理
*/
- (void)didSwitchRoleWithUser:(RCRTCRemoteUser *)user roleType:(RCRTCLiveRoleType)roleType;
参数 | 类型 | 说明 |
---|---|---|
user | RCRTCRemoteUser | 切换身份的用户 |
roleType | RCRTCLiveRoleType | 切换成功的目标角色类型 |