集成声网 SDK实现iOS平台音视频通话和虚拟背景功能

news2025/1/19 20:57:46

😄作者简介:
小曾同学.com,一个致力于测试开发的博主⛽️,主要职责:测试开发、CI/CD
如果文章知识点有错误的地方,还请大家指正,让我们一起学习,一起进步。😊
座右铭:不想当开发的测试,不是一个好测试✌️。
如果感觉博主的文章还不错的话,还请点赞、收藏哦!👍

文章目录

  • 一 前言
  • 二 前期准备
  • 三 实战
    • 3.1 创建项目
    • 3.2 实现音视频通话
    • 3.3 实现虚拟背景功能
  • 四 小结

如果你想实现iOS平台的音视频通话,如果你想在音视频通话中添加虚拟背景,那这篇文章完全可以借鉴。使用swift语言,集成声网SDK实现音视频通话,并调用enableVirtualBackground接口添加虚拟背景,小伙伴们赶快跟着小编实践起来吧。

一 前言

本篇文章主要是集成声网iOS端SDK,实现简易音视频Demo,并在Demo中实现虚拟背景功能。其中也会包含导入虚拟背景图片时遇到的一些问题,以及相关 API 的调用姿势。跟着小编一步一步做,你一定可以实现自己的音视频Demo,如果有任何问题,也可私信小编。

二 前期准备

在实现 iOS 平台音视频 Demo 之前,你需要有以下准备:

  • Xcode
  • 注册声网账号,申请声网APPID、临时Token ,详见开始使用声网平台。

如果你还没有声网账号,可以通过这里免费注册,每个账户每月都有10000分钟免费额度。如果你是用来个人学习的话,这些时长完全够用。注意临时Token,主要用途是在客户端加入频道时对用户鉴权,有效期为24小时。

小编个人开发及测试环境如下:

  • MacBook Pro
  • Xcode:v 14.2
  • 声网SDK:4.1.1,SDK的下载可查看这里
  • Apple 开发者账号。

三 实战

本次实践,将一步步带领大家实现音视频通话并调用enableVirtualBackground接口添加虚拟背景功能。

3.1 创建项目

(1)创建iOS项目

打开Xcode——Create a new Xcode project——选择iOS模块下的APP,之后便会出现如下界面,输入相关内容,需要注意的是,Team是开发者账号,如果没有可以去Apple开发者官网注册一个免费的。

在这里插入图片描述

(2)点击 Next 之后,会出现如下界面,选择 Minimum Deployments 为13.0,表示demo支持iOS 13.0及以上版本,需要注意,虚拟背景功能只支持 iOS 13 及以上版本的系统。

在这里插入图片描述

(3)添加媒体设备权限

点击Info栏目,添加摄像头和麦克风权限,点击“+”号选择分别选择Privacy - Camera Usage Description、Privacy - Microphone Usage Description。如果没有添加权限的话,当你点击 demo 时,会出现崩溃问题。

在这里插入图片描述

(4)打开终端,进入根目录 VideoCall_ios,输入并运行命令 pod init,此时目录中会生成 Podfile 文件,编辑 Podfile 文件,输入 pod ‘AgoraRtcEngine_iOS’,'4.1.1’,表示集成声网sdk。

pod init
open -e Podfile

在这里插入图片描述

(5)安装 SDK

在终端进入根目录,输入命令 pod install 并运行,通过cocoapods自动下载声网 SDK,当看到Pod installation complete!表示安装成功,此时会发现根目录下多了一个{project}.xcworkspace的文件,在该文件里,会同时加载项目文件及刚才安装好的 Pod 依赖库,并使两者建立好关联。通过 Xcode 打开该文件进行后续操作。

在这里插入图片描述

3.2 实现音视频通话

本节主要介绍如何使用 Agora 视频 SDK 实现 iOS 平台音视频通话。以下代码实现均在ViewController.swift文件中输入。

(1)导入声网kit

import AgoraRtcKit
//自3.0.0版本起,AgoraRtcEngineKit 类名更换为 AgoraRtcKit

(2)创建基础用户界面,并初始化界面

在 ViewController类中创建用户界面,并初始化

class ViewController: UIViewController{ 
    // 定义本地视图变量
    var localView: UIView!
    // 定义远端视频变量
    var remoteView: UIView!
    // 定义 agoraKit
    var agoraKit: AgoraRtcEngineKit!

  // 设置视频窗口布局
    override func viewDidLayoutSubviews(){
        super.viewDidLayoutSubviews()
        remoteView.frame = self.view.bounds
        localView.frame = CGRect(x: self.view.bounds.width - 180, y:0, width: 180, height: 230)  
    }

