写点什么

基于 Agora SDK 实现 macOS 端的多人视频互动

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

    阅读完需:约 17 分钟

基于 Agora SDK 实现 macOS 端的多人视频互动

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

Demo 体验

Agora 在 GitHub 上提供开源的互动直播示例项目 OpenLive-macOS-Objective-C/OpenLive-macOS-Swift。在实现相关功能前,你可以下载并查看源代码:


Github:https://github.com/AgoraIO/Basic-Video-Broadcasting

前提条件

  • 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。

  7. 集成 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
复制代码


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

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

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

方法二:手动复制 SDK 文件

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


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


打开 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 文件中,点击 + 图标开始添加如下内容,获取相应的设备权限


添加前:



添加后:



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


根据 Apple 官方要求:


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

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

  • Hardened Runtime 设置中的 Library Validation 会阻止 app 加载框架、插件或库,除非框架、插件或库是由 Apple 或是与 app 相同的团队 ID 签名的。当遇到需要取消该安全限制的场景(例如无法枚举到第三方虚拟摄像头)时,请勾选 Hardened Runtime -> Runtime Exceptions -> Disable Library Validation。

实现互动直播

本节介绍如何实现互动直播。互动直播的 API 调用时序见下图:



  1. 创建用户界面


根据场景需要,为你的项目创建互动直播的用户界面。若已有用户界面,可以直接查看导入类。


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


  • 主播视频窗口

  • 退出频道按钮


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



  1. 导入类


在项目中导入 AgoraRtcEngineKit 类:


// Objective-C#import <AgoraRtcEngineKit/AgoraRtcEngineKit.h>
// Swiftimport AgoraRtcEngineKitAgora Native SDK 默认使用 libc++ (LLVM),如需使用 libstdc++ (GNU),请联系 sales@agora.io。SDK 提供的库是 Fat Image,包含 32/64 位模拟器、32/64 位真机版本。
复制代码


  1. 初始化 AgoraRtcEngineKit


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


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


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

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

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

  4. 调用 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. 设置频道模式


初始化结束后,调用 setChannelProfile 方法,将频道模式设为直播。


一个 AgoraRtcEngineKit 只能使用一种频道模式。如果想切换为其他模式,需要先调用 destroy 方法释放当前的 AgoraRtcEngineKit 实例,然后使用 sharedEngineWithAppId 方法创建一个新实例,再调用 setChannelProfile 设置新的频道模式。


// Objective-C// 设置频道模式。[self.rtcEngine setChannelProfile:AgoraChannelProfileLiveBroadcasting];
// Swift// 设置频道模式。agoraKit.setChannelProfile(.liveBroadcasting)
复制代码


  1. 设置用户角色


直播频道有两种用户角色:主播和观众,其中默认的角色为观众。设置频道模式为直播后,你可以在 App 中参考如下步骤设置用户角色:


  1. 让用户选择自己的角色是主播还是观众

  2. 调用 setClientRole 方法,然后使用用户选择的角色进行传参

  3. 注意,直播频道内的用户,只能看到主播的画面、听到主播的声音。加入频道后,如果你想切换用户角色,也可以调用 setClientRole 方法。


