在開始集成 ZEGO Express SDK 前,請確保開發環境滿足以下要求 ...
1 準備環境
在開始集成 ZEGO Express SDK 前,請確保開發環境滿足以下要求:
- Xcode 12.0 或以上版本。
- iOS 9.0 或以上版本且支持音視頻的 iOS 設備。
- iOS 設備已經連接到 Internet。
2 項目準備
2.1 創建項目
進入即構官網,在【ZEGO控制台】創建項目,並申請有效的 AppID,這一步很關鍵,appid為應用的唯一標識,如身份證號,是應用的身份證明,用於明確你的項目及組織身份。zego提供的服務也是基於APP ID;
2.2 Token 鑒權
- 登錄房間時必須 使用 Token 鑒權 ,可參考 Token 鑒權教程
- 為了方便開發階段的調試,開發者可直接在 ZEGO 控制台獲取臨時 Token(有效期為 24 小時) 來使用,詳情請參考 控制台(新版) - 項目管理 中的 “項目信息”。
3 集成
3.1 項目設置
開始集成前,可參考如下步驟設置你的項目;
如已有項目,本步驟可忽略。
如需新建項目,可按照以下步驟創建你的新項目:
-
啟動 Xcode,在 “Welcome to Xcode” 視窗中單擊 “Create a new Xcode project” 或選擇 “File > New > Project” 菜單。在出現的表單中,選擇 iOS 平臺,併在 “Application” 下選擇 “App”。
-
填寫表單並選取各個選項來配置項目,完成後,單擊 “Next”。
必須提供 “Product Name” 和 “Organization Identifier”,用於創建 App 的唯一標識 “Bundle Identifier”。
-
選擇項目存儲路徑,單擊 “Create” 創建項目。
3.2 導入 SDK
使用 CocoaPods 自動集成
- 安裝 CocoaPods
- 打開終端,進入項目根目錄,執行
pod init
命令創建 Podfile 文件。 - 打開 Podfile 文件,在 “target” 下添加
po``d``'``Z``ego``E``xpress``Engine/V``ideo'
,需要將 “MyProject” 替換為開發者的 Target 名稱。
target 'MyProject' do
use_frameworks!
pod 'ZegoExpressEngine/Video'
end
- 執行
pod repo update
命令更新本地索引,確保能安裝最新版本的 SDK,最新版本號請參考 下載 SDK 包 中的發佈歷史。 - 執行
pod install
命令安裝 SDK。
4 實現流程
用戶通過 ZEGO Express SDK 進行視頻通話的基本流程為:
用戶 A、B 加入房間,用戶 B 預覽並將音視頻流推送到 ZEGO 雲服務(推流),用戶 A 收到用戶 B 推送音視頻流的通知之後,在通知中播放用戶 B 的音視頻流(拉流)。
整個音視頻通話推拉流過程的 API 調用時序如下圖:
4.1 初始化
1. 創建界面
根據場景需要,為你的項目創建視頻通話的用戶界面。我們推薦你在項目中添加如下元素:
- 本地視頻視窗
- 遠端視頻視窗
- 結束通話按鈕
2.引入頭文件,準備基礎工作
// 引入 ZegoExpressEngine.h 頭文件
#import <ZegoExpressEngine/ZegoExpressEngine.h>
@interface ViewController ()<ZegoEventHandler>
//拉取播放其他用戶音視頻流的 view
@property (strong, nonatomic) UIView *remoteUserView;
//開始視頻通話的按鈕
@property (strong, nonatomic) UIButton *startVideoTalkButton;
//停止視頻通話的按鈕
@property (strong, nonatomic) UIButton *stopVideoTalkButton;
@end
- (void)viewDidLoad {
[super viewDidLoad];
[self setupUI];
}
- (void)setupUI {
self.remoteUserView = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 180, 250)];
self.remoteUserView.backgroundColor = [UIColor lightGrayColor];
[self.view addSubview:self.remoteUserView];
self.startVideoTalkButton = [UIButton buttonWithType:UIButtonTypeSystem];
[self.view addSubview:self.startVideoTalkButton];
self.startVideoTalkButton.frame = CGRectMake(100, self.view.bounds.size.height - 280, 150, 50);
[self.startVideoTalkButton.titleLabel setFont:[UIFont systemFontOfSize:32]];
[self.startVideoTalkButton setTitle:@"開始通話" forState:UIControlStateNormal];
[self.startVideoTalkButton addTarget:self action:@selector(startVideoTalk:) forControlEvents:UIControlEventTouchUpInside];
self.stopVideoTalkButton = [UIButton buttonWithType:UIButtonTypeSystem];
[self.view addSubview:self.stopVideoTalkButton];
self.stopVideoTalkButton.frame = CGRectMake(100, self.view.bounds.size.height - 200, 150, 50);
[self.stopVideoTalkButton.titleLabel setFont:[UIFont systemFontOfSize:32]];
[self.stopVideoTalkButton setTitle:@"停止通話" forState:UIControlStateNormal];
[self.stopVideoTalkButton setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
[self.stopVideoTalkButton addTarget:self action:@selector(stopVideoTalk:) forControlEvents:UIControlEventTouchUpInside];
}
- (void)startVideoTalk:(UIButton *)button {
[self createEngine];
[self loginRoom];
[self startPublish];
}
3. 創建引擎
調用 createEngineWithProfile 介面,將申請到的 AppID 傳入參數 “appID”,創建引擎單例對象。
註冊回調,可將實現了 ZegoEventHandler 的對象(例如 “self”)傳入參數 “eventHandler”。
- (void)createEngine {
ZegoEngineProfile *profile = [[ZegoEngineProfile alloc] init];
// 請通過官網註冊獲取,格式為:1234567890
profile.appID = <#appID#>;
//通用場景接入
profile.scenario = ZegoScenarioGeneral;
// 創建引擎,並註冊 self 為 eventHandler 回調。不需要註冊回調的話,eventHandler 參數可以傳 nil,後續可調用 "-setEventHandler:" 方法設置回調
[ZegoExpressEngine createEngineWithProfile:profile eventHandler:self];
}
6.2 登錄房間
調用 loginRoom 介面登錄房間。roomID 和 user 的參數由您本地生成,但是需要滿足以下條件:
- 同一個 AppID 內,需保證 “roomID” 全局唯一。
- 同一個 AppID 內,需保證 “userID” 全局唯一,建議開發者將 “userID” 與自己業務的賬號系統進行關聯。
- (void)loginRoom {
// roomID 由您本地生成,需保證 “roomID” 全局唯一。不同用戶要登陸同一個房間才能進行通話
NSString *roomID = @"room1";
// 創建用戶對象,ZegoUser 的構造方法 userWithUserID 會將 “userName” 設為與傳的參數 “userID” 一樣。“userID” 與 “userName” 不能為 “nil”,否則會導致登錄房間失敗。
// userID 由您本地生成,需保證 “userID” 全局唯一。
ZegoUser *user = [ZegoUser userWithUserID:@"user1"];
// 只有傳入 “isUserStatusNotify” 參數取值為 “true” 的 ZegoRoomConfig,才能收到 onRoomUserUpdate 回調。
ZegoRoomConfig *roomConfig = [[ZegoRoomConfig alloc] init];
//token 由用戶自己的服務端生成,為了更快跑通流程,也可以通過即構控制台 https://console.zego.im/dashboard 獲取臨時的音視頻 token
roomConfig.token = @"<#token#>";
roomConfig.isUserStatusNotify = YES;
// 登錄房間
[[ZegoExpressEngine sharedEngine] loginRoom:roomID user:user config:roomConfig callback:^(int errorCode, NSDictionary * _Nullable extendedData) {
// (可選回調) 登錄房間結果,如果僅關註登錄結果,關註此回調即可
if (errorCode == 0) {
NSLog(@"房間登錄成功");
} else {
// 登錄失敗,請參考 errorCode 說明 https://doc-zh.zego.im/article/4377
NSLog(@"房間登錄失敗");
}
}];
}
登錄狀態(房間連接狀態)回調
調用登錄房間介面之後,您可通過監聽 onRoomStateUpdate 回調實時監控自己在本房間內的連接狀態。
3.3 預覽自己的畫面,並推送到 ZEGO 音視頻雲
1. 預覽自己的畫面
如果希望看到本端的畫面,可調用 startPreview 介面設置預覽視圖,並啟動本地預覽。
2. 將自己的音視頻流推送到 ZEGO 音視頻雲
在用戶調用 loginRoom 介面後,可以直接調用 startPublishingStream 介面,傳入 “streamID”,將自己的音視頻流推送到 ZEGO 音視頻雲。您可通過監聽 onPublisherStateUpdate 回調知曉推流是否成功。
“streamID” 由您本地生成,但是需要保證:
同一個 AppID 下,“streamID” 全局唯一。如果同一個 AppID 下,不同用戶各推了一條 “streamID” 相同的流,後推流的用戶推流失敗。
- (void)startPublish {
// 設置本地預覽視圖並啟動預覽,視圖模式採用 SDK 預設的模式,等比縮放填充整個 View
[[ZegoExpressEngine sharedEngine] startPreview:[ZegoCanvas canvasWithView:self.view]];
// 用戶調用 loginRoom 之後再調用此介面進行推流
// 在同一個 AppID 下,開發者需要保證 “streamID” 全局唯一,如果不同用戶各推了一條 “streamID” 相同的流,後推流的用戶會推流失敗。
[[ZegoExpressEngine sharedEngine] startPublishingStream:@"stream1"];
}
3.4 拉取其他用戶的音視頻
進行視頻通話時,我們需要拉取到其他用戶的音視頻。
在同一房間內的其他用戶將音視頻流推送到 ZEGO 音視頻雲時,我們會在 onRoomStreamUpdate 回調中收到音視頻流新增的通知,並可以通過 ZegoStream 獲取到某條流的 “streamID”。
我們可以在該回調中,調用 startPlayingStream ,傳入 “streamID” 拉取拉取播放該用戶的音視頻。您可通過監聽 onPlayerStateUpdate 回調知曉是否成功拉取音視頻。
// 房間內其他用戶推流/停止推流時,我們會在這裡收到相應流增減的通知
- (void)onRoomStreamUpdate:(ZegoUpdateType)updateType streamList:(NSArray<ZegoStream *> *)streamList extendedData:(NSDictionary *)extendedData roomID:(NSString *)roomID {
//當 updateType 為 ZegoUpdateTypeAdd 時,代表有音視頻流新增,此時我們可以調用 startPlayingStream 介面拉取播放該音視頻流
if (updateType == ZegoUpdateTypeAdd) {
// 開始拉流,設置遠端拉流渲染視圖,視圖模式採用 SDK 預設的模式,等比縮放填充整個View
// 如下 remoteUserView 為 UI 界面上 View.這裡為了使示例代碼更加簡潔,我們只拉取新增的音視頻流列表中第的第一條流,在實際的業務中,建議開發者迴圈遍歷 streamList ,拉取每一條音視頻流
NSString *streamID = streamList[0].streamID;
[[ZegoExpressEngine sharedEngine] startPlayingStream:streamID canvas:[ZegoCanvas canvasWithView:self.remoteUserView]];
}
}
7 運行效果
音視頻的基礎功能已完成,接下來我們運行下效果,1步快速檢驗成果。
step1 , 與好友一起安裝編譯好的App,在手機上可以看到對方併進行通話互動。
完成以上,說明你成功啦!
Enjoy與好友的歡樂時光!
獲取更多文檔、Demo、技術幫助
獲取本文的Demo、開發文檔、技術支持。
獲取SDK的商務活動、熱門產品。
註冊即構ZEGO開發者帳號,快速開始。