    func initView(){
        // 初始化远端视频窗口。
        remoteView = UIView()
        self.view.addSubview(remoteView)
        // 初始化本地视频窗口。
        localView = UIView()
        self.view.addSubview(localView)
    }

(3)初始化 AgoraRtcEngineKit

在 ViewController类中,实例化 AgoraRtcEngineKit 对象。

//初始化引擎
func initializeAgoraEngine(){
     let config = AgoraRtcEngineConfig()
     // 在这里输入你的 App ID.
     config.appId = "24bbaca4116c4b11b81cdf4cffdf41"
     // 调用 AgoraRtcEngineDelegate
     agoraKit = AgoraRtcEngineKit.sharedEngine(with: config, delegate: self)
    
 }

(4)加入频道

加入频道是实现音视频通话的必要步骤,需要调用 agoraKit.joinChannel(byToken:channelId:info:uid:joinSuccess:) 方法,

注意:YOUR_TOKEN 是您在声网官网生成的 Token,YOUR_CHANNEL_ID 是您自己定义的频道 ID,频道可理解为专用于传输实时音视频数据的通道。uid 是您在频道中的用户 ID,0 表示使用自动生成的用户 ID。

func joinChannel(){
    let option = AgoraRtcChannelMediaOptions()
    // 在视频通话场景下,将频道场景设置为 liveBroadcasting
    option.channelProfile = .liveBroadcasting 
    // 设置用户角色为主播
    option.clientRoleType = .broadcaster 
    // 使用临时 token 加入频道,在这里传入你的项目的 token 和频道名。
    agoraKit?.joinChannel(byToken: "007eJxTYezdV5FYj92Eh4WVzc+Yfl9sd4XNOyPb1it1+3nGPwt4rMBiZJCUlJieaGBqaJZskGRomWRgmp6SZJKelAUlDI/PFnAIpDYGMDDtmv2BkZIBAEJ+FoSo1L52BAQBbtCAO", channelId: "zeng", uid: 0, mediaOptions: option)
}

(5)启用本地视频采集和预览

调用 agoraKit.enableVideo() 开启视频采集功能,调用 agoraKit.enableAudio() 开启音频采集功能,调用 agoraKit.startPreview() 开始本地预览。

func setupLocalVideo(){
    // 启用视频模块
    agoraKit?.enableVideo()
		agoraKit?.enableAudio()
    // 开始本地预览
    agoraKit?.startPreview()
    let videoCanvas = AgoraRtcVideoCanvas()
    videoCanvas.uid = 0
    videoCanvas.renderMode = .hidden
    videoCanvas.view = localView
    // 设置本地视图
    agoraKit?.setupLocalVideo(videoCanvas)
    }

(6)离开频道

func leaveChannel() {
    // Step 1, release local AgoraRtcVideoCanvas instance
    agoraKit.setupLocalVideo(nil)
    // Step 2, leave channel and end group chat
    agoraKit.leaveChannel(nil)
    AgoraRtcEngineKit.destroy()
 }

(7) 设置远端用户视频

使用extension关键字实现类的扩展。

extension ViewController: AgoraRtcEngineDelegate{
    // 监听 didJoinedOfUid 回调
        // 远端主播加入频道时,会触发该回调
    func rtcEngine(_ engine: AgoraRtcEngineKit, didJoinedOfUid uid: UInt, elapsed: Int){
        let videoCanvas = AgoraRtcVideoCanvas()
        videoCanvas.uid = uid
        //渲染模式 采用hidden
        videoCanvas.renderMode = .hidden
        videoCanvas.view = remoteView
        // 设置远端视图
        agoraKit?.setupRemoteVideo(videoCanvas)
   }
}

(8)加载视图,渲染画面

在 ViewController类中实现 viewDidLoad 函数

override func viewDidLoad() {
        super.viewDidLoad()
        // 当加载视图后,你可以进行其他其他设置。
        // 初始化视频窗口函数
        initView()
        // 当调用声网 API 时,以下函数会被调用
        initializeAgoraEngine()
        setupLocalVideo()
        joinChannel()
    }

(9)运行demo

点击运行按钮,选择合适的测试机,运行demo,我使用的是真机iPhone13 进行调试。

在这里插入图片描述

当启动demo时,需要先信任APP,在设置——通用——VPN与设备管理——信任APP即可。

3.3 实现虚拟背景功能

声网视频SDK提供了enableVirtualBackground 接口,虚拟背景功能支持你使用自定义的背景图替代本地用户原来的背景图或者将背景虚化处理。成功开启虚拟背景功能后,频道内所有用户都能看到自定义的背景。

需要注意的是,在 enableVideo 或 startPreview之后调用enableVirtualBackground 方法。而且这个方法依赖于虚拟背景动态库 AgoraVideoSegmentationExtension.xcframework,如果删除该动态库会导致无法正常开启该功能。可在Pods目录下查看动态库。

在这里插入图片描述

enableVirtualBackground 方法中需要传入三个参数

