跳到主要内容

3.X 升级到 5.X (直播场景)

本文描述 RTCLib SDK 直播场景的升级步骤。

升级概述

  • RTCLib SDK 5.X 对比 3.X,适配了 iPhone 新机型与新系统,功能更丰富,更稳定,并在之前版本上修复了大量问题,建议尽早升级至新版 RTCLib SDK。
  • 3.X 版本的的观众没有加房间的功能,只能通过 subscribeLiveAVStream:liveType:handler: 这个接口订阅 liveUrl 合流;5.X 版本的观众会先加入房间,拿到房间内的合流来订阅。

前置条件

  • 5.X RTCLib SDK 依赖 RongIMLibCore 请您确保已将 RongIMLibCore 升级至 5.X。
  • RongIMLib SDK 5.X 做了拆分,请遵照 IMLib 的升级文档先将使用对应功能的 SDK 进行升级集成。
  • 已遵照 IMLib 升级要求将您的 Cocoapod 版本升级到 1.10.0 以上。

手动集成

  1. 将原先 RTCLib SDK 依赖的系统库全部去掉,如果 App 或者其他 SDK 有依赖的系统库除外

    • AssetsLibrary
    • MapKit
    • ImageIO
    • Security
    • SystemConfiguration
    • QuartzCore
    • AVFoundation
    • GLKit
    • OpenGLES
    • CoreGraphics
    • CoreLocation
    • CoreTelephony
    • CoreFoundation
    • CoreMedia
    • CoreAudio
    • CoreVideo
    • CFNetwork
    • AudioToolbox
    • VideoToolBox
    • AVFoundation
    • libc++.tbd
    • libz.tbd
    • libbz2.tbd
    • libiconv.tbd
    • libsqlite3.tbd
  2. 将 3.X 的 RongRTCLib.framework、RongIMLib.framework、libopencore-amrnb.a (该库包含在 RongIMLib 软件包中) 删除并替换为 5.X 的 RongRTCLib.xcframework、RongIMLibCore.xcframework

  3. General -> Frameworks,Libraries,and Embedded Binaries 中将 RongXX.framework 的 Embed 设置为 Embed & Sign

pod 集成

  1. 在 podfile 中添加如下内容:

    # pod 'RongRTCLib','~> 3.2.2'        # 注释 3.X 的内容
    pod 'RongCloudRTC/RongRTCLib', '~> x.y.z'
  2. 请在终端中运行以下命令:

    pod install

如果出现找不到相关版本的问题,可先执行 pod repo update ,再执行 pod install 。

接口替换说明

对象命名的改变

RTCLib SDK 从 3.X 升级到 5.X 将对象的命名规则由 RongXXX 变更为 RCXXX,您可以全局针对 RTCLib 的对象进行统一的替换。 例如加入房间的方法名称没有变动,方法返回的实例对象名称由 RongRTCRoom 变更为 RCRTCRoom

- (void)joinRoom:(NSString *)roomId
config:(RCRTCRoomConfig *)config
completion:(nullable void (^)(RCRTCRoom *_Nullable room, RCRTCCode code))completion;

初始化接口

将原有 AppKey 初始化方法进行替换

#import <RongIMLibCore/RongIMLibCore.h>

[[RCCoreClient sharedCoreClient] initWithAppKey:@"从控制台申请的 AppKey"];

连接接口

将原有连接 IM 方法替换为

// 连接 IM 服务
[[RCCoreClient sharedCoreClient] connectWithToken:@"从您服务器端获取的 Token"
dbOpened:^(RCDBErrorCode code) {}
success:^(NSString *userId) {}
error:^(RCConnectErrorCode status) {}];

音视频引擎初始化

将原有 sharedEngine 方法替换为

RCRTCEngine *engine = [RCRTCEngine sharedInstance];

状态监听接口

将原有的 RongRTCActivityMonitorDelegate 状态监视器代理替换为

@property (nonatomic, weak, nullable) id<RCRTCStatusReportDelegate> statusReportDelegate;

房间事件代理回调接口

将原有的 RongRTCRoomDelegate 房间事件代理替换为

/*!
房间事件代理
*/
@property (nonatomic, weak, nullable) id<RCRTCRoomEventDelegate> delegate;

代理中对应的方法变动对照 RCRTCRoomEventDelegate 中的说明替换即可

获取当前房间

将原有的当前加入房间 currentRoom 属性替换为

@property (nonatomic, strong, readonly, nullable) RCRTCRoom *room;

断线重连设置

断线重连功能默认开启,如果 3.X 有使用 setReconnectEnable: 设置为 NO ;升级后需要在引擎初始化时传入以下配置进行关闭:

RCRTCConfig *config = [[RCRTCConfig alloc] init];
config.isEnableAutoReconnect = NO;
[[RCRTCEngine sharedInstance] initWithConfig:config];

离开房间接口

将原有的 leaveRoom:completion: 方法替换为

