如何用AI技术降噪? QCon 广州“音视频架构实践”专场给你答案! 了解详情
写点什么

基于 Agora SDK 实现 iOS 端的一对一视频通话

  • 2020 年 2 月 25 日
  • 本文字数:4308 字

    阅读完需:约 14 分钟

基于 Agora SDK 实现 iOS 端的一对一视频通话

本文介绍基于 Agora SDK 在 iOS 端实现一对一视频通话。


Demo 体验

Agora 在 GitHub 上提供开源的实时音视频通话示例项目 Agora-iOS-Tutorial-Objective-C-1to1 与 Agora-iOS-Tutorial-Swift-1to1。在实现相关功能前,你可以下载并查看源代码。


Github:https://github.com/AgoraIO/Basic-Video-Call/tree/master/One-to-One-Video


前提条件

  • Xcode 9.0 或以上版本

  • 支持 iOS 8.0 或以上版本的 iOS 设备

  • 有效的 Agora 账户(免费注册)

  • 注:如果你的网络环境部署了防火墙,请根据声网文档中心的「应用企业防火墙限制」打开相关端口。


准备开发环境

本节介绍如何创建项目,并将 Agora SDK 集成至你的项目中。


创建 iOS 项目

参考以下步骤创建一个 iOS 项目。若已有 iOS 项目,可以直接跳过这一步。


  1. 打开 Xcode 并点击 Create a new Xcode project。

  2. 选择项目类型为 Single View App,并点击 Next。

  3. 输入项目信息,如项目名称、开发团队信息、组织名称和语言,并点击 Next。

  4. Note:如果你没有添加过开发团队信息,会看到 Add account… 按钮。点击该按钮并按照屏幕提示登入 Apple ID,完成后即可选择你的账户作为开发团队。

  5. 选择项目存储路径,并点击 Create。

  6. 将你的 iOS 设备连接至电脑。

  7. 进入 TARGETS > Project Name > General > Signing 菜单,选择 Automatically manage signing,并在弹出菜单中点击 Enable Automatic。


集成 SDK

选择如下任意一种方式将 Agora SDK 集成到你的项目中。


方法一:使用 CocoaPods 自动集成


  1. 开始前确保你已安装 Cocoapods。参考 Getting Started with CocoaPods 安装说明。

  2. 在 Terminal 里进入项目根目录,并运行 pod init 命令。项目文件夹下会生成一个 Podfile 文本文件。

  3. 打开 Podfile 文件,修改文件为如下内容。注意将 Your App 替换为你的 Target 名称。


# platform :ios, '9.0' use_frameworks!target 'Your App' do pod 'AgoraRtcEngine_iOS'end
复制代码


  1. 在 Terminal 内运行 pod update 命令更新本地库版本。

  2. 运行 pod install 命令安装 Agora SDK。成功安装后,Terminal 中会显示 Pod installation complete!,此时项目文件夹下会生成一个 xcworkspace 文件。

  3. 打开新生成的 xcworkspace 文件。

  4. 方法二:手动复制 SDK 文件

  5. 前往 SDK 下载页面,获取最新版的 Agora SDK,然后解压。

  6. 将 libs 文件夹内的 AgoraRtcEngineKit.framework 文件复制到项目文件夹下。

  7. 打开 Xcode,进入 TARGETS > Project Name > Build Phases > Link Binary with Libraries 菜单,点击 + 添加如下库。在添加 AgoraRtcEngineKit.framework 文件时,还需在点击 + 后点击 Add Other…,找到本地文件并打开。

  8. 添加前:

  9. 添加后:


  • AgoraRtcEngineKit.framework

  • Accelerate.framework

  • AudioToolbox.framework

  • AVFoundation.framework

  • CoreMedia.framework

  • CoreML.framework

  • CoreTelephony.framework

  • libc++.tbd

  • libresolv.tbd

  • SystemConfiguration.framework

  • VideoToolbox.framework

  • 如需支持 iOS 9.0 或更低版本的设备,请在 Xcode 中将对 CoreML.framework 的依赖设为 Optional。


添加媒体设备权限


