【技术博客】Unity多人语音聊天技术调研 | week8
Unity 多人语音聊天技术调研
Unity 端
使用 UniVoice
库通过 WebSocket 实现。重要文件如下:
GroupVoiceCallSample.cs
在 InitializeAgent()
函数中,首先调用 agent = new InbuiltChatroomAgentFactory("ws://167.71.17.13:11000").Create();
这个工厂函数创建 agent
,工厂函数接收 WebSocket 服务器地址作为参数。
接下来定义各种事件侦听器的函数。
之后是 Update()
函数,该函数会在刷新每帧时调用,用于显示音频频谱。
InbuiltAudioOutput.cs
Update()
函数将到来的音频段存储于缓冲区,Feed()
函数将其播放于音频源上。已播放的缓冲区也会被清除。还包含音频缓冲区的类。AudioClip
是 Unity 自带的类。传输的音频是采样得到的原始数据,无需编解码。
ChatroomAgent.cs
该类代表聊天室中的实体。
ChatroomAudioDTO.cs
该结构体即为通过网络传送的音频,除属性外,核心是个 float[]
数组。
AirPeerUniVoiceNetwork.cs
该类为客户端,负责通过网络接收/发送音频数据包。有若干事件侦听器负责响应相应事件。
服务端
服务端使用 WebSocket,理论上任意支持 WebSocket 的服务端均可实现。目前 airsignal
项目是使用 node.js 实现的。相关文件如下:
INetwork.js
工具文件,包含各种数据类型转换等。
server.js
类似于 main()
函数,主程序的入口。
WebSocketNetworkServer.js
基本就是写了一些事件侦听器,没有处理数据,按原样转发给其它客户端。