1 筹备环境
在开始集成 ZEGO Express SDK 前,请确保开发环境满足以下要求:
- Xcode 12.0 或以上版本。
- iOS 9.0 或以上版本且反对音视频的 iOS 设施。
-
iOS 设施曾经连贯到 Internet。
2 我的项目筹备
2.1 创立我的项目
进入即构官网,在【ZEGO 控制台】创立我的项目,并申请无效的 AppID,这一步很要害,appid 为利用的惟一标识,如身份证号,是利用的身份证明,用于明确你的我的项目及组织身份。zego 提供的服务也是基于 APP ID;
App ID 的获取形式很简略,只需 3~5 分钟,在即构官网 - 我的我的项目 - 创立即可。创立的我的项目信息可用于 SDK 的集成和配置;
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'
Zego
Express
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/dashb… 获取长期的音视频 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 开发者帐号,疾速开始。