游戏中的语音聊天方案

0. PhotoVoice 光子语音PhotonVoice | 光子引擎photonengine中文站

1. Vivox  来自 Vivox 的游戏内语音和文本聊天 SDK | Unity Multiplayer 服务

2. Agora 声网 声网 - 全球实时互动API平台开创者

3. Zego  HarmonyOS Java 实时音视频概述 - 开发者中心 - ZEGO即构科技

Vivox是什么

  1. Vivox是第三方语音和文本通信系统,常用于构建游戏项目的语音、实时聊天系统, 在 PC、移动或游戏主机平台上为玩家提供通信服务。

  1. Vivox被Unity收购,因此做为独立的第三方通信服务商的同时,Vivox成为了Unity产品矩阵中所提供的一项服务,可以为游戏项目提供语音通信服务。

https://unity.com/products

https://unity.com/products/vivox

二、如何接入

使用Unity的Vivox服务来构建游戏项目中的聊天系统:

  1. 配置Unity客户端:Unity商店中购买并安装插件

  1. 购买配置vivox服务端:https://support.unity.com/hc/en-us/articles/6380084154772-Vivox-How-do-I-get-started-with-Vivox-in-my-Unity-Project-

  1. 调用SDK API接入项目。

https://docs.vivox.com/v5/general/unity/15_1_180000/en-us/Default.htm#Unity/Unity.htm

  1. Service Relay

https://docs.unity.com/relay/introduction.html

Unity Relay 中继服务通过充当代理提供通用中继服务器连接,而无需维护第三方或专用游戏服务器 (DGS) 或担心架构点对点网络服务的复杂度。

中继服务有两个关键组件:the Relay servers 中继服务器and the Relay Allocations service中继分配服务。

  1. Service Lobby

https://docs.unity.com/lobby/unity-lobby-service-overview.html

Lobby 聊天大厅服务提供了两个主要功能:公共大厅和私人大厅,以供玩家创建和查找游戏会话。

三、Sample Chat Channel

演示 Vivox SDK 如何集成到 Unity 游戏中。

https://docs.vivox.com/v5/general/unity/15_1_180000/en-us/Default.htm#Unity/chat-channel-sample/chat-channel-sample-overview.htm

四、Sample Chat Lobby

演示大厅聊天频道的游戏集成

https://github.com/Unity-Technologies/com.unity.services.samples.game-lobby

Agora声网

文档:实现语音通话

https://docs.agora.io/cn/live-streaming-premium-legacy/start_call_audio_unity

文档:使用自定义的音视频源或渲染器,实现相关场景:

https://docs.agora.io/cn/voice-legacy/custom_audio_unity?platform=Unity

文档:采集音频原始数据:

https://docs.agora.io/cn/live-streaming-premium-legacy/raw_data_audio_unity?platform=Unity

采集实现方法

音频传输过程中,我们可以获取采集到的音频原始数据。

Agora Unity SDK 通过提供 AudioRawDataManager 类,实现采集原始音频数据功能。

在使用原始音频数据功能前,请确保你已在项目中完成基本的实时音频功能,详见实现音频通话或实现音频直播。

