基于 Agora SDK 实现 macOS 端的一对一视频通话
Posted 声网Agora
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于 Agora SDK 实现 macOS 端的一对一视频通话相关的知识,希望对你有一定的参考价值。
前提条件
-
Xcode 9.0 或以上版本 -
支持 macOS 10.10 或以上版本的 macOS 设备 -
有效的 Agora 账户(免费注册)
注:如果你的网络环境部署了防火墙,请根据声网文档中心的「应用企业防火墙限制」打开相关端口。
准备开发环境
创建 macOS 项目
如果你没有添加过开发团队信息,会看到 Add account… 按钮。点击该按钮并按照屏幕提示登入 Apple ID,完成后即可选择你的账户作为开发团队。
集成 SDK
pod init
命令。项目文件夹下会生成一个 Podfile 文本文件。
Your App
替换为你的 Target 名称。
# platform :macOS, '10.11' use_frameworks!
target 'Your App' do
pod 'AgoraRtcEngine_macOS'
end
pod update
命令更新本地库版本。
pod install
命令安装 Agora SDK。成功安装后,Terminal 中会显示
Pod installation complete!
,此时项目文件夹下会生成一个 xcworkspace 文件。
添加后:
-
AgoraRtcEngineKit.framework -
Accelerate.framework -
CoreWLAN.framework -
libc++.dylib -
libresolv.9.tbd -
SystemConfiguration.framework -
VideoToolbox.framework
添加媒体设备权限
添加后:
根据苹果官方要求:
对于在 Mac App Store 发布的软件,需要启用 App Sandbox 设置。详见苹果官方声明。
对于不在 Mac App Store 发布的软件,需要启用 Hardened Runtime 设置。详见苹果官方声明。
实现音视频通话
1. 创建用户界面
-
本地视频窗口 -
远端视频窗口 -
结束通话按钮
2. 导入类
AgoraRtcEngineKit
类:
// Objective-C
#import <AgoraRtcEngineKit/AgoraRtcEngineKit.h>
// Swift
import AgoraRtcEngineKit
3. 初始化 AgoraRtcEngineKit
AgoraRtcEngineKit
对象。
-
登录控制台,点击左侧导航栏的项目管理图标 。 -
点击创建,按照屏幕提示设置项目名,选择一种鉴权机制,然后点击提交。 -
在项目管理页面,你可以获取该项目的 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 = 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
。
// 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 = true
self.logVC?.log(type: .info, content: "did join channel")
}
isStartCalling = true
}
6. 设置远端视图
setupRemoteVideo
方法设置远端用户的视图。
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. 离开频道
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 = nil
view.window!.close()
}
示例代码
运行项目
如开发中遇到问题,可访问 RTC 开发者社区发帖提问
以上是关于基于 Agora SDK 实现 macOS 端的一对一视频通话的主要内容,如果未能解决你的问题,请参考以下文章
基于 Agora SDK 实现 Windows 端的多人视频互动(基于3.6.2版本)
基于 Agora SDK 实现 Windows 端的一对一视频通话(基于3.6.2版本)
如何基于 Agora Android SDK 在应用中实现视频通话?