乐趣区

关于音视频:基于-ZEGO-SDK-实现-iOS-一对一音视频聊天应用

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 我的项目设置

开始集成前,可参考如下步骤设置你的我的项目;

如已有我的项目,本步骤可疏忽。

如需新建我的项目,可依照以下步骤创立你的新我的项目:

  1. 启动 Xcode,在“Welcome to Xcode”窗口中单击“Create a new Xcode project”或抉择“File > New > Project”菜单。在呈现的表单中,抉择 iOS 平台,并在“Application”下抉择“App”。
  2. 填写表单并选取各个选项来配置我的项目,实现后,单击“Next”。
    必须提供“Product Name”和“Organization Identifier”,用于创立 App 的惟一标识“Bundle Identifier”。
  1. 抉择我的项目存储门路,单击“Create”创立我的项目。

3.2 导入 SDK

应用 CocoaPods 主动集成

  1. 装置 CocoaPods
  2. 关上终端,进入我的项目根目录,执行 pod init 命令创立 Podfile 文件。
  3. 关上 Podfile 文件,在“target”下增加 po`d'ZegoExpressEngine/V`ideo',须要将“MyProject”替换为开发者的 Target 名称。

    target 'MyProject' do
     use_frameworks!
     pod 'ZegoExpressEngine/Video'
    end
  4. 执行 pod repo update 命令更新本地索引,确保能装置最新版本的 SDK,最新版本号请参考 下载 SDK 包 中的公布历史。
  5. 执行 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 开发者帐号,疾速开始。

退出移动版