同房间连麦
5.1.9 版本之前如需实现上下麦,需要让观众先退出房间,设置新的角色身份,再重新加入房间。
观众上麦
观众上麦本质上是切换身份变成当前房间的主播,然后以主播身份继续直播相关操作。
-
(可选)App 可提前获取当前用户需要发布的流。如果在切换为主播时传入流数组,SDK 会在角色切换成功后自动发布。
// 示例代码使用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 全局类型的监听。其他监听需要切换角色成功后重新注册才能使用。// 开始切换为主播身份
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 重新订阅。注意,观众角色一般仅订阅合流。
// 开始切换为观众身份
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
,当切换为观众时。SDK 内部会帮其退出所有RCRTCOtherRoom
。不会结束本次连麦。如果需要结束连麦请在切换角色前调用RCRTCEngine
的 leaveOtherRoom方法,notifyFinished
参数传true
即可。 -
主播下麦后,RTC 房间内的其他用户(主播、观众)会收到回调:
- 其他主播角色用户通过 IRCRTCRoomEventsListener 的 onSwitchRole 回调收到通知。
- 观众角色用户通过 IRCRTCRoomEventsListener 的 onUserLeft 回调收到通知。
监听房间用户切换角色事件
当房间内的用户使用切换角色方式上下麦时,同房间内用户均会收到回调。其中主播用户会通过 IRCRTCRoomEventsListener 的 onSwitchRole
方法监听到远端用户切换身份。
如果主播用户订阅的其他主播下麦,SDK 内部会主动取消订阅不存在的音视频流,但 App 需要在此回调方法中移除当前视频流视图等操作。
RCRTCEngine.getInstance().getRoom().registerRoomListener(new IRCRTCRoomEventsListener() {
/**
* Add from 5.1.9 </br>
*
* 远端用户切换角色通知
*
* @param userId 用户 Id
* @param role 当前角色
*/
@Override
public void onSwitchRole(String userId, RCRTCLiveRole role) {
super.onSwitchRole(userId, role);
}
//todo 省略其他回调
});