【AICon】 如何构建高效的 RAG 系统?RAG 技术在实际应用中遇到的挑战及应对策略?>>> 了解详情
写点什么

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

  • 2020-02-26
  • 本文字数:4957 字

    阅读完需:约 16 分钟

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

本文介绍如何使用 Agora SDK 快速实现互动直播。


互动直播和实时通话的区别就在于,直播频道的用户有角色之分。你可以将角色设置为主播,或者观众,其中主播可以收、发流,观众只能收流。

Demo 体验

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


Objective-C:https://github.com/AgoraIO/Basic-Video-Broadcasting/tree/master/OpenLive-iOS-Objective-C


Swift:https://github.com/AgoraIO/Basic-Video-Broadcasting/tree/master/OpenLive-iOS

前提条件

  • Xcode 9.0 或以上版本

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

  • 有效的 Agora 账户

准备开发环境

我们来创建项目,并将 Agora SDK 集成至你的项目中。

创建 iOS 项目

参考以下步骤创建一个 iOS 项目。若已有 iOS 项目,可以直接查看集成 SDK。


  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. 添加前:


添加后:


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


调用 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. 设置用户角色

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

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

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

  5. 注意,直播频道内的用户,只能看到主播的画面、听到主播的声音。加入频道后,如果你想切换用户角色,也可以调用 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. 设置本地视图

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

  3. 成功初始化 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    }
复制代码

7. 加入频道

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

8. 设置远端视图

视频通话中,通常你也需要看到其他用户。在加入频道后,可通过调用 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-iOS-Objective-C:https://github.com/AgoraIO/Basic-Video-Broadcasting/tree/master/OpenLive-iOS-Objective-C


OpenLive-iOS-Swift:https://github.com/AgoraIO/Basic-Video-Broadcasting/tree/master/OpenLive-iOS

运行项目

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


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


原文链接:https://mp.weixin.qq.com/s/w6-cztKJmkc7AMOzw_krkg


2020-02-26 15:50647

评论

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

数据湖(三):Hudi概念术语

Lansonli

数据湖 8月月更

想做好分布式架构?这个知识点一定要理解透彻

王小凡

Java 程序员 分布式 高并发

如何在Linux中不解压就能查看压缩包中的内容,这13个命令非常强!

wljslmz

Linux 签约计划第三季 8月月更

分享一个Chrome控制台数据获取的例子

睡着了去做梦

Go Chrome开发者工具

Mysql 基本操作指南之mysql查询语句

六月的雨在InfoQ

8月月更

玉溪卷烟厂通过正确选择时序数据库 轻松应对超万亿行数据

TDengine

数据库 tdengine 时序数据库

Python字体反爬之乐居字体反爬,一文看懂,一文学会

梦想橡皮擦

Python 爬虫 8月月更

技术分享| 融合调度系统中的电子围栏功能说明

anyRTC开发者

音视频 快对讲 语音对讲 视频对讲 电子围栏

wx-wow(微信小程序动效库)

Five

微信小程序 动画效果 8月月更

二极管及其应用

厉昱辰

电子技术 8月月更

面试SQL语句,学会这些就够了!!!

程序员猪小哼

sql 实用SQl语句

兆骑科创创业赛事活动路演,高层次人才引进平台

兆骑科创凤阁

Apache APISIX 2.15 版本发布,为插件增加更多灵活性

API7.ai 技术团队

开源 后端 API网关 APISIX 网关

数据湖(二):什么是Hudi

Lansonli

数据湖 8月月更

太厉害了!腾讯T4大牛把《数据结构与算法》讲透了,带源码笔记

冉然学Java

编程 算法 排序 java\ 数据结构与算法、

史上最全!47个“数字化转型”常见术语合集,看完秒懂~

优秀

数字化转型 数字化业务转型

这几年让你大呼惊人的AI应用,都离不开这项技术

小红书技术REDtech

人工智能 自然语言处理 nlp 自然语言 自然语言理解

《数字经济全景白皮书》银行业智能风控科技应用专题分析 发布

易观分析

金融 银行 数字经济全景白皮书

节省50%成本!京东云重磅发布新一代混合CDN产品

京东科技开发者

云计算 CDN DDoS 混合云

Spring Controller

武师叔

8月月更

基于深度学习的图像检索方法!

Geek_e369a5

图像搜索 图像检索

Kubernetes资源编排系列之三: Kustomize篇

阿里云大数据AI技术

运维‘

中科驭数等单位牵头发布行业首部DPU评测方法技术白皮书

硬科技星球

主流跨端技术一览

Speedoooo

前端框架 小程序容器

IIR数字滤波器设计(数字信号处理)

Five

matlab 过滤器 8月月更

C语言结构体(入门)

孤衫

编程语言 C语言 结构体 8月月更

国内IT市场还有发展吗?有哪些创新好用的IT运维工具可以推荐?

行云管家

云计算 多云管理 IT运维 云管理

语音直播系统——做好敏感词汇屏蔽打造绿色社交环境

开源直播系统源码

软件开发 语聊房 直播系统源码 语音直播系统

软件成分分析:手握5大能力守护软件供应链安全

华为云开发者联盟

云计算 安全 华为云

SpringBoot 发送邮件

开源 SpringBoot 2 8月月更

Spring Session

武师叔

8月月更

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