- (void)leaveRoom:(nullable RCRTCOperationCallback)completion;

房间配置接口

原有的 RongRTCRoomConfig 的配置类变更为 RCRTCRoomConfig,并且新增了参数 RCRTCLiveRoleType 用来标识加入房间的用户身份是主播还是观众

RCRTCRoomConfig *config = [[RCRTCRoomConfig alloc] init];
config.roomType = RCRTCRoomTypeLive; //房间类型为直播
config.liveType = RCRTCLiveTypeAudioVideo; //直播类型为音视频直播
config.roleType = RCRTCLiveRoleTypeBroadcaster; //以主播身份加入房间

主播发布与取消发布资源接口

加入房间成功后 3.X 是通过加入房间返回的 RongRTCRoom 对象管理本地默认音视频流;5.X 变动为通过加入房间返回的 RCRTCRoom 中的 RCRTCLocalUser 对象管理本地默认音视频流

// 发布本地默认音视频资源
[[RCRTCEngine sharedInstance].room.localUser publishDefaultLiveStreams:^(BOOL isSuccess, RCRTCCode desc, RCRTCLiveInfo * _Nullable liveInfo) {
// 可以通过拿到的liveInfo对象进行推流相关配置
}];
// 取消发布本地默认音视频资源
[[RCRTCEngine sharedInstance].room.localUser unpublishDefaultLiveStreams:^(BOOL isSuccess, RCRTCCode code) {
}];

主播订阅与取消订阅资源接口

加入房间成功后 3.X 是通过加入房间返回的 RongRTCRoom 对象管理对端的音视频流;5.X 变动为通过加入房间返回的 RCRTCRoom 中的 RCRTCLocalUser 对象管理对端音视频流

// 订阅对端音视频资源
[[RCRTCEngine sharedInstance].room.localUser subscribeStream:avStreams
tinyStreams:nil
completion:^(BOOL isSuccess, RCRTCCode desc) {
}];
// 取消订阅对端音视频资源
[[RCRTCEngine sharedInstance].room.localUser unsubscribeStream:streams
completion:^(BOOL isSuccess, RCRTCCode desc) {
}];

创建渲染视图

3.X 的创建渲染视图分为本地渲染视图 RongRTCLocalVideoView 与远端渲染视图 RongRTCRemoteVideoView ,5.X 统一将创建渲染视图调整为 RCRTCVideoView

// 初始化本地渲染视图
RCRTCVideoView *view = [[RCRTCVideoView alloc]initWithFrame:CGRectMake(100, 100, 100, 100)];

渲染视频流

将 3.X 的渲染视图接口 setVideoRender: 接口替换为

// 渲染本地视图
[[RCRTCEngine sharedInstance].defaultVideoStream setVideoView:@"创建的 RCRTCVideoView 视图"];
// 渲染远端视图
[(RCRTCVideoInputStream *)stream setVideoView:@"创建的 RCRTCVideoView 视图"];

摄像头管理

将原有的摄像头相关接口调用替换为

// 打开摄像头
[[RCRTCEngine sharedInstance].defaultVideoStream startCapture];
// 关闭摄像头
[[RCRTCEngine sharedInstance].defaultVideoStream stopCapture];
// 切换摄像头
[[RCRTCEngine sharedInstance].defaultVideoStream switchCamera];

麦克风管理

将原有的开关麦克风接口调用替换为

// 设置禁用麦克风采集
[[RCRTCEngine sharedInstance].defaultAudioStream setMicrophoneDisable:YES];

扬声器管理

将原有的扬声器/听筒切换接口调用替换为

// 设置使用扬声器
[[RCRTCEngine sharedInstance] enableSpeaker:YES];

设置视频属性

将原有的 setVideoCaptureParam: 接口调用替换为

RCRTCVideoStreamConfig *videoConfig = [[RCRTCVideoStreamConfig alloc] init];
videoConfig.videoSizePreset = RCRTCVideoSizePreset720x480;
videoConfig.videoFps = RCRTCVideoFPS30;
[[RCRTCEngine sharedInstance].defaultVideoStream setVideoConfig:videoConfig];

视频大小流

将原有的控制是否开启大小流的接口替换为

[RCRTCEngine sharedInstance].defaultVideoStream.enableTinyStream = YES;

本地视频流处理

原有的获取本地流数据 RongRTCVideoCMSampleBufferCallback 方法已经废弃,升级后获取本地流与远端流的视频数据需要设置代理 RCRTCVideoOutputStreamEventDelegate 并实现对应代理方法

[RCRTCEngine sharedInstance].defaultVideoStream.streamEventDelegate = self;
/*!
采集视频数据回调

@param videoFrame 采集的视频数据,类型为 RCRTCVideoFrameFormatNV12
@param stream 采集的视频帧数据所属接收到的流
@discussion
采集的视频数据,如果修改该视频帧,会影响本地渲染和编码发送的视频帧数据,不支持修改数据格式

@remarks 代理
added from 5.2.3
*/
- (void)outputVideoStream:(RCRTCVideoOutputStream *)stream captureVideoFrame:(nullable RCRTCVideoFrame *)videoFrame;

