主播端
准备发布
-
主播端初始化 SDK 并连接融云服务器。
[[RCCoreClient sharedCoreClient] initWithAppKey:@"你的AppKey"];
[[RCCoreClient sharedCoreClient] connectWithToken:@"你的token"
dbOpened:nil
success:^(NSString *userId) {
NSLog(@"IM connect success,user ID : %@",userId);
...
} error:^(RCConnectErrorCode errorCode) {
NSLog(@"IM connect failed, error code : %ld",(long)errorCode);
}]; -
(可选)App 可以先将音频输出切换到扬声器。详见音频路由。
// 1.设置切换听筒为扬声器
[[RCRTCEngine sharedInstance] enableSpeaker:YES]; -
主播端需要配置房间信息并加入房间。
// 配置房间
RCRTCRoomConfig *config = [[RCRTCRoomConfig alloc] init];
config.roomType = RCRTCRoomTypeLive;
config.liveType = RCRTCLiveTypeAudioVideo;
config.roleType = RCRTCLiveRoleTypeBroadcaster;
[[RCRTCEngine sharedInstance] joinRoom:@"你的房间号"
config:config
completion:^(RCRTCRoom * _Nullable room, RCRTCCode code) {
if (code != RCRTCCodeSuccess) {
}
// 可以通过实现 <RCRTCRoomEventDelegate> 的方法来监听房间相关事件回调
room.delegate = self;
}]; -
主播端创建本地视频渲染的 view。
// 1.初始化本地渲染视图
RCRTCVideoView *view = [[RCRTCVideoView alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
// 2.设置视频流的渲染视图
[[RCRTCEngine sharedInstance].defaultVideoStream setVideoView:view];
// 3.添加渲染视图
[self.view addSubview:view]; -
开始摄像头采集。
[[RCRTCEngine sharedInstance].defaultVideoStream startCapture];
发布资源
发布资源前,请确定已经以主播身份加入房间、开启摄像头采集以及设置完视频流的渲染视图并添加在本地视图上以供显示。
-
当 RCRTCRoomType 为
RCRTCRoomTypeLive
时,主播在配置完房间并加入后可以发布默认音视频流。此接口仅直播模式的主播可用。- (void)publishDefaultLiveStreams:(RCRTCLiveOperationCallback)completion;
[[RCRTCEngine sharedInstance].room.localUser publishDefaultLiveStreams:^(BOOL isSuccess, RCRTCCode desc, RCRTCLiveInfo * _Nullable liveInfo) {
// 可以通过拿到的liveInfo对象进行推流相关配置
}]; -
如果主播想要单独发布默认音频流,视频流或者自定义视频流时,可以使用另外一个发布接口。此接口仅直播模式的主播可用。详情可跳转视频流相关-发布自定义流中查看。
- (void)publishLiveStream:(nonnull RCRTCOutputStream *)stream completion:(nonnull RCRTCLiveOperationCallback)completion;
参数 类型 说明 stream RCRTCOutputStream 发布的音视频流 completion RCRTCLiveOperationCallback 发布完成回调 示例代码:
// 创建本地渲染视图
RCRTCVideoView *localFileVideoView = [[RCRTCVideoView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
localFileVideoView.fillMode = RCRTCVideoFillModeAspectFit;
localFileVideoView.frameAnimated = NO;
[self.view addSubview:localFileVideoView];
// 创建自定义视频流
NSString *tag = @"RongRTCFileVideo";
RCRTCVideoOutputStream *fileVideoOutputStream = [[RCRTCVideoOutputStream alloc] initVideoOutputStreamWithTag:tag];
// 设置自定义视频流配置
RCRTCVideoStreamConfig *videoConfig = fileVideoOutputStream.videoConfig;
videoConfig.videoSizePreset = RCRTCVideoSizePreset640x480;
[fileVideoOutputStream setVideoConfig:videoConfig];
[fileVideoOutputStream setVideoView:localFileVideoView];
// 设置自定义视频流的视频源
NSString *path = [[NSBundle mainBundle] pathForResource:@"video_demo1_low"
ofType:@"mp4"];
RCRTCFileSource *fileCapturer = [[RCRTCFileSource alloc] initWithFilePath:path];
fileCapturer.delegate = self;
fileVideoOutputStream.videoSource = fileCapturer;
[fileCapturer setObserver:fileVideoOutputStream];
// 发布自定义视频流
[[RCRTCEngine sharedInstance].room.localUser publishLiveStream:fileVideoOutputStream
completion:^(BOOL isSuccess, RCRTCCode code, RCRTCLiveInfo * _Nullable liveInfo) {
if (code == RCRTCCodeSuccess) {
}
}];
取消发布
主播发布本地资源后也可以取消发布,主播专用取消发布接口有 2 个。
-
取消发布本地默认音视频流,此接口仅直播模式的主播可用, 即 RCRTCRoomType 为
RCRTCRoomTypeLive
可用。- (void)unpublishDefaultLiveStreams:(RCRTCOperationCallback)completion;
[[RCRTCEngine sharedInstance].room.localUser unpublishDefaultLiveStreams:^(BOOL isSuccess, RCRTCCode code) {
}]; -
取消发布本地指定音视频流,此接口仅直播模式的主播可用, 即 RCRTCRoomType 为
RCRTCRoomTypeLive
可用。[[RCRTCEngine sharedInstance].room.localUser unpublishLiveStream:self.fileVideoOutputStream
completion:^(BOOL isSuccess, RCRTCCode code) {
}];参数 类型 说明 stream RCRTCOutputStream 取消发布的音视频流 completion RCRTCOperationCallback 取消发布的音视频流完成回调
获取资源
对于主播身份,远端用户音视频流可以通过以下两种方式取得:
-
加入房间前远端用户已经发布资源,则在加入房间后取得的 RCRTCRoom 对象的 RCRTCRemoteUser 中的
remoteStreams
中取得。[[RCRTCEngine sharedInstance] joinRoom:_roomId
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) {
// 可以在此订阅远端音视频资源
}
}
}
}]; -
加入房间后远端用户才发布资源,可以通过房间代理方法取得音视频流数组。
- (void)didPublishStreams:(NSArray<RCRTCInputStream *> *)streams {
// 可以在此订阅远端音视频资源
}
订阅资源
远端用户发布音视频流后,可以通过加入房间后返回的 RCRTCRoom 中的订阅方法订阅多路远端指定音视频流。同一个流只能填写在 avStreams
或 tinyStreams
中的一个数组中。
NSArray *tinyStream = isTiny ? streams : @[];
NSArray *ordinaryStream = isTiny ? @[] : streams;
// 订阅房间中远端用户音视频流资源
[[RCRTCEngine sharedInstance].room.localUser subscribeStream:ordinaryStream
tinyStreams:tinyStream
completion:^(BOOL isSuccess, RCRTCCode desc) {
if (desc != RCRTCCodeSuccess) {
return;
}
// 创建并设置远端视频预览视图
NSInteger i = 0;
for (RCRTCInputStream *stream in streamArray) {
if (stream.mediaType == RTCMediaTypeVideo) {
if (i==0) {
// 1.初始化渲染远端视频的 view
RCRTCRemoteVideoView *view = [[RCRTCRemoteVideoView alloc]initWithFrame:CGRectMake(100, 400, 100, 100)];
// 2.设置视频流的渲染视图
[(RCRTCVideoInputStream *)stream setVideoView:view];
// 3.添加渲染视图
[self.view addSubview:view];
}else{
// 其他远端视图逻辑
}
}
}
}];
参数 | 类型 | 说明 |
---|---|---|
avStreams | RCRTCInputStream | 普通流 |
tinyStreams | RCRTCInputStream | 需要携带小流的流数组 |
completion | RCRTCOperationCallback | 订阅资源完成的回调 |
取消订阅
-
通过代理收到远端用户取消发布音视频流后,可以调用 RCRTCRoom 中 RCRTCLocalUser 的取消订阅的方法,取消订阅该用户的音视频流。退出房间时不需要取消订阅,SDK 内部会处理。
[[RCRTCEngine sharedInstance].room.localUser unsubscribeStreams:streams
completion:^(BOOL isSuccess, RCRTCCode code) {
}];参数 类型 说明 streams NSArray 音视频流集合 completion RCRTCOperationCallback 取消订阅完成的回调 -
也可以取消订阅远端指定音视频流。
[[RCRTCEngine sharedInstance].room.localUser unsubscribeStream:stream
completion:^(BOOL isSuccess,RCRTCCode desc) {
}];参数 类型 说明 stream RCRTCInputStream 音视频流 completion RCRTCOperationCallback 取消订阅完成的回调