// Objective-C if (self.isBroadcaster) {        self.clientRole = AgoraClientRoleAudience;        if (self.fullSession.uid == 0) {            self.fullSession = nil;        }    } else {        self.clientRole = AgoraClientRoleBroadcaster;    }    // 设置用户角色。    [self.rtcEngine setClientRole:self.clientRole];
// Swift// 设置用户角色。agoraKit.setClientRole(.audience)agoraKit.setClientRole(.broadcaster)
复制代码


  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 addLocalSession() {    let localSession = VideoSession.localSession()    videoSessions.append(localSession)    // 设置本地视图。    agoraKit.setupLocalVideo(localSession.canvas)     let mediaInfo = MediaInfo(dimension: settings.dimension,                                  fps: settings.frameRate.rawValue)    localSession.mediaInfo = mediaInfo    }
复制代码


  1. 加入频道

  2. 完成初始化和设置本地视图后(视频通话场景),你就可以调用 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// 加入频道。agoraKit.joinChannel(byToken: KeyCenter.Token, channelId: channelId, info: nil, uid: 0, joinSuccess: nil)
复制代码


  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) { let userSession = videoSession(of: uid) userSession.updateMediaInfo(resolution: size) // 设置远端视图。 agoraKit.setupRemoteVideo(userSession.canvas) }
复制代码


  1. 离开频道


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


// Objective-C[self.rtcEngine setupLocalVideo:nil];    // 离开频道。    [self.rtcEngine leaveChannel:nil];    if (self.isBroadcaster) {        [self.rtcEngine stopPreview];    }// Swiftfunc leaveChannel() {           setIdleTimerActive(true)    agoraKit.setupLocalVideo(nil)    // 离开频道。    agoraKit.leaveChannel(nil)    if settings.role == .broadcaster {       agoraKit.stopPreview()    }    navigationController?.popViewController(animated: true)    }
复制代码

示例代码

你可以在 OpenLive-macOS-Objective-C/OpenLive-macOS-Swift 示例项目中查看完整的源码和代码逻辑。


Github:https://github.com/AgoraIO/Basic-Video-Broadcasting

运行项目

你可以在 macOS 设备中运行此项目。当成功开始视频直播时,主播可以看到自己的画面;观众可以看到主播的画面。


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


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


2020-02-25 15:17623

评论

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

SpringBoot实现幕课网在线学习系统

Java 程序员 后端

SpringBoot技术实践-SpringRetry重试框架(1)

Java 程序员 后端

鸿蒙轻内核虚拟内存基础知识:虚拟内存进程空间编号

华为云开发者联盟

鸿蒙 虚拟内存 鸿蒙轻内核 虚拟内存进程空间编号

SpringBoot整合Elasticsearch

Java 程序员 后端

Spring--基于AOP实现事务控制

Java 程序员 后端

Spring--基于IOC的CRUD操作

Java 程序员 后端

spring-cloud-kubernetes背后的三个关键知识点

Java 程序员 后端

SpringBoot使用Logbook记录HTTP请求响应日志

Java 程序员 后端

SpringBoot技术实践-SpringRetry重试框架

Java 程序员 后端

从环境搭建到回归神经网络案例,带你掌握Keras

华为云开发者联盟

Python 神经网络 tensorflow keras 回归神经网络

Springboot 最简单的发送邮件(文本、附件、图片)实战案例

Java 程序员 后端

SpringBoot+shiro+mybatis实现权限登录

Java 程序员 后端

springboot多数据源配合docker部署mysql主从实现读写分离(1)

Java 程序员 后端

springboot实现AOP切面编程

Java 程序员 后端

SpringBoot快速整合Mybatis&MybatisPlus

Java 程序员 后端

Springboot 整合 Current-Limiting 实现接口限流

Java 程序员 后端

springboot多数据源配合docker部署mysql主从实现读写分离

Java 程序员 后端

SpringBoot快速整合Mybatis&MybatisPlus(1)

Java 程序员 后端

焱融科技 YRCloudFile 与安腾普完成兼容认证,共创存储新蓝图

焱融科技

云计算 分布式 高性能 文件存储 科技

springboot整合mybatis

Java 程序员 后端

Springboot 实现 上传、下载 以及解决必须项目重启才能访问资源的问题

Java 程序员 后端

Springboot 整合Retry 实现重试机制

Java 程序员 后端

SpringBoot实现图片上传demo&Nginx进行代理显示

Java 程序员 后端

SpringBoot实现对HikariCP连接池的整合

Java 程序员 后端

spring-bean的理解

Java 程序员 后端

Spring5 框架新功能(Webflux)

Java 程序员 后端

11 K8S之节点资源

穿过生命散发芬芳

k8s 11月日更

springboot+mybatis+druid整合笔记

Java 程序员 后端

SpringBoot2---静态资源映射规则

Java 程序员 后端

Springboot 整合RabbitMq ,用心看完这一篇就够了

Java 程序员 后端

一文搞定Python深拷贝和浅拷贝

老表

Python 深拷贝 浅拷贝 11月日更

基于 Agora SDK 实现 macOS 端的多人视频互动_文化 & 方法_声网_InfoQ精选文章