实现音视频会议
融云开发者账户是使用融云 SDK 产品的必要条件。在开始之前,请先前往融云官网注册开发者账户。注册后,控制台将自动为你创建一个应用,默认为开发环境应用,使用国内数据中心。请获取该应用的 App Key,在本教程中使用。
首次使用融云音视频的用户,建议参考文档运行示例项目,以完成开发者账号注册、音视频服务开通等工作。
提示
房间人数上限
考虑移动设备的带宽(主要是在多路视频情况下)和 UI 交互效果,建议单次通话或房间内,视频不超过 16 人,纯音频不超过 32 人。超过此上限可能影响通话效果。
环境要求
- iOS 9.0 及以上。
- Xcode 9.0 或以上版本。
步骤 1:服务开通
您在融云创建的应用默认不会启用音视频服务。在使用融云提供的任何音视频服务前,您需要前往控制台,为应用开通音视频服务。
具体步骤请参见文档开通音视频服务。
提示
服务开通、关闭等设置完成后 30 分钟后生效。
步骤 2:初始化
RTCLib 是基于 IMLibCore 作为信令通道的,所以要先初始化 IMLibCore。如果不换 AppKey,在整个应用生命周期中,初始化一次即可。
[[RCCoreClient sharedCoreClient] initWithAppKey:@"从控制台申请的 AppKey"];
- 部分 RTC 引擎必须在初始化时提供,详见引擎配置。
步骤 3:连接 IM 服务
音视频用户之间的信令传输依赖于融云的即时通信(IM)服务,因此需要先调用 connectWithToken
与 IM 服务建立好 TCP 长连接。建议在功能模块的加载位置处调用,之后再进行音视频呼叫业务。当模块退出后调用 disconnect
或 logout
断开该连接。
// 连接 IM 服务
[[RCCoreClient sharedCoreClient] connectWithToken:@"从您服务器端获取的 Token"
dbOpened:^(RCDBErrorCode code) {}
success:^(NSString *userId) {}
error:^(RCConnectErrorCode status) {}];
步骤 4:加入房间
指定房间 id 并加入房间,通过异步回调的 code 判断是否加入房间成功。
RCRTCVideoStreamConfig *videoConfig = [[RCRTCVideoStreamConfig alloc] init];
videoConfig.videoSizePreset = RCRTCVideoSizePreset720x480;
videoConfig.videoFps = RCRTCVideoFPS30;
[[RCRTCEngine sharedInstance].defaultVideoStream setVideoConfig:videoConfig];
RCRTCRoomConfig *config = [[RCRTCRoomConfig alloc] init];
config.roomType = RCRTCRoomTypeNormal;
[[RCRTCEngine sharedInstance] enableSpeaker:YES];
[[RCRTCEngine sharedInstance] joinRoom:@"Your_Room_ID" config:config completion:^(RCRTCRoom *_Nullable room, RCRTCCode code) {
if (code != RCRTCCodeSuccess) {
// 加入房间失败处理
} else {
// 加入成功后进行资源的发布和订阅,见步骤 7
[self afterJoinRoom:room];
}
}];
步骤 5:发布资源
加入成功后开始采集本地视频并发布本地视频流。
- (void)afterJoinRoom:(RCRTCRoom *)room {
// 设置房间代理
self.room = room;
room.delegate = self;
// 开始本地视频采集
[[[RCRTCEngine sharedInstance] defaultVideoStream] setVideoView:self.localView];
[[[RCRTCEngine sharedInstance] defaultVideoStream] startCapture];
// 发布本地视频流
[room.localUser publishDefaultStreams:^(BOOL isSuccess, RCRTCCode desc) {
if (isSuccess && desc == RCRTCCodeSuccess) {
NSLog(@"本地流发布成功");
}
}];
// 如果已经有远端用户在房间中, 需要订阅远端流
if ([room.remoteUsers count] > 0) {
NSMutableArray *streamArray = [NSMutableArray array];
for (RCRTCRemoteUser *user in room.remoteUsers) {
[streamArray addObjectsFromArray:user.remoteStreams];
}
// 见步骤 8
[self subscribeRemoteResource:streamArray];
}
}
步骤 6:订阅资源
-
如果已经有远端用户在房间中,需要订阅远端流。
- (void)subscribeRemoteResource:(NSArray<RCRTCInputStream *> *)streams {
[self.room.localUser subscribeStream:streams
tinyStreams:nil
completion:^(BOOL isSuccess, RCRTCCode desc) {
if (isSuccess && desc == RCRTCCodeSuccess) {
NSLog(@"无端流订阅成功");
}
}];
// 创建并设置远端视频预览视图
for (RCRTCInputStream *stream in streams) {
if (stream.mediaType == RTCMediaTypeVideo) {
[(RCRTCVideoInputStream *) stream setVideoView:self.remoteView];
[self.remoteView setHidden:NO];
}
}
} -
监听房间事件。
#pragma mark - RCRTCRoomEventDelegate
// 远端用户发布资源通知
- (void)didPublishStreams:(NSArray<RCRTCInputStream *> *)streams {
[self subscribeRemoteResource:streams];
}
// 远端用户取消发布资源通知
- (void)didUnpublishStreams:(NSArray<RCRTCInputStream *> *)streams {
[self.remoteView setHidden:YES];
}
// 远端用户离开通知
- (void)didLeaveUser:(RCRTCRemoteUser *)user {
[self.remoteView setHidden:YES];
}