根据场景需要,在 info.plist 文件中,点击 + 图标开始添加如下内容,获取相应的设备权限:


添加前:


添加后:


实现音视频通话

本节介绍如何实现音视频通话。视频通话的 API 调用时序见下图:



  1. 创建用户界面


根据场景需要,为你的项目创建音视频通话的用户界面。若已有用户界面,可以直接查看导入类。


如果你想实现一个视频通话,我们推荐你添加如下 UI 元素:


  • 本地视频窗口

  • 远端视频窗口

  • 结束通话按钮

  • 当你使用示例项目中的 UI 设计时,你将会看到如下界面:



  1. 导入类


在项目中导入 AgoraRtcEngineKit 类:


// Objective-C#import <AgoraRtcEngineKit/AgoraRtcEngineKit.h>// Swiftimport AgoraRtcEngineKit
复制代码


Agora Native SDK 默认使用 libc++ (LLVM),如需使用 libstdc++ (GNU),请联系 sales@agora.io。SDK 提供的库是 Fat Image,包含 32/64 位模拟器、32/64 位真机版本。


3. 初始化 AgoraRtcEngineKit


在调用其他 Agora API 前,需要创建并初始化 AgoraRtcEngineKit 对象。


你需要在该步骤中填入项目的 App ID。请参考如下步骤在控制台创建 Agora 项目并获取 App ID。


登录控制台,点击左侧导航栏的项目管理图标 。


点击创建,按照屏幕提示设置项目名,选择一种鉴权机制,然后点击提交。


在项目管理页面,你可以获取该项目的 App ID。


调用 sharedEngineWithAppId 方法,传入获取到的 App ID,即可初始化 AgoraRtcEngineKit。


你还可以根据场景需要,在初始化时注册想要监听的回调事件,如本地用户加入频道,及解码远端用户视频首帧等。


// Objective-C- (void)initializeAgoraEngine {    // 输入 App ID 并初始化 AgoraRtcEngineKit 类。    self.agoraKit = [AgoraRtcEngineKit sharedEngineWithAppId:appID delegate:self];}// Swiftfunc initializeAgoraEngine() {   // 输入 App ID 并初始化 AgoraRtcEngineKit 类。   agoraKit = AgoraRtcEngineKit.sharedEngine(withAppId: AppID, delegate: self)}
复制代码


  1. 设置本地视图


如果你想实现一个语音通话,可以直接查看加入频道。


成功初始化 AgoraRtcEngineKit 对象后,需要在加入频道前设置本地视图,以便在通话中看到本地图像。参考以下步骤设置本地视图:


  • 调用 enableVideo 方法启用视频模块。

  • 调用 setupLocalVideo 方法设置本地视图。


// Objective-C// 启用视频模块。[self.agoraKit enableVideo];- (void)setupLocalVideo {    AgoraRtcVideoCanvas *videoCanvas = [[AgoraRtcVideoCanvas alloc] init];    videoCanvas.uid = 0;    videoCanvas.view = self.localVideo;    videoCanvas.renderMode = AgoraVideoRenderModeHidden;    // 设置本地视图。    [self.agoraKit setupLocalVideo:videoCanvas];}
复制代码


// Swift// 启用视频模块。agoraKit.enableVideo()func setupLocalVideo() {  let videoCanvas = AgoraRtcVideoCanvas()  videoCanvas.uid = 0  videoCanvas.view = localVideo  videoCanvas.renderMode = .hidden  // 设置本地视图。  agoraKit.setupLocalVideo(videoCanvas)}

复制代码


  1. 加入频道


