写点什么

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

  • 2020-02-25
  • 本文字数:4263 字

    阅读完需:约 14 分钟

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

本文介绍基于 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。

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

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

  6. 进入 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’ do


pod ‘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…,找到本地文件并打开。

  4. 添加前:

  5. 添加后:


  • AgoraRtcEngineKit.framework

  • Accelerate.framework

  • CoreWLAN.framework

  • libc++.dylib

  • libresolv.9.tbd

  • SystemConfiguration.framework

  • VideoToolbox.framework

添加媒体设备权限

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

  2. 添加前:



添加后:



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

  2. 根据苹果官方要求:


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

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

实现音视频通话

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


1. 创建用户界面

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


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


  • 本地视频窗口

  • 远端视频窗口

  • 结束通话按钮

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

2. 导入类

在项目中导入 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。


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


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


3.在项目管理页面,你可以获取该项目的 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)}
复制代码

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 = 0  videoCanvas.view = localVideo  videoCanvas.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) {    }];}
复制代码


// 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}
复制代码

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 = true        let videoCanvas = AgoraRtcVideoCanvas()        videoCanvas.uid = uid        videoCanvas.view = remoteVideo        videoCanvas.renderMode = .hidden        // 设置远端视图        agoraKit.setupRemoteVideo(videoCanvas)    }
复制代码

7. 离开频道

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


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


示例代码


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

运行项目

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


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


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


2020-02-25 15:161123

评论

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

裸辞底气!GitHub飙升“java面试笔记2023” 了解下八股文天花板

Java你猿哥

Java 面试 Spring Boot ssm 八股文

读书笔记丨远程服务调用和RESTful,如何分析和抉择?

华为云开发者联盟

开发 华为云 华为云开发者联盟 企业号 4 月 PK 榜 远程服务调用

从源码全面解析LinkedBlockingQueue的来龙去脉

Spring Boot 整合 Redis 基于 Stream 消息队列 实现异步秒杀下单

Java你猿哥

Java redis stream ssm 消息队列

聊聊 IP packet 的 TTL 与 tcp segment 的 MSL

明哥的IT随笔

TCP/IP TTL MSL

阿里新一代微服务,内部大佬手抄的笔记+脑图不容错过,全是精华

Java 架构 微服务 Spring Cloud Aliababa

与全球开发者创新共赢,全球首个“开发者村” 正式落成

极客天地

YARN 远程代码执行(RCE)安全漏洞问题分析与解决方案

明哥的IT随笔

大数据 YARN 数据安全 RCE

Spring Boot 整合 Redis 基于 Stream 消息队列 实现异步秒杀下单

ChatGPT 会在三年内终结编程吗?| 社区征文

神木鼎

三周年征文

HashData认证云原生数据仓库管理工程师培训报名开启!

酷克数据HashData

Apache Flink ML 2.2.0 发布公告

阿里云大数据AI技术

大数据 算法 企业号 4 月 PK 榜

从此脱离CRUD!Github热榜第三架构师速成手册成功颠覆了我的认知

Java你猿哥

架构 ssm 架构设计 架构师 微服务实战

逆天!腾讯大神纯手撸“架构师速成手册”Github狂获4.5kstar

Java你猿哥

Java 架构 ssm 架构设计 架构师

亿级日活业务稳如磐石,华为云CodeArts PerfTest发布

华为云开发者联盟

云计算 后端 华为云 华为云开发者联盟 企业号 4 月 PK 榜

堡垒机英文是什么?有哪些品牌?

行云管家

网络安全 堡垒机

蚂蚁安全科技 Nydus 镜像加速实践

SOFAStack

开源 镜像 镜像安全 OCI Nydus

算法题每日一练: 青蛙跳台阶

知心宝贝

数据结构 算法 前端 后端 三周年连更

阿里技术官神作!大厂亿级流量性能调优学习手册,堪称保姆级教学

Java 性能优化 性能调优

合合信息新推出反光消除技术,助力手写文字识别更精准

合合技术团队

人工智能 文字识别 扫描全能王 反光去除

ByteHouse云数仓版查询性能优化和MySQL生态完善

NineData

数据库 架构 字节跳动 Clickhouse bytehouse

【FAQ】关于JavaScript版本的华为地图服务Map的点击事件与Marker的点击事件存在冲突的解决方案

HarmonyOS SDK

HMS Core

那些关于DIP器件不得不说的坑

华秋PCB

插件 DIP 元器件 PCB PCB设计

一文详解多模态认知智能

华为云开发者联盟

人工智能 华为云 AIGC 华为云开发者联盟 企业号 4 月 PK 榜

区块链基础设施 NFTScan 新增支持 Aptos 网络

NFT Research

区块链+ NFT

本铯智能科技是家怎样的共享电动车厂家?

共享电单车厂家

共享电动车厂家 共享电单车厂商 本铯智能科技 本铯智能电动车厂家

聊聊 Zookeeper 的 4lw 与信息安全

明哥的IT随笔

zookeeper 数据安全

人脸活体检测初识

六月的雨在InfoQ

人脸活体检测 三周年连更 人脸数据库 人脸辨识度

阿里限量的性能调优+微服务+高并发设计,真的太香了!

Java 微服务架构 系统设计 性能调优 亿级并发

运维报表有哪些内容?有什么用?

行云管家

运维 报表 IT运维 容器化部署

Apifox WebSocket 调试功能你会用了吗?

Apifox

程序员 接口 websocket API API 调试

基于 Agora SDK 实现 macOS 端的一对一视频通话_文化 & 方法_声网_InfoQ精选文章