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

前提条件

  • Xcode 9.0 或以上版本

  • 支持 macOS 10.10 或以上版本的 macOS 设备

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

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

准备开发环境

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

创建 macOS 项目

参考以下步骤创建一个 macOS 项目。若已有 macOS 项目,可以跳脱这一步,直接查看本文「集成 SDK」小节。

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

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

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

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

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

5. 进入 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 :macOS, '10.11' use_frameworks!
target 'Your App' dopod 'AgoraRtcEngine_macOS'
end

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

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

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

方法二:手动复制 SDK 文件

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

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

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

添加前:

添加后:

  • AgoraRtcEngineKit.framework

  • Accelerate.framework

  • CoreWLAN.framework

  • libc++.dylib

  • libresolv.9.tbd

  • SystemConfiguration.framework

  • VideoToolbox.framework

添加媒体设备权限

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

添加前:

添加后:

2. 若你的项目已启用 App Sandbox 或 Hardened Runtime 设置,则需勾选如下内容,获取相应的设备权限:

根据苹果官方要求:

  • 对于在 Mac App Store 发布的软件,需要启用 App Sandbox 设置。详见苹果官方声明。

  • 对于不在 Mac App Store 发布的软件,需要启用 Hardened Runtime 设置。详见苹果官方声明。

实现音视频通话

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

1. 创建用户界面

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

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

  • 本地视频窗口

  • 远端视频窗口

  • 结束通话按钮

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

2. 导入类

在项目中导入 AgoraRtcEngineKit 类:

// Objective-C
#import <AgoraRtcEngineKit/AgoraRtcEngineKit.h>
// Swift
import 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。

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

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

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

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

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

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

4. 设置本地视图

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

成功初始化 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 = 0videoCanvas.view = localVideovideoCanvas.renderMode = .hidden// 设置本地视图agoraKit.setupLocalVideo(videoCanvas)
}

5. 加入频道

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

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

  • token:传入能标识用户角色和权限的 Token。可设为如下一个值:

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

    • nil

    • 临时 Token。临时 Token 服务有效期为 24 小时。你可以在控制台里生成一个临时 Token,详见获取临时 Token。

    • 在你的服务器端生成的 Token。在安全要求高的场景下,我们推荐你使用此种方式生成的 Token,详见生成 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) {}];
}
// Swift
func joinChannel() {// 加入频道agoraKit.joinChannel(byToken: Token, channelId: "demoChannel1", info:nil, uid:0) { [unowned self] (channel, uid, elapsed) -> Void in}self.isLocalVideoRender = trueself.logVC?.log(type: .info, content: "did join channel")}isStartCalling = true
}

6. 设置远端视图

视频通话中,通常你也需要看到其他用户。在加入频道后,可通过调用 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 = truelet videoCanvas = AgoraRtcVideoCanvas()videoCanvas.uid = uidvideoCanvas.view = remoteVideovideoCanvas.renderMode = .hidden// 设置远端视图agoraKit.setupRemoteVideo(videoCanvas)}

7. 离开频道

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

