前提條件
在實作基本功能前,請您確定下載下傳最新 SDK,請參見
SDK 下載下傳。
獲得加入頻道必須的頻道鑒權令牌(Token):
- 您可以在控制台生成臨時 Token 校驗加入頻道是否成功,詳情請參見 控制台生成 Token
- 在安全要求更高的場景下,建議您在服務端生成 Token,詳情請參見 服務端生成 Token
說明 本文中的實作方法為主要功能方法,僅供參考,您可以根據業務需求進行實際開發。
操作步驟
- 請您先初始化 SDK。首先您需要建立 AliRtcEngine 執行個體,并注冊 AliRtcEngineDelegate 監聽相關回調。如果您在 ViewController 中持有 AliRtcEngine 執行個體,請聲明屬性。
@interface ViewController () <AliRtcEngineDelegate>
@property (nonatomic, strong) AliRtcEngine *engine;
@end
iOS 回調詳情請參見
回調及監聽self.engine = [AliRtcEngine sharedInstance:self extras:@""];
說明目前 SDK 暫不支援多執行個體。
-
- 本地預覽。在建立完 AliRtcEngine 執行個體後,您可以建立 canvas 布局進行本地預覽視訊。
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];
說明
-
-
- AliRtcRenderMode 提供四種渲染模式。
-
-
-
-
- (推薦)AliRtcRenderModeAuto:自動模式。
- AliRtcRenderModeStretch:拉伸填充視圖,不保持視訊比例。
- AliRtcRenderModeFill:在保持視訊寬高比的同時縮放,填充黑邊。
- AliRtcRenderModeCrop:在保持視訊寬高比的同時縮放,并裁剪以适合視圖。
-
-
-
-
- view 必須是 AliRenderView 或者其子類。
- AliRtcRenderMirrorMode 在本地或遠端均可設定鏡像模式,并提供三種鏡像模式。
-
-
-
-
- AliRtcRenderMirrorModeOnlyFrontCameraPreviewEnabled:隻有前置攝像頭預覽鏡像,其餘不鏡像。
- AliRtcRenderMirrorModeAllEnabled:全部鏡像。
- AliRtcRenderMirrorModeAllDisabled:全部不鏡像。
-
-
-
- 設定自動或者手動模式。說明阿裡雲 RTC iOS 端預設實作自動釋出和訂閱,您也可以通過代碼手動釋出和訂閱。
-
-
- 自動釋出模式: 如果您打開自動釋出模式,加入頻道之後,SDK 将自動開始釋出音視訊流;如果關閉自動釋出模式,則需要您調用 publish 接口之後才會釋出音視訊流。
- 自動訂閱模式: 如果您打開自動訂閱模式,加入頻道之後,SDK 将會自動訂閱目前頻道内其他人的音視訊流;如果關閉自動訂閱模式,則需要您調用 subscribe 接口之後才會訂閱其他人的音視訊流。
-
/*
設定自動釋出和訂閱,隻能在加入頻道之前配置。
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 接口。
- 手動釋出模式下:加入頻道成功後,可通過以下接口釋出本地流。
如果釋出過程中需要變更配置或者停止釋出,需要按如下流程先重新設定配置參數,然後再調用 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 接口。
- 手動訂閱模式下:加入頻道成功後,可通過以下接口訂閱遠端流。
如果訂閱過程中需要變更配置或者停止訂閱,需要按如下流程先重新設定配置參數,然後再調用 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「視訊雲技術」你最值得關注的音視訊技術公衆号,每周推送來自阿裡雲一線的實踐技術文章,在這裡與音視訊領域一流工程師交流切磋。
