使用 iOS SDK

本文介绍 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{
    }

创建或者加入房间

  1. 作为主叫方,创建房间。

    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{
      }
  2. 作为主被叫方,加入房间。

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