// Objective-C
- (void)leaveChannel {// 离开频道。[self.agoraKit leaveChannel:^(AgoraChannelStats *stat)
}
// Swift
func leaveChannel() {
// 离开频道AgoraKit.leaveChannel(nil)AgoraKit.setupLocalVideo(nil)remoteVideo.removeFromSuperview()localVideo.removeFromSuperview()delegate?.VideoChatNeedClose(self)AgoraKit = nilview.window!.close()}

示例代码

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

运行项目

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

如开发中遇到问题,可访问 RTC 开发者社区发帖提问

基于 Agora SDK 实现 macOS 端的一对一视频通话相关推荐

  1. 基于 Agora SDK 实现 Windows 端的一对一视频通话

    前提条件 Microsoft Visual Studio 2017 或以上版本 支持 Windows 7 或以上版本的 Windows 设备 有效的 Agora 账户(免费注册) 注:如果你的网络环境 ...

  2. 基于 Agora SDK 实现 Android 端的多人视频互动

    本系列教程将分为三期,分享基于 Agora SDK 在各系统平台应用中实现一对一视频通话.多人互动直播,以及结合跨平台技术进行开发.本期推送在 Android.iOS.Windows.Web.macO ...

  3. 基于 Agora SDK 实现 Windows 端的多人视频互动(基于3.6.2版本)

    本文介绍如何通过 Agora SDK 在 Windows 平台快速实现互动直播.互动直播和实时通话的区别就在于,直播频道的用户有角色之分.你可以将角色设置为主播或者观众,其中主播可以收.发流,观众只能 ...

  4. 基于 Agora SDK 实现 iOS 端的多人视频互动

    本文介绍如何使用 Agora SDK 快速实现互动直播. 互动直播和实时通话的区别就在于,直播频道的用户有角色之分.你可以将角色设置为主播,或者观众,其中主播可以收.发流,观众只能收流. Demo 体 ...

  5. 基于 Agora SDK 实现 Web 端的多人视频互动

    根据本文指导快速集成 Agora Web SDK 并在你自己的 app 里实现音视频互动直播. 本文会详细介绍如何建立一个简单的项目并使用 Agora Web SDK 实现基础的互动直播.我们建议你阅 ...

  6. 基于声网 SDK 实现 iOS 端的一对一视频通话

    在很多产品,加入实时视频通话已经不是新鲜事情了,尤其是近几年的疫情影响,个人公司国家对于实时音视频的需求一直在快速的增长.例如视频会议.社交应用.实时游戏,甚至也可能出现在一些元宇宙的场景中. 本文将 ...

  7. 如何基于 Agora Android SDK 在应用中实现视频通话?

    在很多产品,实时视频通话已经不是新鲜的功能了,例如视频会议.社交应用.在线教育,甚至也可能出现在一些元宇宙的场景中. 本文将教你如何通过声网Agora 视频 SDK 在 Android 端实现一个视频 ...

  8. Unity Metaverse(八)、RTC Engine 基于Agora声网SDK实现音视频通话

    文章目录 简介 创建应用 构建应用场景 API调用与回调事件 测试 简介 本文介绍如何在Unity中接入声网SDK,它可以应用的场景有许多,例如直播.电商.游戏.社交等,音视频通话是其实时互动的基础能 ...

  9. 如何基于Agora Web SDK实现小程序互动连麦

    微信在12月底开放了小程序的直播功能,主要面向社交.教育.医疗.政务民生.金融应用场景.目前已经有支持直播的小程序上线,比如实现音频直播的"荔枝FM播客",以及花椒的"百 ...

最新文章

  1. 《MATLAB图像处理超级学习手册》导读
  2. php cdata,PHPcdata处理(详细介绍)_PHP教程
  3. javascript:void(0)
  4. 左右侧边栏固定宽,中间宽度自适应
  5. VS 2017 + EF6 + MySQL5.7 建立实体模型闪退问题
  6. 5条线程轮流打印1~100
  7. disk dynamic invalid 解决办法 动态磁盘转换器
  8. 信号的频谱分析实验matlab,实验三 用FFT对信号进行频谱分析及MATLAB程序
  9. java模拟器安卓7,指小游Java模拟器
  10. LaTeX参考文献_解决问题:Something‘s wrong--perhaps a missing \item. \end{thebibliography}
  11. R语言数据可视化之美:专业图表绘制指南
  12. OBS软件转发直播他人直播画面方式方法(包含插件下载地址)
  13. Window 7和 server 2003系统下载
  14. 【高项】整体管理(ITTO)
  15. HCI - ImageJ软件的简介
  16. 基于Asterisk的VoIP开发指南——(1)实现基本呼叫功能
  17. 【计算机组成原理】一位全加器
  18. 免费好用的流程图、UML工具
  19. 浏览器渲染原理的学习与总结
  20. ESP32_驱动TFT彩屏_Arduino

热门文章

  1. 获取textarea标签中的换行符和空格
  2. django框架全解
  3. pyinstaller打包原理,常见问题。
  4. C++动态规划入门习题+解析
  5. mysql 关联查询
  6. 智伴机器人tf卡下载地址_入门操作详解教你如何玩转智伴1X机器人!
  7. 火车票抢票API 根据乘客的车次与座席要求快速订票出票 1
  8. abuse file struct 阅读记录
  9. java开发工具IntelliJ IDEA全新版本V2022.2更新详情(二)
  10. C sort 排序函数用法