同房间连麦
5.1.9 版本之前如需实现上下麦,需要让观众先退出房间,设置新的角色身份,再重新加入房间。
观众上麦
观众上麦本质上是切换身份变成当前房间的主播,然后以主播身份继续直播相关操作。
-
(可选)App 可提前获取当前用户需要发布的流。如 果在切换为主播时传入流数组,SDK 会在角色切换成功后自动发布。
Java// 示例代码使用480x640分辨率演示
RCRTCVideoStreamConfig config = RCRTCVideoStreamConfig
.Builder.create()
.setVideoResolution(RCRTCVideoResolution.RESOLUTION_480_640)
.build();
RCRTCEngine.getInstance().getDefaultVideoStream().setVideoConfig(config);
// 创建视图渲染视图
RCRTCVideoView videoView = new RCRTCVideoView(this.getApplicationContext());
RCRTCEngine.getInstance().getDefaultVideoStream().setVideoView(videoView);
//TODO 示例代码使用获取本地默认视频流、音频流演示
ArrayList<RCRTCOutputStream> streams = new ArrayList<>();
streams.add(RCRTCEngine.getInstance().getDefaultVideoStream());
streams.add(RCRTCEngine.getInstance().getDefaultAudioStream());
// 开启摄像头
RCRTCEngine.getInstance().getDefaultVideoStream().startCamera(null); -
App 调用 RCRTCLocalUser 的 switchToBroadcaster 接口,将当前登录用户(观众角色)切换为主播角色。角色切换后,
RCRTCRoom
对象中数据会自动刷新。角色切换后会保留通过 RCRTCEngine#registerEventListener、RCRTCEngine#registerStatusReportListener 和 RCRTCRoom#registerRoomListener 等注册的 RTC SDK 全局类型的监听。其他监听需要切换角色成功后重新注册才能使用。Java// 开始切换为主播身份
RCRTCEngine.getInstance().getRoom().getLocalUser().switchToBroadcaster(streams, new IRCRTCSwitchRoleDataCallback<RCRTCLiveInfo>() {
/**
* 当切换失败且SDK处于无法回退状态时回调,该角色已经无法使用当前角色继续进行音视频。
* SDK内部会退出房间并清理所有资源,该用户只能重新加入房间才能继续音视频。
*/
@Override
public void onKicked() {
}
@Override
public void onSuccess(RCRTCLiveInfo data) {
//该用户切换为主播成功,可以以主播身份进行音视频
}
/**
* 当切换失败且不影响当前角色继续音视频时回调
* @param errorCode 失败错误码
*/
@Override
public void onFailed(RTCErrorCode errorCode) {
}
}); -
SDK 内部会取消当前登录用户之前(作为观众)订阅的音视频流。因此,在成功切换为主播角色后,App 需要为当前用户调用 subscribeStreams 重新订阅。注意,主播角色一般仅订阅其他主播发布的流,不订阅合流。
-
观众上麦后,RTC 房间内的其他用户(主播、观众)会收到回调:
- 其他主播角色用户通过 IRCRTCRoomEventsListener 的 onSwitchRole 回调收到通知。
- 观众角色用户通过 IRCRTCRoomEventsListener 的 onUserJoined 回调收到通知。
-
观众上麦后,RTC 房间内的其他用户(主播、观众)可通过 [房间事件回调] 中的
onRemoteUserPublishResource
回调收到发流通知。App 端需要自行处理资源订阅。
主播下麦
主播下麦本质上是切换身份变成当前房间的观众,然后以观众身份继续观看直播等相关操作。App 处理步骤如下:
-
App 调用 RCRTCLocalUser 的 switchToAudience 接口,将当前登录用户(主播角色)切换为观众角色。角色切换后,
RCRTCRoom
对象中数据会自动刷新。角色切换后会保留通过 RCRTCEngine#registerEventListener、RCRTCEngine#registerStatusReportListener 和 RCRTCRoom#registerRoomListener 等注册的 RTC SDK 全局类型的监听。其他监听需要切换角色成功后重新注册才能使用。 -
SDK 内部会取消当前登录用户之前(作为主播)发布、订阅的音视频流。因此,在成功切换为观众角色后,App 需要为当前用户调用 subscribeStreams 重新订阅。注意,观众角色一般仅订阅合流。
Java// 开始切换为观众身份
RCRTCEngine.getInstance().getRoom().getLocalUser().switchToAudience(new IRCRTCSwitchRoleCallback() {
/**
* 当切换失败且SDK处于无法回退状态时回调,该角色已经无法使用当前角色继续进行音视频。
* SDK内部会退出房间并清理所有资源,该用户只能重新加入房间才能继续音视频。
*/
@Override
public void onKicked() {
}
@Override
public void onSuccess() {
// 该用户切换为观众成功,可以以观众身份进行音视频
}
/**
* 当切换失败且不影响当前角色继续音视频时回调
* @param errorCode 失败错误码
*/
@Override
public void onFailed(RTCErrorCode errorCode) {
}
});提示如果当前用户已经加入
RCRTCOtherRoom