Unity 语音和视频通话快速解决方案——声网 SDK接入指南(Android)

article/2025/10/13 5:10:41

Unity 语音和视频通话快速解决方案——声网 SDK接入指南(Android)

文章目录

  • Unity 语音和视频通话快速解决方案——声网 SDK接入指南(Android)
    • 一、前言
    • 二、后台创建应用
    • 三、获取 SDK
    • 四、接入 Agora Voice 语音 SDK
      • 1. 导入工程
      • 2. 搭建测试场景
      • 3. 申请麦克风权限
      • 4. 初始化 IRtcEngine
      • 5. 常用 API
        • 5.1 加入频道
        • 5.2 静音
        • 5.3 离开频道 & 销毁 IRtcEngine
      • 6. 最终效果
    • 五、接入 Agora Video 视频 SDK
      • 1. 导入工程
      • 2. 搭建测试场景
      • 3. 申请麦克风+相机权限
      • 4. 初始化 IRtcEngine
      • 5. 常用 API
        • 5.1 设置自己画面
        • 5.2 设置其他用户画面
        • 5.3 开关视频
      • 6. 最终效果
    • 六、总结

一、前言

当前游戏为了增加社交互动和代入感,比如狼人杀、团队竞技游戏等,经常会产生需要实时语音和视频通话的需求。但是对于个人开发者和小团队,这种需要前后端配合,重网络的开发需求会带来很大的挑战。

为此我们需要寻找一个成熟、可靠的解决方案。每个月提供 10000 分钟免费使用时长的声网 Agora成为了我的最佳选择。并且声网的 SDK(Software Development Kit) 包体积很小,运行时CPU和内存占用率低,对于移动端的游戏开发很友好。2019年7月声网正式成为了 Unity 官方认证合作伙伴,语音和视频的 SDK 也已经发布在了 Unity 资源商店中,能够非常方便的接入。

注意:语音和视频的包有冲突,不兼容(一些库和平台配置不同,可以自己手动修改),请根据需求,第四步和第五步二选一。引擎支持开关视频和声音,所以可以接入视频 SDK 包,关闭视频,仅仅使用语音通话。

二、后台创建应用

为了方便后续接入操作,这里先注册和登录到 官方后台 创建应用,获取我们之后需要的 App ID。可以根据官网的新手引导来创建应用,也可以参考如下步骤。

输入项目名称,目前暂时使用 APP ID 的鉴权模式,后续根据需要也可以在项目编辑界面切换到 Token 鉴权模式,该模式更加安全,生成 Token 程序需要搭建在服务器上,可以参考官方文档。

创建成功后,我们点击 APP ID 下的显示按钮,APPID 就会复制到粘贴板。

三、获取 SDK

这里我使用的 Unity 版本为 2019.3.14,进入商店我们搜索 Agora,可以发现视频和语音两个 SDK 包。

如果打不开 Unity Store 的同学还可以从官网开发者中心下载。

四、接入 Agora Voice 语音 SDK

1. 导入工程

从 Asset Store 的我的资源(My Asset)中找到我们下载的 Agora Voice SDK For Unity ,点击 Import 导入到工程中。


导入的文件结构如下。

  • Demo:官方提供的测试语音 Demo
  • Edior:iOS 构建后处理脚本
  • Plugins:不同平台所依赖的库
  • Scripts:SDK 源码

2. 搭建测试场景

为了验证 Agora Voice 的效果,我们打开官方的 Demo,或者是自己搭建一个类似的简单场景。主要有三个按钮,分别用来测试加入频道、离开频道和静音。

3. 申请麦克风权限

在 Unity 2018.3 版本以后的新版本中,需要我们主动申请麦克风权限。

#if(UNITY_2018_3_OR_NEWER)
using UnityEngine.Android;
#endif
// ...private void PermissionRequest(){
#if (UNITY_2018_3_OR_NEWER)if (!Permission.HasUserAuthorizedPermission(Permission.Microphone))	// 判断是否有麦克风权限{Permission.RequestUserPermission(Permission.Microphone);	// 申请麦克风权限}
#endif}
// ...

4. 初始化 IRtcEngine

我们在调用 Agora 的接口前,需要先初始化 IRtcEngine。此时我们第二步获取的 APP ID,就在这里派上用处了。在通过 APP ID 创建 IRtcEngine 后,可以根据需求增加回调事件,这里我接入了一些比较常用的回调。

