本文介绍 iOS SDK API 的使用方法。
权限与隐私
添加摄像头权限。接入方 App 需要在 Info.plist 中添加如下代码:
<key>NSCameraUsageDescription</key> <string>Camera access needed for video calling</string>
添加麦克风权限。接入方 App 需要在 Info.plist 中添加如下代码:
<key>NSMicrophoneUsageDescription</key> <string>Microphone access needed for video calling</string>
重要由于通话功能需要开启麦克风权限,因此在进入通话界面之前,请检查接入方 App 是否具备麦克风权限。如果具备麦克风权限,则直接进入通话界面;否则引导用户开启麦克风权限。
麦克风权限检查请参见系统中的 AVCaptureDevice 类,示例如下:
[AVCaptureDevice requestAccessForMediaType:mediaType completionHandler:^(BOOL granted) { if (granted) { } }];
初始化 ARTVCEngine 并监听事件回调
初始化设置 uid 和 delegate。
_artvcEgnine = [[ARTVCEngine alloc] init]; _artvcEgnine.uid = self.uid; _artvcEgnine.delegate = self;
监听事件回调(按需实现回调,比如需要实现错误处理)。
#pragma mark - ARTVCEngineDelegate -(void)didReceiveRoomInfo:(ARTVCRoomInfomation*)roomInfo{ } -(void)didReceiveLocalFeed:(ARTVCFeed*)localFeed{ self.feedForPreview = localFeed; } -(void)didEncounterError:(NSError *)error forFeed:(ARTVCFeed*)feed{ [self showToastWith:[NSString stringWithFormat:@"%@, Error:%@",feed,error] duration:2.0]; } .....
设置视频编码分辨率
设置视频编码分辨率代码如下:
//设置视频编码分辨率,默认是 ARTVCVideoProfileType_640x360_15Fps。
artvcEgnine.videoProfileType = ARTVCVideoProfileType_640x360_15Fps;
设置自动/手动推拉流开关
设置自动/手动推拉流开关代码如下,默认为自动推流/拉流。
_artvcEgnine.autoPublish = YES;
_artvcEgnine.autoSubScribe = YES;
设置音视频通话/纯音频通话
音视频通话
ARTVCPublishConfig* config = [[ARTVCPublishConfig alloc] init]; config.videoEnable = YES;//默认是 YES config.audioEnable = YES;//默认是 YES config.videoProfile = _artvcEgnine.videoProfileType; _artvcEgnine.autoPublishConfig = config; ARTVCSubscribeOptions* options = [[ARTVCSubscribeOptions alloc] init]; _artvcEgnine.autoSubscribeOptions = options;
纯音频通话
ARTVCPublishConfig* config = [[ARTVCPublishConfig alloc] init]; config.videoEnable = NO; config.audioEnable = YES;//默认是 YES _artvcEgnine.autoPublishConfig = config; ARTVCSubscribeOptions* options = [[ARTVCSubscribeOptions alloc] init]; options.receiveVideo = NO; _artvcEgnine.autoSubscribeOptions = options;
音视频通话下启动相机预览
如果是纯音频通话,则跳过此步骤。
//默认使用前置摄像头,如果设置为 YES 则使用后置摄像头。
[_artvcEgnine startCameraPreviewUsingBackCamera:NO];
启动相机预览后,如果本地 feed 没有被回调过。之后回调会返回一个
ARTVCFeed
对象,可用于关联后续返回的渲染 view。-(void)didReceiveLocalFeed:(ARTVCFeed*)localFeed forPublishConfig:(ARTVCPublishConfig*)publishConfig{ self.feedForPreview = localFeed; }
预览 view 初始化的回调。
-(void)didVideoRenderViewInitialized:(UIView*)renderView forFeed:(ARTVCFeed*)feed{ if([feed isEqual:self.feedForPreview]){ [self showToastWith:@"video preview view created" duration:1.0]; }else{ self.feedForRemote = feed; }; //可触发 UI 布局,把 renderView add 到 view 层级中去 }
预览首帧渲染的回调。
-(void)didFirstVideoFrameRendered:(UIView*)renderView forFeed:(ARTVCFeed*)feed{ }
创建或者加入房间
作为主叫方,创建房间。
ARTVCCreateRoomParams* params = [[ARTVCCreateRoomParams alloc] init]; params.uid = self.uid; params.bizName = DEMO_BIZ; params.subBiz = DEMO_SUBBIZ; params.signature = DEMO_SIGNATURE; [_artvcEgnine createRoom:params];
创建房间成功,会有房间信息回调。
-(void)didReceiveRoomInfo:(ARTVCRoomInfomation*)roomInfo{ }
创建房间失败,会有 Error 回调。
//error.code == ARTVCErrorCodeProtocolErrorCreateRoomFailed -(void)didEncounterError:(NSError *)error forFeed:(ARTVCFeed*)feed{ }
其他人加入房间后,会有成员加入房间的回调。
-(void)didParticepantsEntered:(NSArray<ARTVCParticipantInfo*>*)participants{ }
作为主被叫方,加入房间。
ARTVCJoinRoomParams* params = [[ARTVCJoinRoomParams alloc] init]; params.uid = self.uid; params.bizName = DEMO_BIZ; params.subBiz = DEMO_SUBBIZ; params.roomId = self.roomId; params.signature = DEMO_SIGNATURE; params.rtoken = self.rtoken; [_artvcEgnine joinRoom:params];
加入房间成功,会有加入房间成功的回调以及房间已有成员的回调。
-(void)didJoinroomSuccess{ } -(void)didParticepantsEntered:(NSArray<ARTVCParticipantInfo*>*)participants{ }
加入房间失败,会有 Error 回调。
//error.code == ARTVCErrorCodeProtocolErrorJoinRoomFailed -(void)didEncounterError:(NSError *)error forFeed:(ARTVCFeed*)feed{ }
后续其他人加入房间后,会有成员加入房间的回调。
-(void)didParticepantsEntered:(NSArray<ARTVCParticipantInfo*>*)participants{ }
创建或者加入房间成功后开始推流与拉流
默认是自动推流与拉流。
推流/拉流过程中,有如下相关状态回调。
-(void)didConnectionStatusChangedTo:(ARTVCConnectionStatus)status forFeed:(ARTVCFeed*)feed{ [self showToastWith:[NSString stringWithFormat:@"connection status:%d\nfeed:%@",status,feed] duration:1.0]; if((status == ARTVCConnectionStatusClosed) && [feed.uid isEqualToString:[self uid]]){ [self.artvcEgnine stopCameraPreview];//音视频通话下,停止摄像头预览。 [self.artvcEgnine leaveRoom]; } }
ARTVCConnectionStatus 状态解释。
枚举
值
说明
ARTVCConnectionStatusConnecting
200
开始发布和订阅时,首先回调该状态。
ARTVCConnectionStatusConnected
202
发布/订阅成功时回调该状态。
ARTVCConnectionStatusDisConnected
203
出现闪断,底层媒体流断开,底层会做自动重连。业务拿到这个回调仅做用户提示,不需要做 leaveRoom 处理。
ARTVCConnectionStatusFailed
204
底层 ICE 失败无法继续,是一个终极错误。业务拿到这个回调可做停止摄像头 leaveRoom 处理。
ARTVCConnectionStatusClosed
206
每次发布和订阅结束时,回调该状态。它是最后的状态,业务拿到这个回调可做停止摄像头 leaveRoom 处理。
推流成功后,其他房间成员会收到新 feed 的回调。
-(void)didNewFeedAdded:(ARTVCFeed*)feed{ [self showToastWith:[NSString stringWithFormat:@"new feed published by others:%@",feed] duration:2.0]; }
自动订阅模式下,会主动订阅该 feed。
订阅成功后,房间其他成员会收到如下回调。
-(void)didSubscriber:(NSString*)subscriber subscribedAFeed:(ARTVCFeed*)feed{ [self showToastWith:[NSString stringWithFormat:@"subscriber subscribed :%@",feed] duration:2.0]; }
通话结束
音视频通话停止摄像头并离开房间。
[_artvcEgnine stopCameraPreview]; [_artvcEgnine leaveRoom];
纯音频通话离开房间。
[_artvcEgnine leaveRoom];
成员离开房间后,房间其他成员会收到成员离开的回调。
-(void)didParticepant:(ARTVCParticipantInfo*)participant leaveRoomWithReason:(ARTVCParticipantLeaveRoomReasonType)reason{ [self showToastWith:[NSString stringWithFormat:@"participant left:%@ reason:%d",participant,reason] duration:2.0]; }
自动发布订阅模式下离开房间,会自动取消发布本地的流以及取消订阅曾订阅过的流。
取消发布后,房间其他成员会收到取消发布的回调。
-(void)didFeedRemoved:(ARTVCFeed*)feed{ [self showToastWith:[NSString stringWithFormat:@"feed unpublished by others:%@",feed] duration:2.0]; }
取消订阅后,房间其他成员会收到取消订阅的回调。
-(void)didSubscriber:(NSString*)subscriber unsubscribedAFeed:(ARTVCFeed*)feed{ [self showToastWith:[NSString stringWithFormat:@"subscriber unsubscribed :%@",feed] duration:2.0]; }