跳到主要内容

实现音视频会议

融云开发者账户是使用融云 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 长连接。建议在功能模块的加载位置处调用,之后再进行音视频呼叫业务。当模块退出后调用 disconnectlogout 断开该连接。

// 连接 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:订阅资源

  1. 如果已经有远端用户在房间中,需要订阅远端流。

    - (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];
    }
    }
    }
  2. 监听房间事件。

    #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];
    }