完成初始化和设置本地视图后(视频通话场景),你就可以调用 joinChannelByToken 方法加入频道。你需要在该方法中传入如下参数:


  • channelId: 传入能标识频道的频道 ID。输入频道 ID 相同的用户会进入同一个频道。

  • token: 传入能标识用户角色和权限的 Token。你可以设置如下值:

  • nil。

  • 控制台中生成的临时 Token。一个临时 Token 的有效期为 24 小时,详情见获取临时 Token。

  • 你的服务器端生成的正式 Token。适用于对安全要求较高的生产环境,详情见生成 Token。

  • 若项目已启用 App 证书,请使用 Token。

  • uid: 本地用户的 ID。数据类型为整型,且频道内每个用户的 uid 必须是唯一的。若将 uid 设为 0,则 SDK 会自动分配一个 uid,并在 joinSuccessBlock 回调中报告。

  • joinSuccessBlock:成功加入频道回调。joinSuccessBlock 优先级高于 didJoinChannel,2 个同时存在时,didJoinChannel 会被忽略。需要有 didJoinChannel 回调时,请将 joinSuccessBlock 设置为 nil。

  • 更多的参数设置注意事项请参考 joinChannelByToken 接口中的参数描述。


// Objective-C- (void)joinChannel {    // 加入频道。    [self.agoraKit joinChannelByToken:token channelId:@"demoChannel1" info:nil uid:0 joinSuccess:^(NSString *channel, NSUInteger uid, NSInteger elapsed) {    }];}
复制代码


// Swiftfunc joinChannel() {    // 加入频道。    agoraKit.joinChannel(byToken: Token, channelId: "demoChannel1", info:nil, uid:0) { [unowned self] (channel, uid, elapsed) -> Void in}    self.isLocalVideoRender = true            self.logVC?.log(type: .info, content: "did join channel")        }        isStartCalling = true}
复制代码


  1. 设置远端视图


视频通话中,通常你也需要看到其他用户。在加入频道后,可通过调用 setupRemoteVideo 方法设置远端用户的视图。


远端用户成功加入频道后,SDK 会触发 firstRemoteVideoDecodedOfUid 回调,该回调中会包含这个远端用户的 uid 信息。在该回调中调用 setupRemoteVideo 方法,传入获取到的 uid,设置远端用户的视图。


// Objective-C// 监听 firstRemoteVideoDecodedOfUid 回调。// SDK 接收到第一帧远端视频并成功解码时,会触发该回调。// 可以在该回调中调用 setupRemoteVideo 方法设置远端视图。- (void)rtcEngine:(AgoraRtcEngineKit *)engine firstRemoteVideoDecodedOfUid:(NSUInteger)uid size: (CGSize)size elapsed:(NSInteger)elapsed {    if (self.remoteVideo.hidden) {        self.remoteVideo.hidden = NO;    }    AgoraRtcVideoCanvas *videoCanvas = [[AgoraRtcVideoCanvas alloc] init];    videoCanvas.uid = uid;    videoCanvas.view = self.remoteVideo;    videoCanvas.renderMode = AgoraVideoRenderModeHidden;    // 设置远端视图。    [self.agoraKit setupRemoteVideo:videoCanvas];}
复制代码


// Swift// 监听 firstRemoteVideoDecodedOfUid 回调。// SDK 接收到第一帧远端视频并成功解码时,会触发该回调。// 可以在该回调中调用 setupRemoteVideo 方法设置远端视图。func rtcEngine(_ engine: AgoraRtcEngineKit, firstRemoteVideoDecodedOfUid uid:UInt, size:CGSize, elapsed:Int) {        isRemoteVideoRender = true        let videoCanvas = AgoraRtcVideoCanvas()        videoCanvas.uid = uid        videoCanvas.view = remoteVideo        videoCanvas.renderMode = .hidden        // 设置远端视图。        agoraKit.setupRemoteVideo(videoCanvas)    }
复制代码


  1. 离开频道


根据场景需要,如结束通话、关闭 App 或 App 切换至后台时,调用 leaveChannel 离开当前通话频道。


// Objective-C- (void)leaveChannel {    // 离开频道。    [self.agoraKit leaveChannel:^(AgoraChannelStats *stat)}// Swiftfunc leaveChannel() {        // 离开频道。        agoraKit.leaveChannel(nil)        isRemoteVideoRender = false        isLocalVideoRender = false        isStartCalling = false        self.logVC?.log(type: .info, content: "did leave channel")    }## 
复制代码


示例代码


