观众端
获取资源
直播模式中同个房间内的所有主播发布的音视频流,会在服务端另行合并生成一道音频合流和一道视频合流。观众既可以直接订阅原始音视频流(简称“分流”),也可订阅“合流”。下面将分别介绍这两种订阅方式的区别和适用场景。
观众被定义为只能订阅不能发布,如需发布必须先转为主播身份,再进行资源的发布。
获取分流
分流订阅跟会议模式的订阅一样,适合小众玩法灵活的直播业务场景。比如观众被分成多种角色,需要选择性观看或收听部分主播发布的资源;又或者不同观众的展示布局并不相同,甚至可以随时切换布局的情况,SDK 提供视频展示 View 的创建和与流绑定接口,开发者自行编写展示逻辑。
观众的订阅需要在两个地方进行处理:一是在加入直播间的成功回调里,需要遍历得到房间内已经存在用户发布的流,并订阅;二是在收到主播刚刚发布流的通知,即 didPublishStreams 时订阅。
-
加入房间成功后,在回调中获取分流。
Objective C[[RCRTCEngine sharedInstance] joinRoom:@"你的房间id"
config:config
completion:^(RCRTCRoom * _Nullable room, RCRTCCode code) {
if (room.remoteUsers.count) {
NSMutableArray *streamArray = [NSMutableArray array];
for (RCRTCRemoteUser *user in room.remoteUsers) {
if (user.remoteStreams.count) {
[streamArray addObjectsFromArray:user.remoteStreams];
}
}
// 可以在此订阅streamArray
[self subscribeRemoteResource:streamArray];
}
}]; -
通过实现 RCRTCRoomEventDelegate 的 didPublishStreams 获取分流。
Objective C- (void)didPublishStreams:(NSArray<RCRTCInputStream *> *)streams {
//可以在此订阅streams
[self subscribeRemoteResource:streams];
}
获取合流
-
加入房间前远端直播合流已经发布,则通过加入房间后 RCRTCRoom 对象的 getLiveStreams 方法获得已经存在的直播合流。
Objective C[[RCRTCEngine sharedInstance] joinRoom:@"你的房间id"
config:config
completion:^(RCRTCRoom * _Nullable room, RCRTCCode code) {
// 观众获取 live 合流
NSArray *liveStreams = [room getLiveStreams];
if (liveStreams.count) {
// 观众可以在此订阅合流
}
}]; -
加入房间后远端直播合流发布,可以通过房间代理 RCRTCRoomEventDelegate 的 didPublishLiveStreams 方法取得音视频流数组。
Objective C- (void)didPublishLiveStreams:(NSArray<RCRTCInputStream*> *)streams {
// 观众可以在此订阅合流
}
订阅资源
远端用户发布音视频流后,可以通过加入房间后返回的 RCRTCRoom 中的 subscribeStreams:tinyStreams:callback:
方法订阅多路远端指定音视频流。
接口原型
- (void)subscribeStreams:(nullable NSArray<RCRTCInputStream *> *)avStreams
tinyStreams:(nullable NSArray<RCRTCInputStream *> *)tinyStreams
callback:(nullable RCRTCSubscribeOperationCallback)callback;
参数说明
参数 | 类型 | 是否必填 | 说明 |
---|---|---|---|
avStreams | NSArray<RCRTCInputStream *> | 否 | 普通流 |
tinyStreams | NSArray<RCRTCInputStream *> | 否 | 小流数组,同一个流只能填写在 avStreams 或 tinyStreams 中的一个数组中 |
callback | RCRTCSubscribeOperationCallback | 否 | 订阅资源完成的回调。callback 中 subscribeErrorList 为服务器返回的订阅失败列表。如果 isSuccess 为 YES 但是 subscribeErrorList 不为空,表示部分订阅成功,您可以根据业务决定是否对 subscribeErrorList 中的流进行重新订阅 |
代码示例
// 订阅房间中远端用户音视频流资源
[[RCRTCEngine sharedInstance].room.localUser subscribeStreams:avStreams
tinyStreams:tinyStreams
callback:^(BOOL isSuccess, RCRTCCode desc, NSArray<RCRTCInputStream *> * _Nullable subscribeErrorList) {
if (subscribeErrorList.count) {
// 您可以根据业务决定是否对 subscribeErrorList 中的流进行重新订阅,或仅作提示
}
// 创建并设置远端视频预览视图
NSInteger i = 0;
for (RCRTCInputStream *stream in streams) {
if (stream.mediaType == RTCMediaTypeVideo) {
BOOL isSubErrorStream = NO;
for (RCRTCInputStream *subErrorStream in subscribeErrorList) {
if ([stream.streamId isEqualToString:subErrorStream.streamId] &&
stream.mediaType == subErrorStream.mediaType) {
isSubErrorStream = YES;
break;
}
}
if (isSubErrorStream) {
continue;
}
if (i == 0) {
// 1.初始化渲染远端视频的 view
RCRTCVideoView *view = [[RCRTCVideoView alloc] initWithFrame:CGRectMake(100, 400, 100, 100)];
// 2.设置视频流的渲染视图
[(RCRTCVideoInputStream *)stream setVideoView:view];
// 3.添加渲染视图
[self.view addSubview:view];
} else {
// 其他远端视图逻辑
}
i++;
}
}
}];
取消订阅
观众可以调用 RCRTCRoom 的 unsubscribeStreams:completion:
方法取消订阅,取消订阅该用户的音视频流。退出房间时不需要取消订阅,SDK 内部会处理。
批量取消订阅
您可以使用 unsubscribeStreams:completion:
方法批量取消订阅多个音视频流。
接口原型
- (void)unsubscribeStreams:(nullable NSArray<RCRTCInputStream *> *)streams
completion:(nullable RCRTCOperationCallback)completion;
参数说明
参数 | 类型 | 是否必填 | 说明 |
---|---|---|---|
streams | NSArray<RCRTCInputStream *> | 否 | 音视频流 RCRTCInputStream 集合 |
completion | RCRTCOperationCallback | 否 | 取消订阅完成的回调 |
代码示例
[[RCRTCEngine sharedInstance].room.localUser unsubscribeStreams:streams
completion:^(BOOL isSuccess, RCRTCCode code) {
// 处理取消订阅结果
}];
单个取消订阅
您也可以使用 unsubscribeStream:completion:
方法取消订阅远端指定音视频流 RCRTCInputStream 对象。