using agora_gaming_rtc;
// ...private IRtcEngine mRtcEngine = null;public const string APP_ID = "你自己的应用 APP ID";private void InitEngine(){// 通过 APP ID 创建mRtcEngine = IRtcEngine.GetEngine(APP_ID);// 加入频道成功后的回调// channelName:频道名称// uid:用户ID(发起请求时候如果没有指定,服务器会自动分配一个)// elapsed:从本地用户调用 JoinChannelByKey 到该回调触发的延迟(毫秒)。mRtcEngine.OnJoinChannelSuccess += (string channelName, uint uid, int elapsed) =>{// ...};// 离开频道的回调// stats:通话统计的数据//		duration:通话时长//		txBytes:发送字节数(bytes)//		rxBytes:接收字节数(bytes)//		txKBitRate:发送码率(kbps)//		rxKBitRate:接收码率(kbps)mRtcEngine.OnLeaveChannel += (RtcStats stats) =>{string leaveChannelMessage = string.Format("onLeaveChannel callback duration {0}, tx: {1}, rx: {2}, tx kbps: {3}, rx kbps: {4}", stats.duration, stats.txBytes, stats.rxBytes, stats.txKBitRate, stats.rxKBitRate);// ...};// 用户加入回调// uid:新加入频道的远端用户/主播 ID// elapsed:从本地用户调用 JoinChannelByKey 到该回调触发的延迟(毫秒)。mRtcEngine.OnUserJoined += (uint uid, int elapsed) =>{// ...};// 用户离开回调// uid:离线用户或主播的用户 ID// reason:离线原因(主动离开、超时、直播模式身份切换)mRtcEngine.OnUserOffline += (uint uid, USER_OFFLINE_REASON reason) =>{string userOfflineMessage = string.Format("onUserOffline callback uid {0} {1}", uid, reason);Debug.Log(userOfflineMessage);};// 提示频道内谁在说话// speakers:说话人信息// speakerNumber:说话人数[0,3]// totalVolume:总音量mRtcEngine.OnVolumeIndication += (AudioVolumeInfo[] speakers, int speakerNumber, int totalVolume) =>{// ...};// 用户静音提示回调// uid:用户 ID// muted:是否静音mRtcEngine.OnUserMutedAudio += (uint uid, bool muted) =>{// ...};// 发生警告回调mRtcEngine.OnWarning += (int warn, string msg) =>{// ...};// 发生错误回调mRtcEngine.OnError += (int error, string msg) =>{// ...};// 当前通话统计回调,每两秒触发一次。mRtcEngine.OnRtcStats += (RtcStats stats) =>{// ...};// 语音路由已发生变化回调。(只在移动平台生效)mRtcEngine.OnAudioRouteChanged += (AUDIO_ROUTE route) =>{// ...};// Token 过期回调mRtcEngine.OnRequestToken += () =>{// ...};// 网络中断回调(建立成功后才会触发)mRtcEngine.OnConnectionInterrupted += () =>{// ...};// 网络连接丢失回调mRtcEngine.OnConnectionLost += () =>{// ...};// 设置 Log 级别mRtcEngine.SetLogFilter(LOG_FILTER.INFO);// 设置为自由说话模式,常用于一对一或者群聊mRtcEngine.SetChannelProfile(CHANNEL_PROFILE.CHANNEL_PROFILE_COMMUNICATION);}
...

5. 常用 API

