跳到主要内容

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.X5.X
cn.rongcloud.rtc.RongRTCEnginecn.rongcloud.rtc.api.RCRTCEngine
cn.rongcloud.rtc.RongRTCAudioMixercn.rongcloud.rtc.api.RCRTCAudioMixer
cn.rongcloud.rtc.room.RongRTCRoomConfigcn.rongcloud.rtc.api.RCRTCRoomConfig
cn.rongcloud.rtc.engine.view.RongRTCVideoViewcn.rongcloud.rtc.api.stream.RCRTCVideoView
cn.rongcloud.rtc.RongRTCConfigcn.rongcloud.rtc.api.RCRTCConfig
cn.rongcloud.rtc.stream.local.RongRTCCapture无法直接替换,请参考5.X文档
cn.rongcloud.rtc.room.RongRTCMixConfigcn.rongcloud.rtc.api.RCRTCMixConfig
cn.rongcloud.rtc.stream.local.RongRTCAVOutputStreamcn.rongcloud.rtc.api.stream.RCRTCOutputStream
cn.rongcloud.rtc.user.RongRTCLocalUsercn.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 获取房间对象有两种方式,如下:

  1. 通过 joinRoom 回调拿到。
  2. 加入房间之后可以通过 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 的对应文档直接进行修改适配。