参考如下步骤,在你的项目中实现原始音频数据功能:

  1. 加入频道前调用 RegisterAudioRawDataObserver 方法注册音频观测器。

  1. 成功注册后,根据需求调用以下方法:

    1. 调用 SetOnRecordAudioFrameCallback 监听 OnRecordAudioFrameHandler 回调。SDK 会通过 OnRecordAudioFrameHandler 回调向用户发送采集到的原始音频数据。

    2. 调用 SetOnPlaybackAudioFrameCallback 监听 OnPlaybackAudioFrameHandler 回调。SDK 会通过 OnPlaybackAudioFrameHandler 回调向用户发送播放的原始音频数据,即所有远端用户混音后的音频数据。

    3. 调用 SetOnMixedAudioFrameCallback 监听 OnMixedAudioFrameHandler 回调。SDK 会通过 OnMixedAudioFrameHandler 回调向用户发送混音后的采集和播放的原始音频数据,即所有本地和远端用户混音后的音频数据。

    4. 调用 SetOnPlaybackAudioFrameBeforeMixingCallback 监听 OnPlaybackAudioFrameBeforeMixingHandler 回调。SDK 会通过 OnPlaybackAudioFrameBeforeMixingHandler 回调向用户发送指定远端用户混音前的原始音频数据。

  1. 用户拿到音频数据后,根据场景需要自行进行处理。以通过 Unity AudioSource 组件播放音频原始数据为例,大致流程如下:

    1. 创建一个有限队列。

    2. 在步骤 2 中调用任意回调后,会返回 buffer 数据。在该队列后端插入回调返回的 buffer 数据。

    3. 通过 AudioClip 组件的 setData 方法,从该队列前端按顺序取出 buffer 数据,并存入 AudioClip 组件。

    4. 通过 AudioSource 组件播放 AudioClip 组件中的数据。

  1. 离开频道后调用 UnRegisterAudioRawDataObserver 注销音频观测器。

API 调用时序

下图展示使用原始音频数据的 API 调用时序:

示例代码

你可以对照 API 时序图,参考下面的示例代码片段,在项目中实现原始音频数据功能:

void Start()
{// 初始化 IRtcEngine 对象。mRtcEngine = IRtcEngine.GetEngine(mVendorKey);// 获取 AudioRawDataManager 对象。AudioRawDataManager = AudioRawDataManager.GetInstance(mRtcEngine);// 注册音频观测器。mRtcEngine.RegisterAudioRawDataObserver();// 监听 OnRecordAudioFrameHandler delegate。AudioRawDataManager.SetOnRecordAudioFrameCallback(OnRecordAudioFrameHandler);// 监听 OnPlaybackAudioFrameHandler delegate。AudioRawDataManager.SetOnPlaybackAudioFrameCallback(OnPlaybackAudioFrameHandler);// 监听 OnMixedAudioFrameHandler delegate。AudioRawDataManager.SetOnMixedAudioFrameCallback(OnMixedAudioFrameHandler);// 监听 OnPlaybackAudioFrameBeforeMixingHandler delegate。AudioRawDataManager.SetOnPlaybackAudioFrameBeforeMixingCallback(OnPlaybackAudioFrameBeforeMixingHandler);
}// 获取本地采集到的原始音频数据。
void OnRecordAudioFrameHandler(AudioFrame audioFrame)
{Debug.Log("OnRecordAudioFrameHandler");
}// 获取从远端接收到的原始音频数据。
void OnPlaybackAudioFrameHandler(AudioFrame audioFrame)
{Debug.Log("OnPlaybackAudioFrameHandler");
}// 获取本地和远端混音后的原始音频数据。
void OnMixedAudioFrameHandler(AudioFrame audioFrame)
{Debug.Log("OnMixedAudioFrameHandler");
}// 获取指定本地或远端用户混音前的原始音频数据。
void OnPlaybackAudioFrameBeforeMixingHandler(uint uid, AudioFrame audioFrame)
{Debug.Log("OnPlaybackAudioFrameBeforeMixingHandler");
}public enum AUDIO_FRAME_TYPE 
{// 0: PCM16FRAME_TYPE_PCM16 = 0,
};public struct AudioFrame 
{// 音频帧类型。详见 #AUDIO_FRAME_TYPE 。public AUDIO_FRAME_TYPE type;// 每个声道的采样点数。public int samples; // 每个采样点的字节数。通常为十六位,即两个字节。public int bytesPerSample; // 声道数量(如果是立体声,数据是交叉的)// - 1: 单声道。// - 2: 双声道。public int channels; // 采样率。public int samplesPerSec; // 声音数据缓存区(如果是立体声,数据是交叉存储的)。缓存区数据大小:buffer = samples × channels × bytesPerSample。public byte[] buffer; // 外部音频帧的渲染时间戳。你可以使用该时间戳还原音频帧顺序;在有视频的场景中(包含使用外部视频源的场景),该参数可以用于实现音视频同步。public long renderTimeMs;// 预留参数。public int avsync_type;
};

    public byte[] ConvertClipToBytes(AudioClip audioClip){float[] samples = new float[audioClip.samples];audioClip.GetData(samples, 0);short[] intData = new short[samples.Length];byte[] bytesData = new byte[samples.Length * 2];int rescaleFactor = 32767;for (int i = 0; i < samples.Length; i++){intData[i] = (short)(samples[i] * rescaleFactor);byte[] byteArr = new byte[2];  byteArr = BitConverter.GetBytes(intData[i]);byteArr.CopyTo(bytesData, i * 2);}return bytesData;}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenAI 再发大招: ChatGPT 推出插件功能,能联网获取新知识,可与 5000+ 个应用交互...

