3.X 升级到 5.X
本文描述 RTCLib SDK 的升级步骤。
升级概述
- RTCLib SDK 5.X 是基于 AndroidX 开发的新版 SDK,功能更丰富,更稳定,并在之前版本上修复了大量问题,建议尽早升级至新版 RTCLib SDK。
- 在 3.X 观众是通过
liveurl
订阅主播资源的,在 5.X 观众需要加入房间,通过房间对象选择订阅合流还是分流,具体可以参考 5.X 观众端订阅
前置条件
- RTCLib SDK 依赖 IMLib 请您确保已将 IMLib 升级至 5.X
- 已遵照 IMLib 升级要求将您的工程升级至 AndroidX。
修改依赖方式
以下仅介绍通过 maven 集成的依赖升级方式。RTCLib 还支持本地依赖方式,请参考导入 RTCLib SDK。
修改 Maven 仓库地址
maven {url "https://dl.bintray.com/rongcloud/maven"} // 3.X
maven {url "https://maven.rongcloud.cn/repository/maven-releases/"} // 5.X
修改依赖命名
dependencies {
// x.y.z,请填写具体的 SDK 版本号,新集成用户建议使用最新版。
implementation 'cn.rongcloud.sdk:rtc_lib:x.y.z'
implementation 'cn.rongcloud.sdk:im_lib:x.y.z'
}
- 各个 SDK 的最新版本号可能不相同,还可能是 x.y.z.h,可前往 融云官网 SDK 下载页面 或 融云的 Maven 代码库 查询。
- RTCLib 必须与其依赖的 IMKit/IMLib SDK 保持版本一致。从 5.2.0 开始至 5.4.4(不含),要求前三位一致。从 5.4.4 开始,要求前两位保持一致。注意,RTCLib 5.4.4 不可匹配小于 5.4.4 的 IM SDK。
类路径调整
3.X | 5.X |
---|---|
cn.rongcloud.rtc.RongRTCEngine | cn.rongcloud.rtc.api.RCRTCEngine |
cn.rongcloud.rtc.RongRTCAudioMixer | cn.rongcloud.rtc.api.RCRTCAudioMixer |
cn.rongcloud.rtc.room.RongRTCRoomConfig | cn.rongcloud.rtc.api.RCRTCRoomConfig |
cn.rongcloud.rtc.engine.view.RongRTCVideoView | cn.rongcloud.rtc.api.stream.RCRTCVideoView |
cn.rongcloud.rtc.RongRTCConfig | cn.rongcloud.rtc.api.RCRTCConfig |
cn.rongcloud.rtc.stream.local.RongRTCCapture | 无法直接替换,请参考5.X文档 |
cn.rongcloud.rtc.room.RongRTCMixConfig | cn.rongcloud.rtc.api.RCRTCMixConfig |
cn.rongcloud.rtc.stream.local.RongRTCAVOutputStream | cn.rongcloud.rtc.api.stream.RCRTCOutputStream |
cn.rongcloud.rtc.user.RongRTCLocalUser | cn.rongcloud.rtc.api.RCRTCLocalUser |
参照上表,在 AndroidStudio 中全局搜索旧的类路径,替换为新路径和新类名。
接口变化
初始化音视频引擎
RCRTCConfig
可以设置音视频采集参数。
// 5.X需要在加入房间之前初始化引擎,如下方式:
RCRTCEngine.getInstance().init(Context application, RCRTCConfig config)
加入房间
将 RongRTCEngine
替换为 RCRTCEngine
,将参数 RongRTCRoomConfig
替换为 RCRTCRoomConfig
// 5.X
RCRTCEngine.getInstance().joinRoom(String roomId,RCRTCRoomConfig roomConfig,IRCRTCResultDataCallback<RCRTCRoom> callBack)
获取房间实例
3.X 只能在加入房间成功回调里面获取到房间对象。
5.X 获取房间对象有两种方式,如下:
- 通过
joinRoom
回调拿到。 - 加入房间之后可以通过
RCRTCEngine.getInstance().getRoom()
获取。
视频大小流设置
发送方设置,将原有方法直接替换为下面方法
// 5.X
RCRTCEngine.getInstance().getDefaultVideoStream().enableTinyStream(enable);
房间事件回调
- 将
registerEventsListener
替换为registerRoomListener
, - 将监听
RongRTCEventsListener
替换为IRCRTCRoomEventsListener
具体可以参考5.X房间事件回调文档
// 5.X
RCRTCEngine.getInstance().getRoom().registerRoomListener(IRCRTCRoomEventsListener eventsListener)
创建渲染本地视频流
RongRTCVideoView
替换为 RCRTCVideoView
直接new出来。
// 5.X
RCRTCVideoView rcrtcVideoView = new RCRTCVideoView(context);
//设置本地预览视图
RCRTCEngine.getInstance().getDefaultVideoStream().setVideoView(rcrtcVideoView);
//将本地视图添加至FrameLayout布局
mFrameLayout_local.addView(rongRTCVideoView);
音视频相关参数设置
3.X 音视频参数设置都是通过 RongRTCConfig
设置,5.X 做了区分,视频使用 RCRTCVideoStreamConfig
,音频模式设置调用 setAudioQuality
等。
具体可以参考5.X的文档
// 5.X 设置视频属性
RCRTCVideoStreamConfig config = RCRTCVideoStreamConfig.Builder.create()
.setMaxRate(200)
.setMaxRate(900)
.setVideoFps(RCRTCParamsType.RCRTCVideoFps.Fps_15)
.setVideoResolution(RCRTCParamsType.RCRTCVideoResolution.RESOLUTION_480_640)
.build();
RCRTCEngine.getInstance().getDefaultVideoStream().setVideoConfig(config);
// 5.X 音频模式设置
RCRTCEngine.getInstance().getDefaultAudioStream().setAudioQuality(RCRTCParamsType.AudioQuality.MUSIC, RCRTCParamsType.AudioScenario.MUSIC_CHATROOM);
// 5.X 音视频硬件属性设置
RCRTCConfig rcrtcConfig = RCRTCConfig.Builder.create()
.setAudioSource(MediaRecorder.AudioSource.VOICE_COMMUNICATION)
.build();
RCRTCEngine.getInstance().init(this,rcrtcConfig);
发布资源
publishDefaultLiveAVStream
替换为 publishDefaultLiveStreams
// 5.X
RCRTCEngine.getInstance().getRoom().getLocalUser().publishDefaultLiveStreams(new IRCRTCResultDataCallback<RCRTCLiveInfo>() {
@Override
public void onSuccess(RCRTCLiveInfo data) {
// 发布成功,返回LiveInfo,用于设置合流布局
}
@Override
public void onFailed(RTCErrorCode errorCode) {
// 发布失败
}
});
取消发布资源
unpublishAVStream
替换为 unpublishDefaultLiveStreams
// 5.X
RCRTCEngine.getInstance().getRoom().getLocalUser().unpublishDefaultLiveStreams(new IRCRTCResultCallback() {
@Override
public void onSuccess() {
// 取消发布成功
}
@Override
public void onFailed(RTCErrorCode errorCode) {
// 取消发布失败
}
});
订阅资源
- 3.X 版本的的观众没有加房间的功能,只能通过
subscribeLiveAVStream
这个接口订阅 liveUrl 合流;5.X 版本的观众会先加入房间,拿到房间内的合流来订阅; - 3.X 的观众的上麦流程需要先取消订阅,然后再加入房间发布资源;5.X 只需要调用
switchToBroadcaster
上麦即可 - 3.X 的观众的下麦需要调用quitRoom离开房间;5.X 的观众只需要调用
switchToAudience
下麦为观众不用退出房间。
// 5.X 观众订阅 1.以观众身份加入房间
RCRTCRoomConfig roomConfig = RCRTCRoomConfig.Builder.create()
.setRoomType(RCRTCRoomType.LIVE_AUDIO_VIDEO) // 房间类型
.setLiveRole(RCRTCLiveRole.AUDIENCE) // 加入的身份
.build();
// 以观众加入音视频房间
RCRTCEngine.getInstance().joinRoom("room_id", roomConfig, new IRCRTCResultDataCallback<RCRTCRoom>() {
@Override
public void onSuccess(RCRTCRoom data) {
}
@Override
public void onFailed(RTCErrorCode errorCode) {
}
});
//2.通过 getLiveStreams 方法获取合流,订阅合流
List<RCRTCInputStream> streamList = rtcRoom.getLiveStreams(); // 获取合流
rcrtcRoom.getLocalUser().subscribeStreams(rcrtcRoom.getLiveStreams(), // 订阅
new IRCRTCResultDataCallback<List<RCRTCInputStream>>() {
@Override
public void onSuccess(List<RCRTCInputStream> data) {
// 订阅成功
}
@Override
public void onFailed(RTCErrorCode errorCode) {
// 订阅失败
}
});
观众上麦
List<RCRTCOutputStream> rcrtcOutputStreams = new ArrayList<>();
rcrtcOutputStreams.add(RCRTCEngine.getInstance().getDefaultAudioStream()); // 默认音频流
rcrtcOutputStreams.add(RCRTCEngine.getInstance().getDefaultVideoStream()); // 默认视频流
rcrtcRoom.getLocalUser().switchToBroadcaster(rcrtcOutputStreams, new IRCRTCSwitchRoleDataCallback<RCRTCLiveInfo>() {
@Override
public void onKicked() {
}
@Override
public void onSuccess(RCRTCLiveInfo data) {
}
@Override
public void onFailed(RTCErrorCode errorCode) {
}
});
观众下麦
rcrtcRoom.getLocalUser().switchToAudience(new IRCRTCSwitchRoleCallback() {
@Override
public void onKicked() {
}
@Override
public void onSuccess() {
}
@Override
public void onFailed(RTCErrorCode errorCode) {
}
});
离开房间方法名有变化
将 quitRoom
替换为 leaveRoom
// 5.X 不需要传roomid
RCRTCEngine.getInstance().leaveRoom(IRCRTCResultCallback callBack)
硬件资源操作
在 3.X 操作摄像头,麦克风等都是使用 RongRTCCapture
这个类进行设置,在 5.X 中操作摄像头使用 RCRTCEngine.getInstance().getDefaultVideoStream()
进行设置
操作麦克风使用 RCRTCEngine.getInstance().getDefaultAudioStream()
进行设置
摄像头处理
RongRTCCapture
替换为 RCRTCEngine.getInstance().getDefaultVideoStream()
//打开摄像头
RCRTCEngine.getInstance().getDefaultVideoStream().startCamera();
//切换摄像头
RCRTCEngine.getInstance().getDefaultVideoStream().switchCamera();
//关闭摄像头
RCRTCEngine.getInstance().getDefaultVideoStream().stopCamera();
RCRTCEngine.getInstance().getDefaultVideoStream().isFrontCamera();
麦克风控制
// 5.X true 关闭麦克风 false 打开麦克风
RCRTCEngine.getInstance().getDefaultAudioStream().setMicrophoneDisable(true);
扬声器控制
// 5.X true 使用扬声器;false 使用听筒
RCRTCEngine.getInstance().enableSpeaker(true);
视频流处理
将原有方法直接替换 成如下方法
// 5.X
RCRTCEngine.getInstance().getDefaultVideoStream().setVideoFrameListener(new IRCRTCVideoOutputFrameListener() {
@Override
public RCRTCVideoFrame processVideoFrame(RCRTCVideoFrame rtcVideoFrame) {
//使用数据进行美颜/录像等处理后,需要把数据再返回给SDK做发送
return rtcVideoFrame;
}
});
音频流处理
将原有方法直接替换成如下方法
// 5.X
RCRTCEngine.getInstance().getDefaultAudioStream().setRecordAudioDataListener(new IRCRTCAudioDataListener() {
@Override
public byte[] onAudioFrame(RCRTCAudioFrame rcrtcAudioFrame) {
//回调线程:AudioRecordJavaThread
return rcrtcAudioFrame.getBytes();
}
});
远端音频流处理
将原有方法直接替换成如下方法
// 5.X
room.setRemoteAudioDataListener(new IRCRTCAudioDataListener() {
@Override
public byte[] onAudioFrame(RCRTCAudioFrame rcrtcAudioFrame) {
return rcrtcAudioFrame.getBytes();
}
});
混音
RongRTCAudioMixer 替换为RCRTCAudioMixer 注意:参数也有所变化
// 5.X
public abstract boolean startMix(String path, Mode mode, boolean playback, int loopCount);
以下功能点可以直接参考 5.X 文档
发布自定义流
发布自定义流的逻辑可以直接通过 5.X 的自定义流文档直接进行修改适配
发布屏幕共享
屏幕共享的升级方案可以通过 5.X 的屏幕共享文档 进行修改适配
合流布局设置
合流布局设置的升级方案可以通过 5.X 的对应文档直接进行修改适配。