更新时间:2022-02-16 06:37:55
在实现基本功能前,请您确保下载最新 SDK,请参见 SDK 下载。
获得加入频道必须的频道鉴权令牌(Token):
说明 本文中的实现方法为主要功能方法,仅供参考,您可以根据业务需求进行实际开发。
@interface ViewController () <AliRtcEngineDelegate> @property (nonatomic, strong) AliRtcEngine *engine; @end
iOS 回调详情请参见回调及监听。
self.engine = [AliRtcEngine sharedInstance:self extras:@""];
说明目前 SDK 暂不支持多实例。
AliVideoCanvas *canvas = [[AliVideoCanvas alloc] init]; canvas.renderMode = AliRtcRenderModeAuto; canvas.view = (AliRenderView *)view; /* 预览窗口view */ canvas.mirrorMode = AliRtcRenderMirrorModeOnlyFrontCameraPreviewEnabled; [self.engine setLocalViewConfig:canvas forTrack:AliRtcVideoTrackCamera]; [self.engine startPreview];
您也可以取消本地预览。
[self.engine stopPreview];
说明
/* 设置自动发布和订阅,只能在加入频道之前配置。 autoPublish:是否自动发布。取值:YES|NO。 autoSubscribe:是否自动订阅。取值:YES|NO。 */ [self.engine setAutoPublish:YES withAutoSubscribe:YES];
AliRtcAuthInfo *authinfo = [[AliRtcAuthInfo alloc]init]; authinfo.channel = /* 您的channelId */; authinfo.appid = /* 您的Appid */; authinfo.nonce = /* 您的nonce */; authinfo.user_id = /* 您的userId */; authinfo.token = /* 您的token */; authinfo.timestamp = /* 您的timestamp */; authinfo.gslb = /* 您的gslb地址 */; [self.engine joinChannel:authinfo name:/* userName */ onResult:^(NSInteger errCode){ // 加入频道UI处理 }];
如果发布过程中需要变更配置或者停止发布,需要按如下流程先重新设置配置参数,然后再调用 publish 接口。
//YES表示允许发布音频流,NO表示不允许。 [self.engine configLocalAudioPublish:YES]; //YES表示允许发布相机流,NO表示不允许。 [self.engine configLocalCameraPublish:YES]; //YES表示允许发布次要视频流;NO表示不允许。 [self.engine configLocalSimulcast:YES forTrack:AliRtcVideoTrackCamera]; [self.engine publish:^(int err) { }];
取消发布本地流。
[self.engine configLocalAudioPublish:NO]; [self.engine configLocalCameraPublish:NO]; [self.engine configLocalSimulcast:NO forTrack:AliRtcVideoTrackCamera]; [self.engine publish:^(int err) { }];
如果订阅过程中需要变更配置或者停止订阅,需要按如下流程先重新设置配置参数,然后再调用 subscribe 接口。
//YES表示允许订阅音频流,NO表示不允许。 [self.engine configRemoteAudio:/* remoteUserID */ enable:YES]; //YES表示允许订阅屏幕流,NO表示不允许。 [self.engine configRemoteScreenTrack:/* remoteUserID */ enable:YES]; //第二个参数:YES表示优先拉取大流。 //第三个参数:YES表示允许订阅相机流,NO表示不允许。 [self.engine configRemoteCameraTrack:/* remoteUserID */ preferMaster:YES enable:YES]; [self.engine subscribe:/* remoteUserID */ onResult:^(NSString *uid, AliRtcVideoTrack vt, AliRtcAudioTrack at) { }];
无论是自动模式还是非自动模式,当您订阅成功后,通过 delegate 可以获取订阅的 callback,然后您可以进行相关 UI 操作或逻辑处理。
- (void)onSubscribeChangedNotify:(NSString *)uid audioTrack:(AliRtcAudioTrack)audioTrack videoTrack:(AliRtcVideoTrack)videoTrack { dispatch_async(dispatch_get_main_queue(), ^{ // UI或者逻辑处理,例如渲染远端视频流的操作如下。 if(videoTrack & AliRtcVideoTrackCamera) { // camera track AliVideoCanvas *canvas = [[AliVideoCanvas alloc] init]; canvas.renderMode = /* renderMode */; canvas.view = (AliRenderView *)view;/* 渲染view */ [self.engine setRemoteViewConfig:canvas uid:uid forTrack:AliRtcVideoTrackCamera]; } }); }
您可以通过下述 delegate 回调监听远端用户的流状态变更。例如,手动模式下,收到此回调后,可以获取到远端用户的发布状态,然后相应做出订阅(subscribe)操作,或者更新 UI 等。
- (void)onRemoteTrackAvailableNotify:(NSString *)uid audioTrack:(AliRtcAudioTrack)audioTrack videoTrack:(AliRtcVideoTrack)videoTrack { }
取消订阅远程流。
[self.engine configRemoteAudio:/* remoteUserID */ enable:NO]; [self.engine configRemoteScreenTrack:/* remoteUserID */ enable:NO]; [self.engine configRemoteCameraTrack:/* remoteUserID */ preferMaster:YES enable:NO]; [self.engine subscribe:/* remoteUserID */ onResult:^(NSString *uid, AliRtcVideoTrack vt, AliRtcAudioTrack at) { }];
[self.engine leaveChannel];
您可以下载示例代码,快速跑通 Demo,实现频道内和其他人进行实时音视频通话,详情请参见 iOS Demo。
「视频云技术」你最值得关注的音视频技术公众号,每周推送来自阿里云一线的实践技术文章,在这里与音视频领域一流工程师交流切磋。