游戏中的语音聊天方案
0. PhotoVoice 光子语音PhotonVoice | 光子引擎photonengine中文站
1. Vivox 来自 Vivox 的游戏内语音和文本聊天 SDK | Unity Multiplayer 服务
2. Agora 声网 声网 - 全球实时互动API平台开创者
3. Zego HarmonyOS Java 实时音视频概述 - 开发者中心 - ZEGO即构科技
Vivox是什么
Vivox是第三方语音和文本通信系统,常用于构建游戏项目的语音、实时聊天系统, 在 PC、移动或游戏主机平台上为玩家提供通信服务。
Vivox被Unity收购,因此做为独立的第三方通信服务商的同时,Vivox成为了Unity产品矩阵中所提供的一项服务,可以为游戏项目提供语音通信服务。
https://unity.com/products
https://unity.com/products/vivox
二、如何接入
使用Unity的Vivox服务来构建游戏项目中的聊天系统:
配置Unity客户端:Unity商店中购买并安装插件
购买配置vivox服务端:https://support.unity.com/hc/en-us/articles/6380084154772-Vivox-How-do-I-get-started-with-Vivox-in-my-Unity-Project-
调用SDK API接入项目。
https://docs.vivox.com/v5/general/unity/15_1_180000/en-us/Default.htm#Unity/Unity.htm
Service Relay
https://docs.unity.com/relay/introduction.html
Unity Relay 中继服务通过充当代理提供通用中继服务器连接,而无需维护第三方或专用游戏服务器 (DGS) 或担心架构点对点网络服务的复杂度。
中继服务有两个关键组件:the Relay servers 中继服务器and the Relay Allocations service中继分配服务。
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
类,实现采集原始音频数据功能。
在使用原始音频数据功能前,请确保你已在项目中完成基本的实时音频功能,详见实现音频通话或实现音频直播。
参考如下步骤,在你的项目中实现原始音频数据功能:
加入频道前调用
RegisterAudioRawDataObserver
方法注册音频观测器。
成功注册后,根据需求调用以下方法:
调用
SetOnRecordAudioFrameCallback
监听OnRecordAudioFrameHandler
回调。SDK 会通过OnRecordAudioFrameHandler
回调向用户发送采集到的原始音频数据。调用
SetOnPlaybackAudioFrameCallback
监听OnPlaybackAudioFrameHandler
回调。SDK 会通过OnPlaybackAudioFrameHandler
回调向用户发送播放的原始音频数据,即所有远端用户混音后的音频数据。调用
SetOnMixedAudioFrameCallback
监听OnMixedAudioFrameHandler
回调。SDK 会通过OnMixedAudioFrameHandler
回调向用户发送混音后的采集和播放的原始音频数据,即所有本地和远端用户混音后的音频数据。调用
SetOnPlaybackAudioFrameBeforeMixingCallback
监听OnPlaybackAudioFrameBeforeMixingHandler
回调。SDK 会通过OnPlaybackAudioFrameBeforeMixingHandler
回调向用户发送指定远端用户混音前的原始音频数据。
用户拿到音频数据后,根据场景需要自行进行处理。以通过 Unity
AudioSource
组件播放音频原始数据为例,大致流程如下:创建一个有限队列。
在步骤 2 中调用任意回调后,会返回
buffer
数据。在该队列后端插入回调返回的buffer
数据。通过
AudioClip
组件的setData
方法,从该队列前端按顺序取出buffer
数据,并存入AudioClip
组件。通过
AudioSource
组件播放AudioClip
组件中的数据。
离开频道后调用
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;}
游戏中的语音聊天方案相关推荐
- 在游戏中实现语音聊天和语音转化成文字
今天碰到一个任务就是在游戏中添加语音聊天功能,并且需要将语音转化成文本信息,在聊天界面显示. 当然这种功能专业性太强,我们就只能选择使用第三方SDK来实现了. 国内做的语音识别比较好的就是科大讯飞,不 ...
- 如何在游戏中快速集成聊天功能
总览 本文以「人类跌落梦境」游戏为例,讲解如何在游戏场景下使用 LeanCloud IM SDK. LeanCloud 提供的即时通信 SDK 可以应用在多种场景,比如在线客服,直播间弹幕,工作群聊软 ...
- 在微信小游戏中实现语音互动
之前在unity里尝试用过语音控制,当时的想法是实时控制游戏角色的移动与攻击,这在通过在线api解析语义的方式下体验一般,不过也想到在实时性要求不那么高的互动场景应该可以用起来.这里就在微信小游戏中尝 ...
- ios开发 多人语音聊天_在 Unity 多人游戏中实现语音对话
我们曾经不止一次为大家分享过游戏中的实时音视频,例如怎么实现游戏中的听声辨位.狼人杀游戏中的语音聊天挑战等.基本上,都是从技术原理和 Agora SDK 出发来分享的.这次我们换一个角度.我们将从 U ...
- 在 Unity 多人游戏中实现语音对话
我们曾经不止一次为大家分享过游戏中的实时音视频,例如怎么实现游戏中的听声辨位.狼人杀游戏中的语音聊天挑战等.基本上,都是从技术原理和 Agora SDK 出发来分享的.这次我们换一个角度.我们将从 U ...
- unity android 在后台运行_Agora 教程 | 在 Unity 多人游戏中实现语音对话
作者:Hermes Frangroudis,声网 Agora 布道师. 我们曾经不止一次为大家分享过游戏中的实时音视频,例如怎么实现游戏中的听声辨位.狼人杀游戏中的语音聊天等.基本上,都是从技术原理和 ...
- 关于微信聊天中的语音开发
之前有做过微信开发中的语音聊天的功能,今天觉得写出来. 首先签名这个就不需要多说, wx.config({ debug: '', appId: '', // 必填,公众号的唯一标识 ...
- 如何做好游戏内实时语音体验
游戏内语音沟通需求 早在2015年,艾媒咨询即有移动游戏社交相关数据统计:近40%的玩家因为社交因素选择一款游戏:15.6%的玩家因为一款游戏社交性差而选择离开.因此,如何提高游戏的社交属性已成为各大 ...
- 如何做好游戏内实时语音体验 1
欢迎大家前往云+社区,获取更多腾讯海量技术实践干货哦~. 作者:张晓愚,腾讯云游戏行业资深架构师 由腾讯游戏云发表在云+社区 游戏内语音沟通需求 早在2015年,艾媒咨询即有移动游戏社交相关数据统计: ...
最新文章
- 搞定研发知识管理,你的企业就能跑快一步
- 正文分页(中英文截字)问题
- 掌握计算机底层原理,可以让工作事半功倍吗?
- Linux笔记常规部分总结(待续)
- Dynamic Rankings(整体二分)
- 2021全网影视APP搭建教程全套完整版
- 利用集成支持向量机模型评估信贷风险
- what is a rx ring/tx ring in router?
- xlsx表格用计算机公式算,excel表格数据求和与计算器不一致-excel表格用公式计算出来的数值跟计算器计算出来的......
- 15--jQuery插件大全-- 使用jsoup爬取酷我音乐和微博热搜数据
- 不会“思维”只会“批判”,谨防网络舆论“怨妇化”
- C语言【微项目01】—电话号码管理系统(文件操作实现)【2021-06-29】
- “我才是腾讯的第一任董事长”
- 画中画功能,制作多种效果,看你喜欢哪种
- [附源码]java毕业设计石林县石漠化信息查询分析系统
- (十一)在线编辑模块(FreeTextBox插入图片,内容保存到数据库)
- 我喜欢的一首诗_再别康桥
- PS打开PSD文档服务器未响应,优化你的 PSD 文件防止 Photoshop 崩溃卡死 - 文章教程...
- css 科技 边框_CSS内嵌边框
- CAD建筑软件教程之倒墙角
热门文章
- Electric Fences_usaco3.4_皮克定理
- css readonly和disabled的区别
- IP地址更改小工具(bat命令)
- 滤波电容为什么要靠近放置,去耦半径是什么?滤波电容如何打孔?(转)
- c语言练习:输入一个字符,如果是数字字符就输出,如果不是则输出“不是数字字符”。
- 如何看待996现象,996工作模式是种什么样的体验?
- Win10 下使用Telnet命令,打开telnet功能
- 【Linux】文件与路径
- 创新数据库技术 成就IOD愿景携DB2 25载创新 IBM推新“信息议程”
- 一分钟教你如何使用edge浏览器玩4399小游戏