  • enable:表示是否开启虚拟背景,值为true或者false
  • backData:表示自定义的背景图,
  • segData:表示背景图像的处理属性

具体实现如下:

(1)上传背景图片

右击项目——Add Files to “VideoCall_ios” ——选择一张图片添加至项目中,注意,自定义背景图支持PNG和JPG格式。

在这里插入图片描述

添加完图片之后,右击图片——show File Inspector——在界面右侧,更改图片Type为Data。如果选择默认值的话,则自定义背景不会生效。

在这里插入图片描述

(2)逻辑代码实现

在 setupLocalVideo 函数,agoraKit?.startPreview()方法之后,添加虚拟背景,其中使用Bundle.main.path() 方法来打开文本文件。

let source = AgoraVirtualBackgroundSource()
source.backgroundSourceType = .img
source.source = Bundle.main.path(forResource: "test", ofType: "png")
agoraKit.enableVirtualBackground(true, backData: source, segData: nil)

其中,agoraKit.enableVirtualBackground()存在返回值,0表示调用成功,当小于0时,表示调用失败。具体返回值信息可查看 enableVirtualBackground 。

(3)Demo展示

运行demo后,视频背景已经换成了我们自定义图片

在这里插入图片描述

四 小结

本篇文章主要分享使用swift语言,集成声网SDK实现音视频通话,并调用enableVirtualBackground接口添加虚拟背景。从项目搭建到接口调用以及Demo运行,均已详细讲解,并对其遇到的问题,也做了详细说明。如果有不懂的地方可参考声网官网快速开始。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/625511.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

coco-annotator的安装与使用

文章目录 coco-annotator的安装与使用1. coco-annotator是什么2. coco-annotator可以做什么3. coco-annotator的安装3.1 先决条件3.2 coco-annotator的下载与安装 4. coco-annotator的使用4.1 创建用户4.2 创建数据集4.3 标注图像4.4 下载标注信息 5. coco-annotator远程访问5.…

【算法题解】36. 对称二叉树的递归解法

这是一道 简单 题 https://leetcode.cn/problems/symmetric-tree/ 题目 给你一个二叉树的根节点 root , 检查它是否轴对称。 示例 1: 输入:root [1,2,2,3,4,4,3] 输出:true示例 2: 输入:root [1,2,2,null,3,nu…

UnityVR--组件6--动画事件BlendTree

目录 应用1:使用BlendTree实现站立和移动 应用2:人物跳跃事件&播放跳跃动画 上一篇(组件5--Animation动画)已经做了2个动画片段,HeroIdle和HeroJump,另外实现了简单的动画转场控制。本篇使用BlendTre…

分布式项目13 zookeeper的安装,集群搭建

nginx的功能包括反向代理,负载平衡。zookeeper用来作为负载平衡的框架,可以减少Nginx的工作。 Zookeeper只用Linux版本.安装步骤 2.1先把压缩包拖入usr/local/src中去 2.2解压相关的压缩包 2.3删除压缩包 2.4重命名解压后的文件 2.5进入zookeeper目…

深入理解java虚拟机-4高效并发

文章目录 Java内存模型与线程概述硬件的效率与一致性Java内存模型主内存与工作内存内存间交互操作对于volatile型变量的特殊规则针对long和double型变量的特殊规则原子性、可见性与有序性1.原子性(Atomicity)2.可见性(Visibility)…

2023年5月青少年软件编程(图形化) 等级考试试卷(四级)

青少年软件编程(图形化) 等级考试试卷(四级)2023.6 分数: 100 题数: 24 一、 单选题(共 10 题, 共 30 分) 1.下列积木运行后的结果是?()(说明&…

业务安全测试实践模版理论指导

系统的介绍业务安全测试理论方法案例 1 业务安全试概述 业务安全测试通常是指针对业务运行的软、硬件平台(操作系统、数据库、中间件等),业务系统自身(软件或设备) 和业务所提供的服务进行安全测试,保护业务系统免受安全威胁,以验证业务系统符合安全需求定义和安全标准的过…

ChatGPT写高考作文

又是一年一度高考时,又是一批学子奋笔考场,逐梦未来。 我们不用在考场里奋笔疾书,就在考场外欣赏一下AI写作水平吧。 作文 首先使用GPT-3写一下全囯甲卷作文 再看看GPT-4的作文水平 点评 从对比GPT-3和GPT-4的这两篇文章,我们…

云原生时代Go最受欢迎Web开源框架Gin原理与实战

文章目录 概述定义特点概览导图 使用快速入门HTTP 方法使用参数获取参数绑定自定义日志输出自定义中间件路由组HTML渲染设置和获取CookieXML、YAML、ProtoBuf渲染使用BasicAuth中间件静态文件和BootStrap使用Session写入日志文件 原理核心执行流程核心数据结构 概述 定义 Gin …

【ABAQUS文档笔记】缩减积分-剪切闭锁-沙漏问题-非协调模式-混杂单元

接上一篇博客 来自ABAQUS DOCUMENT/GETTING STARTED WITH ABAQUS/CAE /USING CONTINUUM ELEMENTS 整理了典型实体单元类型的优缺点,和问题 1. 单元公式和积分 1.1 full integration —— shear lock “完全积分”是指当单元具有规则形状时,对单元刚度…

【Vue】学习笔记-基本路由 多级路由

相关理解 vue-router 的理解 vue的一个插件库,专门用来实现SPA应用 对SPA应用的理解 单页web应用(single page web application ,SPA)整个应用只有一个完整的页面点击页面中的导航链接不会刷新页面,只会做页面的局部更新数据需要通过ajax请求获取 …

头歌人工智能学习记录

因为这个实训的顺序不同,所以这里的顺序是个人学习的顺序,可能有些变动 第1关:Sigmoid函数 相关知识 为了完成本关任务,你需要掌握: 激活函数概述; 线性函数; Sigmoid 函数。 激活函数概述 …

HTTPS协议原理

目录 HTTPS是什么 1. 什么是"加密" 2. 为什么要加密 3. 常⻅的加密⽅式 对称加密 ⾮对称加密 4. 数据摘要&&数据指纹 5. 数字签名 HTTPS的⼯作过程 ⽅案1- 只使⽤对称加密 ⽅案2 - 只使⽤⾮对称加密 ⽅案3 - 双⽅都使⽤⾮对称加密 ⽅案4 - ⾮对…

2023年学自动化测试?Python 还是 Java?“我“上车了...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 自动化测试&#…

2023年牛客网最新的Java面试经历整理(一次性查缺补漏个够)

学的人越多,越容易供大于求,越容易卷,要求越高! 当前 Java 程序员的群体比较庞大,Java 本身语言是全场景编程语言,所以不少大厂都要求 Java 程序员具有全栈开发能力和多场景开发能力,还有就是 …

Sui主网上线后的生态发展

Sui主网上线一个月有余,这段时间,Sui网络进行多次迭代更新,生态正在不断稳步发展,社区也日益焕发出生机和活力。为吸引更多的项目或开发者前来构建,Sui基金会推出了多项资助计划以及黑客松,进一步助力生态持…

【高级篇】多级缓存

文章目录 多级缓存1.什么是多级缓存2.JVM进程缓存2.1.导入案例案例导入说明1.安装MySQL1.1.准备目录1.2.运行命令1.3.修改配置1.4.重启 2.导入SQL3.导入Demo工程3.1.分页查询商品3.2.新增商品3.3.修改商品3.4.修改库存3.5.删除商品3.6.根据id查询商品3.7.根据id查询库存3.8.启动…

动态规划-背包问题(二)

动态规划-背包问题(二) 1 描述2 样例2.1 样例 1:2.2 样例 2:2.3 挑战 3 算法解题思路以及实现方法3.1 算法解题思路3.1.1 确定状态3.1.2 转移方程3.1.3 初始条件和边界情况3.1.4 计算顺序 3.2 空间复杂度为O(MN)的算法实现3.2.1 j…

卡尔曼滤波与组合导航原理(十一)区间平滑:前向滤波、反向滤波、双向区间平滑、RTS平滑

最优预测、估计与平滑之间的关系: 三种平滑方式: 函数模型和随机模型 { X k Φ k / k − 1 X k − 1 Γ k − 1 W k − 1 Z k H k X k V k { E [ W k ] 0 , E [ W k W j T ] Q k δ k j E [ V k ] 0 , E [ V k V j T ] R k δ k j E [ W k V j …

Kubernetes DashBoard

Kubernetes DashBoard 为了便于用户操作,k8s开发了基于Web的用户界面。方便用户容器化应用,还可以监控应用状态,执行故障排除和管理资源。 📊部署DashBoard 下载yaml,运行DashBoard #下载yaml [rootmaster ~]# wget …