远端视频流处理

原有的获取本地流数据 willRenderCVPixelBufferRef:stream: 方法已经废弃,升级后获取远端流的视频数据需要设置代理 RCRTCVideoInputStreamEventDelegate 并实现对应代理方法

// 获取到远端流后设置代理
((RCRTCVideoInputStream *)stream).streamEventDelegate = self;
/*!
即将渲染视频帧的数据回调

@param videoFrame 即将渲染的视频帧数据
@param stream 即将渲染的视频帧数据所属接收到的流
@discussion
即将渲染视频帧数据,如果修改该视频帧,会影响本地渲染远端用户的视频帧,不支持修改数据格式

@remarks 代理
added from 5.1.14
*/
- (void)inputVideoStream:(RCRTCVideoInputStream *)stream willRenderVideoFrame:(nullable RCRTCVideoFrame *)videoFrame;

观众逻辑变动说明

观众订阅流程

5.X 观众订阅流程替换为

// 1、设置房间类型
RCRTCRoomConfig *config = [[RCRTCRoomConfig alloc] init];
config.roomType = RCRTCRoomTypeLive; //房间类型
config.liveType = RCRTCLiveTypeAudioVideo; //直播类型
config.roleType = RCRTCLiveRoleTypeAudience; //观众角色

// 2、以观众身份加入房间
[[RCRTCEngine sharedInstance] joinRoom:@"房间号"
config:config
completion:^(RCRTCRoom * _Nullable room, RCRTCCode code) {
if (code != RCRTCCodeSuccess) {
// 错误处理
return;
}
// 设置房间事件代理
self.room = room;
self.room.delegate = self;

// 3、加入房间时获取房间已经存在的 live 合流,直接订阅
NSArray *liveStreams = [room getLiveStreams];
if (liveStreams.count) {
// 从房间拿到合流去订阅
[room.localUser subscribeStream:liveStreams tinyStreams:nil completion:^(BOOL isSuccess, RCRTCCode desc) {
// to do something
}];
}
}];

观众上麦流程

3.X 的观众的上麦流程需要先取消订阅,然后再加入房间发布资源;5.X 的观众上麦流程替换为

// 1、获取需要发布的资源
NSArray *streams = @[[RCRTCEngine sharedInstance].defaultAudioStream,[RCRTCEngine sharedInstance].defaultVideoStream];
// 2、切换身份变为主播
[[RCRTCEngine sharedInstance].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");
}];

主播下麦流程

3.X 的主播的下麦流程需要先离开房间,然后再订阅合流资源;5.X 的主播下麦流程替换为

[[RCRTCEngine sharedInstance].room.localUser switchToAudienceOnSucceed:^{
//TODO:观众订阅
NSArrry *streams = [self.room getLiveStreams];
//[self subscribeStreams:streams];
} onFailed:^(RCRTCCode code) {
NSLog(@"OnFailed:%@",@(code));
} onKicked:^{
NSLog(@"OnKicked");
}];

更详细的说明可以参考 5.X 的同房间连麦文档

进阶功能升级说明

混音设置

3.X 的混音功能只支持混音本地资源,5.X 支持混音在线网络音频资源。升级 5.X 后混音方法名称没有变动,需要注意的是方法调用对象由 RongRTCAudioMixer 变为 RCRTCAudioMixer

// 开始混音本地音频
NSString *audioFilePath = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"mp3"];
NSURL *mediaUrl = [NSURL fileURLWithPath:audioFilePath];
[[RCRTCAudioMixer sharedInstance] startMixingWithURL:mediaUrl
playback:YES
mixerMode:RCRTCMixerModeMixing
loopCount:NSUIntegerMax];

更多具体的方法调用参考 5.X 的混音设置文档

设置音频属性

为了来满足不同场景对音频设置的需求,同时降低使用复杂度,融云 RongRTCLib 从 5.1.0 开始,对音频码率(5.1.0 音频通话质量)和音频模式(5.1.0 音频通话模式)进行了接口合并封装,并重新设计,对外提供音频质量 + 音频模式的接口。具体的参数选择参考 5.X 的设置音频属性

音频流处理

SDK 5.X 依旧提供了本地音频流发送前和远端视音频流接收后的上报,数据回调接口的所属类对象以及名称对比 3.X 有所变动,返回的数据仍为 PCM 数据。具体可以参考对应 5.X 的音频流处理文档替换对应回调。

发布自定义流

发布自定义流的逻辑可以直接通过 5.X 的自定义流文档直接进行修改适配

发布屏幕共享

屏幕共享的升级方案可以通过 5.X 的屏幕共享文档 进行修改适配

合流布局设置

合流布局设置的升级方案可以通过 5.X 的合流布局文档 进行适配