你可以在 Agora-iOS-Tutorial-Objective-C-1to1/Agora-iOS-Tutorial-Swift-1to1 示例项目的 VideoChatViewController.m/VideoChatViewController.swift 文件中查看完整的源码和代码逻辑。


运行项目


你可以在 iOS 设备中运行此项目。当成功开始视频通话时,你可以同时看到本地和远端的视图。


本文转载自声网 Agora 公众号。


原文链接:https://mp.weixin.qq.com/s/LVN9jJUiBBV0Kf8HMGAdpw


2020 年 2 月 25 日 15:14962

评论

发布
暂无评论
发现更多内容

在函数计算中到底该不该使用 VPC?

donghui

Serverless

Linux I/O 原理和 Zero-copy 技术全面揭秘

赖猫

c++ Linux linux编程 服务器开发 I/O

区块链大趋势

CECBC

数字经济

超强Android进阶路线知识图谱:Kotlin可能带来的一个深坑,持续更新中

欢喜学安卓

android 程序员 面试 移动开发

K线成交量管理系统开发、成交量管理系统开发

W13902449729

K线成交量管理系统开发 成交量管理系统开发

细节!3部分讲明白HotSpot:运行时+编译器+垃圾回收器

996小迁

Java 架构 虚拟机 hotspot

案例研究之聊聊 QLExpress 源码 (六)

小诚信驿站

28天写作 QLExpress源码 聊聊源码

企业如何预防短信验证码被别人盗用

香芋味的猫丶

短信防刷 短信轰炸机 短信验证码 短信防轰炸 短信防火墙

现货合约量化交易系统开发搭建

薇電13242772558

数字货币 策略模式

持续集成对IT团队和企业分别有哪些好处?

禅道项目管理

DevOps 运维 开发 CI/CD

区块链发展应以密码应用创新为根基

CECBC

区块链 密码学

比特币矿机工作原理

v16629866266

比特币 比特币区块链

Java 程序经验小结:类层次优于标签类

后台技术汇

28天写作

五分钟快速掌握Maven的核心概念

Java架构师迁哥

为什么建议没事不要随便用工厂模式创建对象?

码农架构

Java 学习 设计模式

如何利用策略模式避免冗长的if-else/switch分支判断代码?

码农架构

Java 学习 设计模式

高并发架构---TCP

赖猫

TCP 后端 高并发 TCP/IP 服务器开发

工作11年,从阿里P8出来,头发也没了,人也虚了,就剩下这份笔记了!

Java架构之路

Java 程序员 架构 面试 编程语言

字节内部MySQL宝典意外流出!极致经典,堪称数据库的天花板

比伯

Java 编程 架构 面试 程序人生

2021年编排将成为DevSecOps关键推动者

啸天

DevSecOps 应用安全 开发安全

阿里2021年首次公开五份Java并发编程全彩小册:模型+原理+应用+模式+面试题五管齐下

Java架构追梦

Java 学习 架构 面试 并发编程

“区块链+数字身份”,道路坎坷前途光明

CECBC

数字技术

阿里面试官纯手打:金九银十跳槽必会Java核心知识点笔记整理

Java架构之路

Java 程序员 架构 面试 编程语言

并发阻塞队列(BlockingQueue)— 生产者消费者模式核心部件

码农架构

Java 架构 jdk 设计模式

WiFi6 与 5G 的异同分析

石君

5G wifi 28天写作

中美上市软件公司对比中的投资启示

ToB行业头条

量化策略交易软件开发|量化策略交易系统APP开发

系统开发

Linux网络之 从 C10K 到 DPDK

赖猫

c++ Linux linux编程 C10K DPDK

DeFi流动性挖矿管理系统开发|去中心化金融借贷系统开发

W13902449729

去中心化金融借贷系统开发 DeFi流动性管理系统开发

厉害了!来看看这份超全面的《Android面试题及解析》,一线互联网公司面经总结

欢喜学安卓

android 程序员 面试 移动开发

「云智公开课」百度沧海·存储

「云智公开课」百度沧海·存储

基于 Agora SDK 实现 iOS 端的一对一视频通话_前端_声网_InfoQ精选文章