一、入门
1.Voice简介
Photon Voice 2 是一个 SDK,可以轻松地向 Unity 应用程序添加高质量的低延迟语音聊天。它建立在 Photon Realtime 之上,并继承了它的所有功能,包括配对和兴趣小组。客户端加入房间并创建传出流(本地语音),房间中的所有其他客户端都可以接收到该流。兴趣小组可用于将流媒体限制为房间内的小组成员。
Photon Voice 2 可以单独使用,也可以与其他 Photon 或第三方组件结合使用。对于 photon unity networking (pun2) 和 photon fusion,SDK 提供了集成模块。
默认情况下,通过 Unity API 捕获和播放音频。还可以使用支持硬件音频处理的 Photon 原生麦克风模块捕获音频,包括声学回声消除 (AEC)。 Photon Voice 2 API 允许与第三方输入和输出模块进行自定义集成。随 SDK 提供的 FMOD 输入和输出模块就是此类集成的示例。
一个简单的音频处理 API 可用于轻松集成第三方音频处理组件(DSP、口型同步、语音识别等)。这种集成的一个显着示例是增强捕获音频质量的 webrtc 音频软件处理组件,这在硬件音频处理不可用时非常有用。
加入我们的 discord 服务器,在可用时与社区或我们的团队成员之一聊天。
2.支持的平台
- Windows
- UWP
- macOS
- Linux
- Android (for 64-bit support read this)
- iOS
- WebGL (experimental, Unity 2021.2 or higher required, Safari is not supported)
- PlayStation 4 (requires a special add-on that can be downloaded here. Read more about access to consoles here.)
- PlayStation 5 (requires a special add-on that can be downloaded here. Read more about access to consoles here.)
- Nintendo Switch (requires a special add-on that can be downloaded here. Read more about access to consoles here.)
- MagicLeap (Lumin OS, requires a special add-on that can be downloaded here. Read more about Magic Leap here.)
- HoloLens 2 (ARM64 requires a special add-on that can be downloaded here.)
- Xbox One (requires a special add-on that can be downloaded here. Read more about access to consoles here.)
- Xbox Series X and Xbox Series S (requires a special add-on that can be downloaded here. Read more about access to consoles here.)
3.脚本后端兼容性
Photon Voice 与 IL2CPP 配合使用效果最佳。不完全支持单声道。
4.安装说明
所需的最低 Unity 版本是 2019.4 LTS。
Photon Voice 2 可以从此处的 Unity Asset Store 下载和导入。
Photon Voice 2 软件包 包括 PUN2。 PUN2 已经包括依赖于它的 Photon Realtime Unity SDK、Photon Chat 和 Photon Unity 库。如果你愿意,你可以清理 PUN2 或从项目中清理 Photon Chat,但 Photon Voice 需要其他部分才能工作。
为了与其他 Photon 包兼容并保证顺利更新,我们不建议将 Photon 资产移出根 Photon 文件夹(“Assets\Photon”)。
Photon Voice 2 与 PUN Classic 不兼容。 Photon Voice Classic 将与 PUN Classic 一起使用,但两个软件包都将很快消失。
5.Clean Import
为避免在已包含 PUN2 的项目中导入 Photon Voice 2 时因版本不匹配而导致任何冲突错误,建议先清理 Photon 资产:
如果您不使用其他 Photon 包(例如 Photon Bolt),请删除“Assets\Photon”文件夹。
如果您并行导入了另一个 Photon 包,则删除以下文件夹:
- "Assets\Photon\PhotonChat"
- "Assets\Photon\PhotonRealtime"
- "Assets\Photon\PhotonUnityNetworking"
- "Assets\Photon\PhotonLibs"
如果您想在更新 Photon Voice 2 或导入另一个 Photon 包后遇到问题后进行干净导入,也可以按照此步骤操作。
6.Update
我们不建议在 Photon Voice 2 之上导入 PUN2。我们总是尝试在 PUN2 更新后立即发布 Photon Voice 2 版本,以便您可以从 Photon Voice 2 获得最新的 PUN2。
如果您在从 Unity Asset Store 更新 Photon Voice 2 时遇到问题,请尝试进行干净导入。
7.关键组件
(1)Recorder
Recorder是采集音源、压缩音频数据并在房间内播放的组件。
(2)Speaker
Speaker 组件及其变体(SpeakerAudioFilterRead、SpeakerFMOD)播放传入的音频流。默认实现使用 Unity 的 AudioSource 组件。 VoiceConnection 实例负责在需要时实例化 Speaker,并将传入的音频流路由到适当的 Speaker 实例。
(3)Speaker Jitter Buffer
扬声器使用抖动缓冲器来补偿数据包传输时间的变化。使用 Speaker.PlayDelay 属性以毫秒为单位调整抖动缓冲区的大小。默认值为 200 毫秒。值越高,音频录制和播放之间的延迟越大。另一方面,太低的值可能会导致播放中断。
(4)VoiceConnection
场景中需要一个 VoiceConnection 实例才能将语音客户端连接到 Photon 服务器。 SDK目前提供了3种VoiceConnection实现:UnityVoiceClient、punvoiceclient、fusionvoiceclient。
(5)UnityVoiceClient
仅维护语音室连接的 VoiceConnection 实现。
(6)Application Settings
UnityVoiceClient.UseVoiceAppSettings:如果为真,则使用全局 VoiceAppSettings 对象的设置。否则,在“App Settings”折页中设置特定于此 UnityVoiceClient 组件的值。
(7)Streaming
UnityVoiceClient.PrimaryRecorder:如果设置,附加到此对象的录音机将自动初始化并用于流式传输。
UnityVoiceClient.SpeakerPrefab:当检测到新的传入流时,将用于实例化扬声器对象的预制件。必须包含 Speaker 组件。
8.如何使用
- 将 UnityVoiceClient 组件添加到场景中的对象。
- 在全局 VoiceAppSetting 对象中设置 App Id Voice(单击具有该名称的按钮可访问它)或取消选中 Use Voice 的 App Settings 并直接在 UnityVoiceClient 中设置 App Id Voice。
- 将 Recorder 添加到场景,并将其分配给 VoiceConnection.PrimaryRecorder 字段。
- 添加 Speaker 预制件(具有 Speaker 组件的预制件)并将其分配给 VoiceConnection.SpeakerPrefab 字段。
- 添加一个脚本,使用 VoiceConnection 组件上的 Photon Realtime API 将客户端加入房间(例如,参见“ConnectAndJoin.cs”实用程序脚本)。
- 在不同的设备上运行该应用程序的多个实例:现在它们在聊天室中并且可以相互通信。
- 您还可以在房间中仅使用一个客户端测试应用程序:从代码或在编辑器中将 Recorder.DebugEchoMode 字段设置为 true。传出流将被路由回客户端并通过 Speaker 实例播放。
9.如何移除PUN
如果您不需要 Photon Voice 2 包中包含的 PUN2,您可以将其删除。为此有一个编辑器快捷方式:“Window”->“Photon Voice”->“Remove PUN”。
或者,您可以按照以下步骤手动执行此操作:
- 删除“Demos\DemoVoicePUN”文件夹
- 删除“Photon\PhotonVoice\Code\PUN”文件夹
- 删除“Photon\PhotonUnityNetworking”文件夹
- 虽然这应该为您完成,但请确保在"Project Settings" -> "Player" -> "Other Settings" -> "Scripting Define Symbols"中,PHOTON_UNITY_NETWORKING,所有 PUN_2_X_OR_NEWER 和 PUN_2_OR_NEWER 都被删除。
您始终可以随时通过从Asset Store导入 Photon Voice 2 来添加文件。
10.如何移除Photon Chat
如果你想在没有 Photon Chat 的情况下使用 Photon Voice,你可以将 Photon Chat 保留在你的项目中或简单地删除它。为此有一个编辑器快捷方式:“Window”->“Photon Voice”->“Remove Photon Chat”。
或者,您可以通过删除“Photon\PhotonChat”文件夹来手动执行此操作。
您始终可以随时通过从Asset Store导入 Photon Voice 2 来添加文件。
二、Voice - PUN2集成
1.主要用途
每个Player都有一个网络实例化的 PUN 预制件(角色或头像),其中音频是 3D 定位的。音频流在语音室中与场景中的 PUN 预制实例同步创建。附加到网络对象的记录器产生音频流。附加到此网络对象的远程副本的扬声器使用音频流。 Photon View ID 用于为 Recorder 找到正确的 Speaker。
通过这种集成,还可以简单地使语音室跟随 PUN 室的状态,并通过 PunVoiceClient.Instance.PrimaryRecorder 流式传输,而不绑定到任何网络对象。
2.关键组件
(1)PunVoiceClient
保持连接并同步 2 个房间状态的语音连接的实现:Voice和 PUN。
PunVoiceClient 是一个单例:应该只存在一个实例。如果存在多个实例,则只保留一个,其他实例将被销毁。如果您从预制件添加 PunVoiceClient,请确保它被实例化一次。
(2)Application Settings
- PunVoiceClient.Instance.UsePunAppSettings:如果为真,则使用 PUN 的 PhotonNetwork.PhotonServerSettings 中的 AppSettings。否则,在“应用程序设置”折页中设置特定于 PunVoiceClient 单例的值。
- PunVoiceClient.Instance.UsePunAuthValues:如果为 true,语音客户端将使用与 PUN 的 PhotonNetwork.AuthValues 相同的 AuthenticationValues。这要求语音应用程序具有与 PUN 应用程序相同的自定义身份验证仪表板配置。
(3)Following The PUN State
- PunVoiceClient.Instance.AutoConnectAndJoin:如果PUN客户端加入房间,语音客户端也连接并加入相应的语音房间。
- PunVoiceClient.Instance.AutoLeaveAndDisconnect:如果PUN客户端离开房间,Voice客户端自动断开连接。
(4)Streaming
- PunVoiceClient.Instance.PrimaryRecorder:一个带有 Recorder 组件的对象,适用于每个客户端只有 1 个传出流的场景。
- PunVoiceClient.Instance.UsePrimaryRecorder:如果为 true,则附加到 Primary Recorder 对象的 Recorder 将自动初始化并用于流式传输。 Recorder 不会绑定到任何网络对象。如果您使用的是 PhotonVoiceView 预制件,请取消选中它。
- PunVoiceClient.Instance.SpeakerPrefab:当检测到新的传入流并且该流所属的对象在其层次结构中没有 Speaker 时,将用于实例化扬声器对象的预制件。如果您不使用 PhotonVoiceView 预制件或这些预制件没有扬声器组件,请设置它。必须包含 Speaker 组件。
(5)PhotonVoiceView
分配给 PhotoView 预制件并负责设置Recorder和Speaker的组件。在流媒体方面,它启动在预制件层次结构中找到的 Recorder,如果没有找到,则启动 PunVoiceClient.Instance.PrimaryRecorder。在接收方,它启动在预制件层次结构中找到的 Speaker,或者如果没有找到,则从 PunVoiceClient.Instance.SpeakerPrefab 实例化它。
3.建议的工作流程
(1)场景设置
- 在 PUN 的 PhotonServerSettings 的 AppSettings 中设置 Voice AppId。
- 将 PunVoiceClient 添加到场景中。
- 在场景中添加一个带有 Recorder 的对象,并将其分配给 PunVoiceClient.PrimaryRecorder。
- 创建一个带有 Speaker 的预制件并将其分配给 PunVoiceClient.SpeakerPrefab。
(2)预制设置
- 将 PhotonVoiceView 添加到附加了 PhotonView 的 PUN 预制对象。
- 加入房间后实例化此预制件。
三、Recorder 组件
Recorder 是采集音频源,压缩音频数据并在房间内播放的组件。在大多数情况下,您只需要在场景中使用 1 个激活的Recorder,它是通过 VoiceConnection.PrimaryRecorder 或作为 PUN 或 Fusion 网络对象预制件的一部分设置的。
1.Input Audio Source
在编辑器或代码中的 Recorder.SourceType 字段中设置您想要流式传输的源。
2. Microphone Audio Source
系统中可用的麦克风之一用作源。
3.Microphone Types
在编辑器或代码中的 Recorder.MicrophoneType 字段中设置您想要使用的麦克风 API。
Unity:默认情况下,录音机在所有平台上使用 Unity 麦克风 API。此 API 可在多种平台上使用,但无法控制音频捕获硬件功能,尤其是声学回声消除 (AEC)。
Photon:使用Poton Voice 2提供的原生音频采集模块,主要平台有:Windows、UWP/Hololens、macOS、iOS、Android。内置硬件音频处理已启用,包括 AEC。
4.Microphone Type Fallback
如果 Recorder.UseMicrophoneTypeFallback 在使用 Unity 麦克风类型开始录制失败时为真,则 Recorder 会尝试使用 Photon 麦克风类型作为后备,反之亦然。
5.Microphone Selection
如果系统中有多个麦克风,您可能希望通过从代码更新 Recorder.MicrophoneDevice 属性来切换默认麦克风。
对于 Unity 麦克风类型,使用 UnityEngine.Microphone.devices Unity API 属性获取设备列表并将 Recorder.MicrophoneDevice 属性设置为包含在 new Voice.DeviceInfo(device) 中的所选设备的名称。您还可以在 UnityEngine.Microphone.devices 周围使用 Voice.Unity.AudioInEnumerator 包装器。它返回 DeviceInfo 对象的列表。
对于光子麦克风类型,使用 Voice.Platform.CreateAudioInEnumerator() 调用创建一个设备枚举器,对其进行迭代并将 Recorder.MicrophoneDevice 属性设置为所选设备。请注意,枚举可用麦克风列表仅适用于 Windows、UWP 和 macOS。在 Android 和 iOS 上,Photon Microphone Type 使用系统选择的麦克风。
6.Audio Clip Audio Source
为了向加入同一房间的其他玩家播放音频剪辑,您需要将 Unity 支持的音频媒体文件分配给 Recorder.AudioClip。这可以通过从 Unity 编辑器拖放到Inspector来完成。
7.Factory Audio Source
Photon Recorder 允许您为您想到的任何用例拥有自己的自定义音频源。将 Recorder 的“InputFactory”属性设置为返回实现 Photon.Voice.IAudioReader 或 Photon.Voice.IAudioPusher 接口的对象的函数。如果您不分配“InputFactory”,则默认使用返回音调发生器的工厂。
8.Audio Codec Parameters
- Recorder.SamplingRate:流式音频的采样率。可能的值为:8、12、16、24 和 48 kHz。 16 Hz 足以用于语音,但将其设置得更高也无妨。默认值为 24 kHz。
- Recorder.FrameDuration:在一个网络数据包中传输的音频片段的长度(以毫秒为单位)。可能的值为 20、40 和 60 毫秒。较高的值会稍微增加延迟,同时减少传出数据包的数量,从而减少由于数据包开销而导致的带宽。默认值为 20 毫秒。
- Recorder.Bitrate:音频编解码器产生的每秒最大数据量(以比特为单位)。这定义了输出流的带宽并影响接收端的音频质量。默认值为 30000 b/s。
9. Other Stream Settings
- Recorder.Encrypt:如果为真,传出的音频流被加密。默认为假。在此处阅读有关“加密”的更多信息。
- Recorder.ReliableMode:如果为 true,则传出音频流以可靠模式传输。这可能会由于重传而引入显着的延迟,并且可能需要增加扬声器抖动缓冲区。默认为假。
10.Recording And Transmission
为了成功广播音频,必须将以下两个属性设置为 true。
- Recorder.RecordingEnabled 属性定义 Recorder 是否正在录制、处理音频并压缩它。只要该属性为真,用于流式传输的资源就会在发送端和接收端进行分配。
- Recorder.TransmitEnabled 属性定义 Recorder 是否将压缩的音频数据发送到房间。用它来暂时静音流。
其他属性可以自动更新 Recorder.RecordingEnabled:
- 如果 Recorder.RecordWhenJoined 为 true,则 Recorder 在 VoiceConnection 加入房间时开始录音(将 Recorder.RecordingEnabled 设置为 true)并在离开时停止。
- 如果 Recorder.StopRecordingWhenPaused 为真,则 Recorder 在应用程序暂停时暂停录制(在 OnApplicationPause 中处理)。
11.Interest Groups
您可以为您的玩家提供同时进行多个对话而不会相互干扰的可能性。这可以使用“Interest Groups”来完成。兴趣组由数字(字节)标识。您可以订阅和取消订阅多个群组。但是,您一次只能向一个组传输音频。
默认情况下,记录器的兴趣组设置为 0:每个玩家都可以与其他人交谈。要设置目标兴趣组,请设置 Recorder.InterestGroup。
您可以选择多个要收听的群组。默认情况下,所有语音客户端仅订阅组 0。要更新您注册的群组列表,您可以使用 Realtimne API 中的以下方法:
VoiceConnection.Client.OpChangeGroups(byte[] groupsToRemove, byte[] groupsToAdd);
更改音频组时应考虑以下注意事项:
- 它只能在加入语音室时完成。
- 如果您不想添加或删除任何组,请在相应参数中传递一个空值。
- 如果要添加或删除所有现有组,请在相应参数中传递一个空数组 (byte[0])。
- 您无法取消订阅默认音频组 (0)。
12.Debug Echo Mode
当通过 Recorder.DebugEchoMode 属性启用此模式时,允许客户端传输的音频流由同一客户端接收。这对于在只有一个客户端加入房间的情况下快速测试应用程序很有用。
Debug Echo Mode 仅适用于 Interest Group 0。
13.Threshold-based Voice Detection
使用 Recorder.VoiceDetection 属性启用的语音检测会在音频信号电平低于预定义阈值时暂停传输,这通常发生在您停止说话时。这将有助于避免发送无用的噪音,从而减少流量。
阈值由 Recorder.VoiceDetectionThreshold 属性控制,默认值为 0,01。
要自动将阈值调整为实际背景噪声级别,请调用 Recorder.VoiceDetectorCalibrate(period),其中 period 是分析音频信号的时间。
14.Automatic Restart
在记录期间更改记录器的特定属性将导致记录重新启动(这会导致在下一帧停止并重新启动记录器)。以下是更改后会导致重启以使它们生效的公共字段或属性的列表:
Recorder.UserData
Recorder.InputFactory
Recorder.SourceType
Recorder.MicrophoneType
Recorder.MicrophoneDevice
Recorder.AudioClip
Recorder.SamplingRate
Recorder.FrameDuration
Recorder.Bitrate
Recorder.UseOnAudioFilterRead
15.Primary Recorder
由于在大多数情况下,使用单个 Recorder 组件,我们为称为 Primary Recorder 的单个默认 Recorder 提供了一个快捷方式,可以从 Unity Editor 中的 VoiceConnection.PrimaryRecorder 属性或通过代码访问它。如果设置了该属性,unityvoiceclient 始终会启用它:根据 Recorder 设置初始化并开始录音。
相比之下,punvoiceclient 和 fusionvoiceclient 仅在 VoiceConnection.UsePrimaryRecorder 为 true 时直接使用 Primary Recorder,这在您仅使用未绑定到任何网络对象的单个传出流跟随 PUN 或 Fusion 状态时非常有用。
如果 PUN 的 PhotonVoiceView 或 Fusion 的 VoiceNetworkObject 在场景中实例化并且其预制件没有 Recorder,则 Primary Recorder 会自动参与并绑定到网络对象。确保每个客户端只实例化一个这样的网络对象,以避免共享Primary Recorder。
16.More Recorders
如果由于任何原因,您需要使用多个 Recorder,请根据需要实例化它,设置它,然后使用 VoiceConnection.AddRecorder(Recorder) 方法开始使用它。
17.AudioChangesHandler Component
该组件检测音频硬件的变化并自动重新启动与其共享对象的记录器。手动添加或使用 Recorder Inspector 中的 Add Audio Changes Handler 组件按钮添加。
在移动平台上,如果 AudioChangesHandler.HandleDeviceChangeIOS 或 AudioChangesHandler.HandleDeviceChangeAndroid 属性设置为 true,则会处理更改。 AudioChangesHandler.HandleDeviceChange 属性适用于所有其他平台。
18.WebRTCAudioDsp Component
适用于所有主要平台的 WebRTC 音频本机库的包装器。大多数效果建议与 Unity 麦克风类型一起使用,因为使用 Photon 麦克风类型捕获的音频流通常已经由硬件处理过。尽管 WebRTCAudioDsp.VAD(语音自动检测)在输入信号中未检测到语音时暂停传输,但对任何麦克风源都很有用。
只有在创建传出流时 WebRTCAudioDsp.enabled 为真时,该组件才处于活动状态。
WebRTCAudioDsp.Bypass 属性可用于在组件处于活动状态时暂时禁用所有处理。
四、PUN Voice Demo
PUN 语音演示是一款简单的四人移动友好游戏,玩家可以在其中互相交谈。除了配对之外,该游戏还有 4 个不同的可玩角色和 3 个不同的摄像机视图。该演示基于 Unity 的教程“Survival Shooter”,可在 Photon Voice 包中获得。
1.安装
试用 PUN 语音演示:
- 从 Asset Store 下载包。
- 在 Unity 中打开项目并加载 DemoPunScene。
- 在 Unity Inspector 中打开 PhotonServerSettings(菜单:"Window" -> "Photon Unity Networking" -> "Highlight Server Settings"):
- 配置 PUN:从 Photon Realtime dashboard复制粘贴您自己的 Realtime AppId。
- 配置Voice:从 Photon Voice dashboard复制粘贴您自己的语音 AppId。
- 构建、运行并享受!
2.多个角色
与您的朋友一起尝试演示时,您会注意到每个玩家都有自己独特的角色,并且会在随机位置生成。这是使用 CharacterInstantiation 类处理的。在 OnJoinedRoom 回调中,我们根据演员编号和随机生成位置选择预制件。
3.连接和校准
在右下角,您可以找到校准和连接按钮。校准按钮仅在加入语音室时有效,可用于调整响度级别。阅读有关“校准”的更多信息。
另外两个按钮分别“连接”或“断开”PUN 或 Photon Voice。
4.设置
通过使一些设置可以从 UI 轻松访问,我们希望为您提供一个快捷方式来调整您的 Photon Voice 应用程序。
5.游戏内设定
Photon Voice 应用程序最重要的运行时设置被分组在一个 ToggleGroup 中:
- Transmit:禁用时语音传输将被关闭。否则,声音将在本地录制并传输。
- Mute Speaker:此设置如其所说,通过将音量设置为零来使扬声器静音。
- VoiceDetection:此设置启用或禁用语音检测功能。
- DebugEcho:此设置在使用单个客户端测试语音应用程序时很有用。如果打开,发送的音频流将从服务器发送回原始发送者。仅用于调试目的。
6.全局设置
- AutoConnectAndJoin:当 PUN 客户端加入“PUN 房间”时,自动将 Photon Voice 客户端加入“语音室”。
- AutoLeaveAndDisconnect:当 PUN 客户端断开连接时自动断开 Photon Voice 客户端。
- DebugVoice:切换调试模式。调试文本将出现在屏幕的左上角,其中包含:PUN 和语音应用程序客户端状态、使用的麦克风设备和一些语音统计信息。如果打开,它还会在每个“说话”角色之上显示语音扬声器滞后。
7.突出显示语音组件
为了说明两个主要语音组件的工作原理,我们使用了显示在每个Player顶部的等距视图。此视图基于“世界空间”模式下 Unity 的新 UI 系统。它包含 2 个图标:
此图标的目的是显示播放玩家语音的时间。它绑定到 PhotonVoiceView 组件。根据此代码显示或隐藏图像:
speakerSprite.enabled = photonVoiceView.IsSpeaking;
此外,当切换 DebugVoice 全局设置时,文本将开始显示在同一视图中,其中包含不断更新的数字。它应该告知扬声器组件中的滞后。启用或禁用如下:
bufferLagText.enabled = showSpeakerLag && photonVoiceView.IsSpeaking;
if (bufferLagText.enabled)
{
bufferLagText.text = string.Format("{0}", photonVoiceView.SpeakerInUse.Lag);
}
这个图标的目的是显示玩家的声音何时被录制和传输。它绑定到 PhotonVoiceView 组件。根据此代码显示或隐藏图像:
recorderSprite.enabled = photonVoiceView.IsRecording;
您可以查看同名的“Highlighter.cs”文件和类以了解更多信息。
8.不同的相机
由于 Photon Voice 可用于任何类型的游戏,包括 AR 和 VR,因此有一个工作示例会有助于展示 3D 声音体验有多好。为此,我们准备了 3 种相机模式:
“第一个人”:
"Third Person":
"Orthographic" (Default):
加入房间后,您可以随时在它们之间自由无缝地切换。一旦玩家的角色被实例化,屏幕右上角就会出现三个相应的按钮。
9.手机摇杆
该演示包括对移动触摸输入的支持。在智能手机或平板电脑上,您可以使用基于 Unity 标准资产的演示附带的操纵杆 UI。要使用此功能,您需要从 Unity 的菜单中启用“移动输入”,并在 Unity 的构建设置中切换到兼容平台。
10.调试模式
当 DebugVoice 开关打开时,调试模式被启用。在此模式下,屏幕左上角会显示额外信息,其中包括:
- PUN 客户端状态
- 语音客户端状态
- 平均和峰值语音幅度
- 可用的麦克风设备列表或如果没有则发出警告。通常,大多数设备都包含一个麦克风。