5.1 加入频道

    public void JoinChannel(){// 从界面的输入框获取频道名称string channelName = mChannelNameInputField.text.Trim();Debug.Log(string.Format("tap joinChannel with channel name {0}", channelName));if (string.IsNullOrEmpty(channelName)){return;}// 加入频道// channelKey: 动态秘钥,我们最开始没有选择 Token 模式,这里就可以传入 null;否则需要传入服务器生成的 Token// channelName: 频道名称// info: 开发者附带信息(非必要),不会传递给频道内其他用户// uid: 用户ID,0 为自动分配mRtcEngine.JoinChannelByKey(channelKey: null, channelName: channelName, info:"extra",uid: 0);}

5.2 静音

    void MuteButtonTapped(){string labeltext = isMuted ? "静音" : "取消静音";Text label = muteButton.GetComponentInChildren<Text>();if (label != null){label.text = labeltext;}isMuted = !isMuted;// 设置静音(停止推送本地音频)mRtcEngine.MuteLocalAudioStream(!isMuted);}

5.3 离开频道 & 销毁 IRtcEngine

    public void LeaveChannel(){// 离开频道mRtcEngine.LeaveChannel();string channelName = mChannelNameInputField.text.Trim();Debug.Log(string.Format("left channel name {0}", channelName));}void OnApplicationQuit(){if (mRtcEngine != null){// 销毁 IRtcEngineIRtcEngine.Destroy();mRtcEngine = null;}}

6. 最终效果

我们可以先在编辑器上验证,能够正常运行后,将平台切换到 Android 后,直接出包就行,Agora SDK 中已经提供了 Android 中所需要的库。

最后运行在 Android 上的效果如下:

  1. 输入1234 成功加入频道,分配给我们用户 id:1186284123
  2. 有其他用户加入,用户id:2996662973
  3. 用户id:2996662973 开启静音
  4. 用户id:2996662973 离开频道
  5. 我们离开频道,显示通话统计数据

在这里插入图片描述

语音通话的 API 时序图如下:

五、接入 Agora Video 视频 SDK

1. 导入工程

如果你按照第五步导入过音频了,这里类似直接从商店导入 Agora Video SDK。要注意的是两个包的内容不同,当然两个 SDK 包的本质还是相同的,只是不同平台中的配置相关有些不同,如果同时使用,会出现问题。有能力的同学也可以尝试修改兼容,这里还是比较推荐直接删除音频 Voice 的包,再导入新的 Video 的包,这样就不用我们费尽的设置不同平台配置了。

2. 搭建测试场景

同样的我们可以直接使用Demo 中提供的场景,SceneHome 是启动场景,在最后测试的时候,注意需要修改 Build Setting 中场景列表。或者可以搭建一个简易如下的场景。

3. 申请麦克风+相机权限

与音频不同,视频需要我们添加相机权限的申请。

    private void PermissionRequest () {
#if (UNITY_2018_3_OR_NEWER)if (!Permission.HasUserAuthorizedPermission (Permission.Microphone)) {Permission.RequestUserPermission (Permission.Microphone);}// 增加相机权限if (!Permission.HasUserAuthorizedPermission (Permission.Camera)) {Permission.RequestUserPermission (Permission.Camera);}
#endif}

4. 初始化 IRtcEngine

与音频唯一不同的是需要打开视频功能。

 private void InitEngine () {mRtcEngine = IRtcEngine.GetEngine (APP_ID);// 启用视频mRtcEngine.EnableVideo ();// 允许相机回调mRtcEngine.EnableVideoObserver ();// 后续与音频相同添加回调...}

5. 常用 API

5.1 设置自己画面

官方已经提供好了一个用于显示的 VideoSurface 类,我们只要把它添加到需要显示的对象上即可,默认显示的即为自己相机拍摄画面。

    private void CreateMyCamera(){GameObject myCamera = GameObject.Find("MyCamera");if (ReferenceEquals(myCamera, null)){Debug.LogError("没有找到 MyCamera 对象!");return;}else{// 添加显示画面类myCamera.AddComponent<VideoSurface>();// 画面需要垂直翻转myCamera.transform.Rotate(0f, 0.0f, 180.0f);}}

5.2 设置其他用户画面

    private void CreateUserCamera(uint uid){VideoSurface videoSurface;GameObject userCamera = GameObject.Find("UserCamera");if (ReferenceEquals(userCamera, null)){Debug.LogError("没有找到 UserCamera 对象!");return;}else{videoSurface = userCamera.AddComponent<VideoSurface>();userCamera.transform.Rotate(0f, 0.0f, 180.0f);}// 设置显示用户videoSurface.SetForUser(uid);videoSurface.SetEnable(true);// 设置平面类型videoSurface.SetVideoSurfaceType(AgoraVideoSurfaceType.RawImage);// 设置画面帧率videoSurface.SetGameFps(30);}

5.3 开关视频

我们可以在应用暂停的时候,停止视频,画面将不会再更新。

    public void EnableVideo(bool pauseVideo){if (mRtcEngine != null){if (!pauseVideo){// 启动视频mRtcEngine.EnableVideo();}else{// 关闭视频mRtcEngine.DisableVideo();}}}

6. 最终效果

最后在 Android 上运行的效果如下:

  1. 我们加入到 123 频道
  2. 给我们分配id 722438456,并显示出我们自己的画面
  3. 显示频道内另一个用户 1173951071 的画面
  4. 离开频道,视频画面停止

在这里插入图片描述

视频通话的 API 时序图如下:

六、总结

总的来说,声网的接入还是较为简单的。我们可以从商店导入对应的包,就能够直接使用,最麻烦的不同平台的配置,官方已经帮忙解决了。而且通话和视频质量不错,再加上有免费使用时长,对于开发者来说是相当友好的。具体细节**官方文档**说的也比较清楚。

几行就搞定了麻烦的语音和视频,光速下班,真香。


http://chatgpt.dhexx.cn/article/OASEG172.shtml

相关文章

技术分享| 小程序实现音视频通话

上一期我们把前期准备工作做完了&#xff0c;这一期就带大家实现音视频通话&#xff01; sdk 二次封装 为了更好的区分功能&#xff0c;我分成了六个 js 文件 config.js 音视频与呼叫邀请配置 store.js 实现音视频通话的变量 rtc.js 音视频逻辑封装 live-code.js 微信推拉…

快速开放,推荐一个视频通话sdk agora

1&#xff0c;agora 推荐一个做实时视频的sdk。 做互联网公司&#xff0c;要快速做出自己的稳定的产品。 视频&#xff0c;语音聊天还是有一定的门槛的。 http://cn.agora.io/ 做互联网的要的就是要快速 2&#xff0c;每个月还有免费的流量 上线后每月10000分钟免费。这个…

基于linphone android sdk 的voip语音、视频通话 教程三、视频通话

如果觉得下面的麻烦可以直接到https://item.taobao.com/item.htm?id587133228080获取源码。源码功能性更好、更完善。 想测试apk请加群261074724 最新的sdk4教程地址 https://blog.csdn.net/Java_lilin/article/details/84842314 前面两篇介绍了注册、拨打、接听等 参考地…

Web项目引入Agora SDK实现视频通话功能

零、前言 简介&#xff1a;声网Agora。一个专注移动端的高清实时通话云服务解决方案。 &#xff08;1&#xff09;声网Agora成立于2013年&#xff0c;是实时音视频云行业开创者和全球领先的专业PaaS服务商。开发者只需简单调用Agora API&#xff0c;30分钟即可在应用内构建多种…

Android之 集成音视频通话

一&#xff0c;背景 1.1 最近接收一个即时通讯二开项目&#xff0c;即时通讯部分用的XMPP协议&#xff0c;音视频则是集成的国外的开源免费库jitsi-meet-sdk-2.4.0-4.aar&#xff0c;是基于WebRTC的开源框架。但客户想要微信那种页面的排版&#xff0c;后来经研究jitsi是不能修…

Unity实战篇 | 接入 声网SDK 实现 视频通话——自己动手做一个 视频通话

目录 🐱‍🏍前言🎂Unity 接入 声网SDK 实现 音视频通话第1️⃣步,创建声网应用第2️⃣步,获取相应的SDK第3️⃣步,将SDK接入Unity中第4️⃣步:搭建一个测试场景,编写测试代码第5️⃣步:视频通话API第6️⃣步:视频通话 效果测试🎂案例下载链接🎨总结🐱‍🏍

Android技术分享| 视频通话开发流程(二)

多人呼叫 多人呼叫与点对点呼叫区别在于多人呼叫是一次呼叫1个以上的人&#xff0c;中途也可以再呼叫邀请别人加入通话。 整个呼叫的流程跟点对点呼叫类似&#xff0c;但也有些区别&#xff0c;需要添加额外的 API 逻辑来实现功能。下面我们分主叫被叫两种角色来分析。 主叫 …

Web音视频通话解决方案 —— Agora Web SDK NG 版接入教程

引言 随着社会的发展&#xff0c;人们对实时音视频的需求越来越多。在线会议&#xff0c;电商直播&#xff0c;在线教育等相关产品不断涌现。但是对于个人开发者或者小团队来说&#xff0c;自己实现一个实时音视频服务并且要保障服务稳定&#xff0c;满足低延时等要求&#xf…

基于声网 SDK 实现 iOS 端的一对一视频通话

在很多产品&#xff0c;加入实时视频通话已经不是新鲜事情了&#xff0c;尤其是近几年的疫情影响&#xff0c;个人公司国家对于实时音视频的需求一直在快速的增长。例如视频会议、社交应用、实时游戏&#xff0c;甚至也可能出现在一些元宇宙的场景中。 本文将教你如何通过声网…

web端视频通话sdk集成和功能实现流程(实时视频系列五)

本文介绍的是在wed端如何集成即构音视频SDK&#xff0c;以实现在wed端一对一&#xff0c;一对多及多人实时视频通话的功能。 一、SDK集成指引 1、安装 请从 jZego-RTC-SDK 下载 SDK。 npm下载包支持typescript语言(推荐)&#xff1a; npm i webrtc-zego 2、集成SDK 可使用s…

《保姆级教程》基于Agora SDK实现音视频通话及屏幕共享

&#x1f604;作者简介&#xff1a; 小曾同学.com,一个致力于测试开发的博主⛽️&#xff0c;主要职责&#xff1a;测试开发、CI/CD 如果文章知识点有错误的地方&#xff0c;还请大家指正&#xff0c;让我们一起学习&#xff0c;一起进步。&#x1f60a; 座右铭&#xff1a;不想…

保姆级教程!基于声网 Web SDK实现音视频通话及屏幕共享

前言 大家好&#xff0c;我是 小曾同学&#xff0c;小伙伴们也可以叫我小曾&#xff5e; 如果你想实现一对一音视频通话和屏幕共享功能&#xff0c;不妨来看看这篇文章&#xff0c;保姆级教程&#xff0c;不需要从零实现&#xff0c;直接集成声网 SDK 即可轻松上手。 本文也…

Android设备实现语音视频通话

一、背景 有智慧社区相关的项目&#xff0c;需要门禁开发门禁机APP以及用户端APP&#xff0c;要求实现门禁设备呼叫业主APP&#xff0c;业主接通后可以通话、可以开门。这里主要要做的就是语音和视频通话功能&#xff0c;以及远程开门。至于业务逻辑那就是正常的需求处理了。 …

基于 Web SDK 实现视频通话场景 | 声网 SDK 教程

声网视频 SDK 被广泛应用于多种实时互动场景中&#xff0c;例如视频会议、视频通话、音视频社交、在线教育等。为了让刚刚接触声网 SDK 的开发者&#xff0c;可以更顺畅地实现基础的视频通话功能&#xff0c;我们基于声网 Web SDK 4.x 版本梳理了本篇教程。 在本文末&#xff0…

如何基于 Agora Android SDK 在应用中实现视频通话?

在很多产品&#xff0c;实时视频通话已经不是新鲜的功能了&#xff0c;例如视频会议、社交应用、在线教育&#xff0c;甚至也可能出现在一些元宇宙的场景中。 本文将教你如何通过声网Agora 视频 SDK 在 Android 端实现一个视频通话应用。声网 SDK 每个月会提供 10000 分钟的免…

Android uni-app实现音视频通话

前言 上一篇讲解了怎么实现Android uni-app封装原生插件&#xff0c;这篇讲解一下&#xff0c;把anyRTC的RTC&#xff08;音视频通讯&#xff09;封装uni-app 实现音视频通话。 不了解anyRTC的小伙伴&#xff0c;可以点击下面链接&#xff1a; 开发者官网 1.效果图 先上图&a…

使用 Agora SDK 开发 React Native 视频通话 App

在 React Native 的应用中&#xff0c;从头开始添加视频通话功能是很复杂的。要保证低延迟、负载平衡&#xff0c;还要注意管理用户事件状态&#xff0c;非常繁琐。除此之外&#xff0c;还必须保证跨平台的兼容性。 当然有个简单的方法可以做到这一点。在本次的教程中&#xf…

MySQL联合索引底层数据结构是怎样的

目录 1. 联合索引数据结构图 2.联合索引是如何进行排序的 3. 联合索引查询特点 1. 联合索引数据结构图 如下图所示联合索引的数据结构, 通过name&#xff0c;age&#xff0c;position三个字典进行一个联合索引&#xff0c;构建B树索引结构。 2.联合索引是如何进行排序的 B树…

MySQL联合索引在B+树如何存储以及寻址

文章目录 引入Innodb B树联合索引存储以及寻址总结 引入 最近找工作&#xff0c; 去一家三方支付公司面试&#xff0c;前面得过程还挺好&#xff0c;所有的提都回答对了&#xff08;心里暗自窃喜应该能拿到高工资offer&#xff0c;迎娶白富美&#xff0c;然后走向人生巅峰&…

MySQL联合索引生效规则

最近项目中一张表数量测试达到千万级别&#xff0c;考虑加索引&#xff0c;对于单列索引及联合索引&#xff08;复合索引&#xff09;简单学习了下&#xff0c;做一下笔记。 联合索引生效前提&#xff1a;因为联合索引有顺序讲究&#xff0c;联合索引的第一个字段是引导列&…