Recorder是传输音频流的组件。使用此组件,您可以选择要流式传输的内容(输入音频源)、如何流式传输(音频质量)、何时开始和停止传输(传输切换)以及发送给谁(接收器目标)。此外,Recorder需要初始化。
Input Audio Source 输入音频源
Recorder支持各种类型的音频输入流。最明显的一个是用于语音聊天的麦克风。但是,Recorder支持两种类型的输入源。
Microphone 麦克风
要将麦克风用作Recorder传输的语音流的输入源类型,只需设置Recorder.SourceType到Recorder.InputSourceType.Microphone。
Microphone Selection 麦克风的选择
在麦克风API中,Photon提供了两个选项可供选择。每个Recorder都可以通过设置Recorder.MicrophoneType来拥有自己类型的麦克风输入设备,这两个不同的值是:
Unity:
默认情况下,我们在所有平台上都使用Unity的麦克风API。Unity使用Microphone.devices字符串数组。麦克风设备可以使用字符串名称或数组中的索引来进行标识。默认情况下,将使用该数组的第一个元素。如果要显式设置另一个设备,请使用Recorder.UnityMicrophoneDevice。
要使用Unity的麦克风API,只需设置Recorder.MicrophoneType为Recorder.MicType.Unity。
Photon:
Unity非常适合使用几乎相同的代码库进行跨平台。然而,在某些方面,Unity的麦克风API是有限的,或者在这里或那里出现了一些问题。这就是为什么我们引入了我们自己的方式直接与音频输入设备交互,并绕过Unity的麦克风API。其中一个主要原因是利用设备的硬件内置回声消除。我们已经为四个主要平台实现了本地插件:Android、iOS、Windows和macOS。
但是,枚举可用麦克风列表仅适用于macOS和Windows。在Android和iOS上,我们使用系统默认的音频输入设备。您可以使用Recorder.PhotonMicrophoneEnumerator查看可用的“Photon microphones”列表,具体如下:
var enumerator = Recorder.PhotonMicrophoneEnumerator;
if (enumerator.IsSupported)
{
for (int i = 0; i < enumerator.Count; i++)
{
Debug.LogFormat("PhotonMicrophone Index={0} ID={1} Name={2}", i, enumerator.IDAtIndex(i),
enumerator.NameAtIndex(i));
}
}
您可以使用Recorder.PhotonMicrophoneDeviceId设置麦克风,要使用Photon的麦克风API,只需设置Recorder.MicrophoneType为Recorder.MicType.Photon。
Unity Editor Consideration | Unity编辑器考虑
虽然在Unity编辑器和输出构建之间选择麦克风API(Unity或Photon),但实际设备的选择却不存在。Unity编辑器中可用的麦克风设备列表可能与要运行构建的计算机上的列表不同。构建可以运行在不同的平台上,具有不同的系统和不同的音频输入设备。这就是为什么,如果需要,您可以在运行时从构建客户端显式地通过代码从默认麦克风切换到另一个麦克风(如果可用)。
Microphone Access: Recording And Muting 麦克风访问:录音和静音
默认情况下,记录器组件将在初始化后自动开始录制。您可以通过设置Recorder.AutoStart 为 false。
如果您想将麦克风“本地”静音(“self-muting”)的选项,您可以使用其中一种Recorder.TransmitEnabled 或 Recorder.IsRecording 进行设置。
录音器被初始化后 Recorder.IsRecording 可以在运行时进行设置(播放模式)。
因此,如果你想停止录音并“释放”麦克风,你可以设置Recorder.IsRecording为false。也将其重置为true以继续录音。
按照设计,当录音被禁用时,音频流将完全消失。
Streaming Audio Clips 流式音频片段
此选项用于测试Photon Voice传输。但是,您可以将其用于其他目的。为了向加入同一房间的其他玩家广播音频片段,您需要将Unity支持的音频媒体文件分配给Recorder.AudioClip。 以上可以通过从Unity编辑器拖放到检查器来完成。如果您希望每次重放音频片段,请确保Recorder.LoopAudioClip设置为true或在Unity编辑器中的Recorder的检查器上勾选“Loop”。
Custom Factory 定制工厂
Photon Recorder允许你有自定义的音频源,无论你想什么样的都可以。要了解更多信息,请阅读“如何使用自定义音频源?”。
Audio Quality 音频质量
编解码器参数是主要因素:
- SamplingRate :采样,音频每秒被测量多少次的频率。通常,这定义了您想要的音频质量。可能的值是:8、12、16、24和48 kHz。默认值是24 kHz。
- FrameDuration :帧延时,传出音频流编码器延迟(以毫秒为单位)(缓冲区大小以时间为单位)。可能的值为5、10、20、40、80和120毫秒。默认值为20毫秒。
- Bitrate :比特率,在一定时间(秒)内处理的数据量(bits数)。通常,这定义了压缩质量。默认值为30000 b/s。
Transmission Toggles 传输开关
您可以使用Recorder.TransmitEnabled切换(开启或关闭)传输,还有语音检测,可以用来确保我们不会传输无用的背景噪音。
Push-to-Talk 按键通话
使用Photon Voice很容易实现一键通话功能。您需要手动切换语音录制和传输。就像打开和关闭麦克风的静音。开始按键通话只需设置Recorder.TransmitEnabled 为 true。要停止它,只需将值设置回false。可以通过将该属性绑定到用户输入(UI按钮或键盘快捷键)来实现这一点。
Voice Detection 语音检测
语音检测是一项可选功能,它将过滤录制的声音,并仅在超过预定的信号电平阈值时传输。这意味着语音传输在您停止讲话时自动暂停,而在您开始讲话时恢复。这也有助于避免发出无用的噪音,从而减少交通流量。
VoiceDetectionThreshold的默认值是0,01。这是常见环境的推荐值,也是语音检测校准和噪声级测量实验的结果。
Voice Calibration 语音校准
如果在启用语音检测的情况下录制语音时仍遇到问题,则可能需要进行语音校准。Photon Voice提供了一种时间有限的自动校准模式。要启动校准模式,您应该调用Recorder.VoiceDetectorCalibrate(period)。默认校准周期为2000毫秒,但您可以随时更改它。使用校准,Photon Voice自动调整静音和响度阈值。
Receiver Target 接收目标
这是通过音频组(Audio Groups)完成的。如果启用了DebugEchoMode,您可以接收到自己发出的音频流。
Interest Groups 兴趣组
Photon Voice 不只是广播。你可以让你玩家同时进行多个对话,而不会互相干扰。这可以通过“兴趣组”来实现。“兴趣组”由数字(字节)标识。您可以订阅和取消订阅多个组。但是,一次只能将音频传输到一个组。
默认情况下,录音机的兴趣组设置为0:每个玩家都可以与其他人交谈。要设置目标兴趣组,请设置Recorder.InterestGroup.您可以选择多个要收听的组。默认情况下,所有语音客户端仅订阅组0。要更新注册到的组的列表,可以使用以下方法:
VoiceConnection.Client.OpChangeGroups(byte[] groupsToRemove, byte[] groupsToAdd);
更改音频组时,应考虑以下注意事项:
- 只有加入“语音室”才能完成。
- 如果不想添加或删除任何组,则在相应的参数中传递null。
- 如果要添加或删除所有现有组,请在相应的参数中传递一个空数组(byte[0])。
- 无法取消订阅默认音频组(0)。
音频组可以与一键通话相结合,从而为你的游戏获得更好的功能
Debug Echo Mode 调试回显模式
此模式启用后,允许本地录音机发送的音频流被同一个语音客户端接收。这对于调试非常有用,有些用例:
- 测试音频质量,延迟或设置只有一个演员加入一个房间,特别是在早期开发阶段
- 测试麦克风或扬声器
- 其他需要自己的回声或真实广播的场景
调试回显模式仅适用于兴趣组0。
Primary Recorder 主录音机
因为在大多数情况下,只使用一个Recorder 组件,所以我们提供了一个称为“Primary Recorder”的单个默认录音机的快捷方式,可以从VoiceConnection.PrimaryRecorder(或PhotonVoiceNetwork.PrimaryRecorder)访问。您可以在Unity编辑器中或通过代码进行设置。
Initialization 初始化
若要使用Recorder,需要先进行初始化。主记录音机(PrimaryRecorder)会自动初始化。同样在PUN集成中,Recorder是用PhotonVoiceView自动初始化的。在其他情况下,或者如果自动初始化失败,可以使用以下两种方法之一手动初始化录音机:
- VoiceConnection.InitRecorder(Recorder) (或 PhotonVoiceNetwork.InitRecorder(Recorder))
- Recorder.Init(VoiceConnection)
默认情况下,录音机在初始化时将自动开始录音。要禁用此行为并可以手动启动录音,设置Recorder.AutoStart为false,初始化后请使用Recorder.StartRecording()。可以使用Recorder.StopRecording()停止录音。
Restart 重新启动
开始录音前,需要设置所需的录音机配置信息,否则需要使用Recorder.RestartRecording()重新开始录音。要想知道是否需要重新启动记录器,可以检查类似"IsDirty"的标志Recorder.RequiresRestart。
以下是更改后需要重新启动才能生效的列表:
- Recorder.UserData
- Recorder.AudioSourceFactory
- Recorder.UnityMicrophoneDevice
- Recorder.PhotonMicrophoneDeviceId
- Recorder.Source
- Recorder.MicrophoneType
- Recorder.TypeConvert
- Recorder.AudioClip
- Recorder.SamplingRate
- Recorder.FrameDuration
- Recorder.Bitrate
以下是不需要重新启动并在启用传输后立即生效的列表:
- Recorder.TransmitEnabled
- Recorder.Encrypt
- Recorder.ReliableMode
- Recorder.DebugEchoMode
- Recorder.VoiceDetection
- Recorder.VoiceDetectionThreshold
- Recorder.VoiceDetectionDelayMs
- Recorder.AudioGroup
- Recorder.LoopAudioClip (如果条件满足)
React On System Changes 系统更改时反应
有时,如果从系统设置中添加或删除输入或输出音频设备,或者切换默认设置,Photon Voice可能会停止正常工作。自从Photon Voice 2.5 以后,我们引入了一个新的属性Recorder.ReactOnSystemChanges,一旦启用,将使录音机自动重新初始化以从此类系统更改中恢复。对于向后兼容性,默认值为false。您可以在编辑模式或播放模式下设置此值。
默认情况下,只有当正在使用的设备不再可用或不再有效时,录像机才会重新开始录制,在某些情况下,即使正在使用的设备没有更改,也可能需要强制重新启动。启用此功能设置 Recorder.SkipDeviceChangeChecks 为 true。
Record Only When Enabled 仅在启用时录制
如果您想对Recorder组件使用Unity组件的启用/禁用概念(enabled / disabled),则可以通过设置Recorder.RecordOnlyWhenEnabled 为 true。因此,当您从Unity编辑器的检查器或通过代码启用或禁用Recorder时,录音将可以被开始或停止。
【完】