公众号关注 「奇妙的 Linux 世界」 设为「星标」&#xff0c;每天带你玩转 Linux &#xff01; ​ OpenAI 宣布已经在 ChatGPT 中实现了对插件的初步支持。插件 (Plugins) 是专门为语言模型设计的工具&#xff0c;以安全为核心原则&#xff0c;可帮助 ChatGPT 访问最新信息、运…

【报告分享】2021年宠物市场行业分析及展望-玺承电商研究院(附下载)

摘要:宠物行业进入快速增长期。随着我国互联网红利逐渐消退&#xff0c;国内供应链逐 步成熟&#xff0c;在渠道、营销方式的多元化等多种因素的驱动下&#xff0c;我国新消费领 域高速发展。宠物市场作为新消费的细分领域之一&#xff0c;在我国国民经济消费 升级的背景下&…

宠物狗行走手机应用市场现状研究分析-

辰宇信息咨询市场调研公司最近发布-《2022-2028中国宠物狗行走手机应用市场现状研究分析与发展前景预测报告 》 内容摘要 本文研究中国市场宠物狗行走手机应用现状及未来发展趋势,侧重分析在中国市场扮演重要角色的企业,重点呈现这些企业在中国市场的宠物狗行走手机应用收…

敏感信息泄露

目录 0x01 漏洞简介0x02 漏洞是怎么发生的0x03 漏洞危害0x04 测试方法操作系统版本中间件的类型、版本Web敏感信息网络信息泄露第三方软件应用敏感信息搜集工具 0x05靶机演示错误信息导致的信息泄露调试数据导致的信息泄露备份文件导致的信息泄露由于配置不当引发的信息泄露 0x…

Tableau 超市经典案例之配送分析(二)

关注微信公共号&#xff1a;小程在线 关注CSDN博客&#xff1a;程志伟的博客 物流配送的准时性对于商品来说具有重要意义&#xff0c; 是能否快速满足用户需求的一个必要条件。 二、配送准时性 操作步骤&#xff1a; 1.将维度下的“订单日期”拖放到列功能区&#xff0c; 调整…

Tableau 超市经典案例之配送分析(一)

关注微信公共号&#xff1a;小程在线 关注CSDN博客&#xff1a;程志伟的博客 配送是指在区域范围内里&#xff0c; 根据客户要求对物品进行拣选、 加工、包装、 分割、 组配等&#xff0c; 并按时送达指定地点的物流活动。 在本案例中&#xff0c; 配送分析主要围绕各省市配送情…

商场超市类APP开发分析

多数的购物超市APP用户家庭拥有1-3位小孩&#xff0c;年龄在22-44岁之间&#xff0c;他们的收入和教育程度也相对较高。高达80%的用户表示他们使用商店APP是为了优惠券&#xff0c;57%的人则为了特殊产品。显然使用超市APP跟省钱有关。但也有相当比例的用户表示他们使用APP纯粹…

连锁水果实体超市销售数据分析实战

1.毛利润营业收入-营业成本 2.营业利润毛利润-( 销售费用、财务费用、管理费用 )/-当期损益&#xff08;资产减值损失、投资收益 等&#xff09; 3.利润总额营业利润营业外收入-营业外支出 4.净利润利润总额-所得税 而我们常说的毛利率&#xff1a; 毛利率毛利/营业收入 …

基于C#的超市收银管理系统

基于C#的超市收银管理系统 ##前序 一直在忙学习Qt有关的知识&#xff0c;很有幸这学期学习了C#。让我也感觉到了一丝欣慰&#xff0c;欣慰的是感觉好上手啊&#xff0c;学了几天顿时懂了&#xff01;好多控件的用法好相似&#xff0c;虽然平时上课没有怎么认真听过课&am…

超市商品信息管理系统/超市管理系统的设计与实现

摘 要 随着现在网络的快速发展&#xff0c;网上管理系统也逐渐快速发展起来&#xff0c;网上管理模式很快融入到了许多国家的之中&#xff0c;随之就产生了“超市商品信息管理系统”&#xff0c;这样就让超市商品信息管理系统更加方便简单。 对于本超市商品信息管理系统的设计…

超市管理系统

目录 写代码之前的分析 相关数据表的创建 对应的配置文件 用户管理场景的实现 相关的数据对象 Mapper对象 Service对象 关于密码加密 Controller对象 关于用户名和密码的校验 前端代码 货物管理场景 数据对象 Service层 Controller JsonController​编辑 前端页…

超市零售数据可视化分析(Plotly 指南)

CSDN 上不能插入 HTML&#xff0c;可以在 GitHub Page 上查看&#xff1a; https://paradiseeee.github.io/2022/07/30/超市零售数据可视化分析/ 项目首次发布于 Kesci 上 – 超市零售数据分析。感兴趣的可以直接上去 Fork 之后自己做。由于上面只能用 Jupyter Notebook&#x…

超市数据分析

1 业务背景 数据集来源于&#xff1a;kaggle数据集&#xff08;链接&#xff09;&#xff0c;该数据集记录了某全球超市四年的销售数据&#xff0c;通过分析该超市四年内的销售数据&#xff0c;从不同角度出发&#xff0c;分析经营现状&#xff0c;发掘提高销量的销售策略&…

倒计时四天!第2期大模型讲习班报名中,顶尖专家面授,多角度系统培训

大模型前沿技术讲习班第一季第二期&#xff08;S01E02&#xff09;将在2023年4月24日至25日线下召开&#xff0c;我们邀请了来自顶尖科研领域的权威专家联合授课。上海交通大学助理研究员陈露&#xff0c;中国人民大学准聘助理教授李崇轩&#xff0c;中国人民大学准聘助理教授林…

开放报名|顶尖专家联合打造,首个系统化AI大模型前沿技术讲习班

大模型正在引发人工智能研究与应用范式产生重大变革&#xff0c;越来越多的顶级团队和杰出人才纷纷加入这一技术浪潮。作为AI大模型科研先锋&#xff0c;智源研究院聚集了来自高校院所和创新企业的一大批大模型领域卓越学者与工程师&#xff0c;共同致力于推动我国大模型的创新…

提升大模型研究应用技能:第2期前沿讲习班报名,顶尖专家面授,多角度系统培训...

人工智能研究与应用范式正经历一场剧变&#xff0c;越来越多的顶级团队和杰出人才纷纷加入这一变革浪潮。作为AI大模型科研先锋&#xff0c;智源研究院携手一批卓越的学者与工程师&#xff0c;致力于将尖端技术与经验传授给有潜力的学习者&#xff0c;通过高效的学习方式&#…

后端使用phantomjs对页面进行截图

最近碰到这样一些需求&#xff0c;后端需要对某个图表页面进行动态截图&#xff0c;将截图通过邮件发送到指定邮箱进行每日提醒。 这就需要用到无界浏览器进行此类操作。常见的无界浏览器有以下几种&#xff0c;知识来源于chatgpt3.5&#xff1a; Headless Chrome - Google C…

chatgpt赋能python:Python画图空白的解决方法

Python画图空白的解决方法 Python作为一种高效、简洁的编程语言&#xff0c;被广泛应用于数据分析、机器学习、图像处理等领域。其中&#xff0c;常用的Python画图库有matplotlib、seaborn、plotly等。但是&#xff0c;有时候我们会遇到一个奇怪的问题&#xff0c;就是在画图时…