Recorder Component

The Recorder is the component that will transmit the audio stream. Using this component you choose what to stream (Input Audio Source), how to stream it (Audio Quality), when to start and stop transmission (Transmission Toggles) and to whom we transmit (Receiver Target). Also the Recorder requires initialization.


Input Audio Source

The Recorder supports various types of input audio feed to stream. The most obvious one is the microphone which is used for voice chat. However, the Recorder supports two other types of input sources.

Back To Top


To use the microphone as an input source type for the voice stream to be transmitted by the Recorder, simply set the Recorder.SourceType to Recorder.InputSourceType.Microphone.

Back To Top

Microphone Selection

Photon offers two options to choose from for which microphone API to use. Each Recorder can have its own type of microphone input device that can be set using Recorder.MicrophoneType. The two different values are:


By default, we make use of Unity's Microphone API on all platforms. Unity exposes all available audio input devices using Microphone.devices array of strings. The microphone device can be identified using its string name or its index in that array. By default, the first element of that array will be used. If you want to set another device explicitly, do it using Recorder.UnityMicrophoneDevice.

To use Unity's Microphone API simply set the Recorder.MicrophoneType to Recorder.MicType.Unity.


Unity is great for making it easier to target multiple platforms using almost the same code base. However, in some ways, Unity's Microphone API is limited or present some issues here and there. That is why we introduced our own way of directly interacting with audio input devices and bypassing Unity's Microphone API. One of the major reasons for this is to make use of devices' hardware built-in echo cancellation. We have implemented native plugins for four major platforms: Android, iOS, Windows and macOS.

However, enumerating the list of available microphones is available only for macOS and Windows. On Android and iOS we use the default audio input device used by the system. You can check the list of available "Photon microphones" using Recorder.PhotonMicrophoneEnumerator as follows:

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), 

You can set a microphone using Recorder.PhotonMicrophoneDeviceId.

To use Photon's Microphone API simply set the Recorder.MicrophoneType to Recorder.MicType.Photon.

Back To Top

Unity Editor Consideration

While the choice of the microphone API (Unity or Photon) persists between Unity Editor and the output build, the choice of the actual device does not. The list of the microphone devices available in the Unity Editor may not be the same on the machine where the build will be running. The build can be running on a different platform with a different system and with different audio input devices. That is why, if needed, you can switch from a default microphone to another one, if available, explicitly via code at runtime from the build client.

Back To Top

Microphone Access: Recording And Muting

By default, the Recorder component will start recording automatically once initialized. You can disable this by setting Recorder.AutoStart to false.

If you are looking for options to mute the microphone 'locally' ('self-muting'), you can use either Recorder.TransmitEnabled or Recorder.IsRecording.

Recorder.IsRecording can be set at runtime (play mode) once the recorder is initialized.

So if you want to stop recording and "release" the microphone you can set Recorder.IsRecording to false. Set it back to true to resume recording.

By design, when recording is disabled the audio stream is completely gone.

Back To Top

Streaming Audio Clips

This option was introduced to test Photon Voice transmission. However, you may use it for other purposes. In order to broadcast an audio clip to other players joined to the same room, you need to assign an audio media file supported by Unity to Recorder.AudioClip. This can be done by a drag and drop to the Inspector from Unity Editor. If you want the audio clip to be replayed every time make sure Recorder.LoopAudioClip is set to true or tick "Loop" from Unity Editor for the Recorder's inspector.

Back To Top

Custom Factory

Photon Recorder allows you to have your own custom audio source for whatever use case you have in mind. To know more, read "How to use custom audio source?".

Back To Top

Audio Quality

Codec parameters are the main factor here:

  • SamplingRate: a frequency of how many times the audio is measured per second.Generally, this defines the audio quality you want. Possible values are: 8, 12, 16, 24 and 48 kHz. Default is 24 kHz.
  • FrameDuration: outgoing audio stream encoder delay in milliseconds (buffer size in terms of time).Possible values are 5, 10, 20, 40, 80 and 120 ms. Default is 20 ms.
  • Bitrate: the amount of data (the number of bits) that are processed over a certain amount of time (second).Generally, this defines the compression quality. Default value is 30000 b/s.

Back To Top

Other Stream Settings

  • Encrypt: if true, all outgoing audio streams will be encrypted. Default is false.Read more about "Encryption" here.
  • ReliableMode: if true, all outgoing audio streams will be in reliable mode. Default is false.

Back To Top

Transmission Toggles

You can toggle transmission using Recorder.TransmitEnabled. There is also VoiceDetection that can be used to make sure we don't transmit useless background noise.

Back To Top


It is easy to have a push-to-talk feature with Photon Voice. You need to manually toggle voice recording and transmission. It's like turning microphone mute on and off. To start push-to-talk just set Recorder.TransmitEnabled to true. To stop it just set the value back to false. You can achieve this by binding the property to a user input (UI button or keyboard shortcut).

Back To Top

Voice Detection

Voice detection is an optional feature that will filter recorded sound and transmits only when a predefined threshold of signal level is exceeded. This means that voice transmission is automatically paused when you stop speaking and it is resumed when you start talking. This will also help you avoid sending useless noise and thus reduce traffic.

The default value of VoiceDetectionThreshold is 0,01. It is the recommended value for common environments as a result of experiments with voice detection calibration and noise level measurements.

Back To Top

Voice Calibration

If you still experience issues when recording your voice even with voice detection is on, you may need voice calibration. Photon Voice offers an auto calibration mode which is limited in time. To start the calibration mode you should call Recorder.VoiceDetectorCalibrate(period). The default calibration period is 2000 milliseconds but you can always change it. Using calibration, Photon Voice automatically adjusts silence and loudness thresholds.

Back To Top

Receiver Target

This is done via Audio Groups. Optionally you could receive your own streams if DebugEchoMode is enabled.

Back To Top

Interest Groups

Photon Voice is not for broadcast only. You can offer your players the possibility to have multiple conversations going on at the same time without interfering with each other. This can be done using "Interest Groups". An "Interest Group" is identified by a number (byte). You can subscribe and unsubscribe from multiple groups. However, you can only transmit audio to one group at a time.

By default, the recorder's interest group is set to 0 : each player can talk to everyone else. To set the target interest group, set Recorder.InterestGroup.

You can select more than one group you want to listen to. By default, all voice clients are subscribed to group 0 only. To update the list of groups you're registered to, you can use the following method:

VoiceConnection.Client.OpChangeGroups(byte[] groupsToRemove, byte[] groupsToAdd);

You should take into consideration the following notes when changing audio groups:

  • It can be done only when joined to a "voice room".
  • If you don't want to add or remove any group pass a null in the respective parameter.
  • If you want to add or remove all existing groups pass an empty array (byte[0]) in the respective parameter.
  • You cannot unsubscribe from the default audio group (0).

Audio groups can be combined with Push-to-Talk to obtain nice features for your game.

Back To Top

Debug Echo Mode

This mode, when enabled, allows audio streams transmitted by local Recorder to be received by the same voice client. This is useful for debugging purposes, some use cases:

  • testing audio quality, delays or setup with one actor only joined to a room, especially during the early development phase
  • testing one's microphone or speakers
  • other scenarios that involve the need for own echo or true broadcast

Debug Echo Mode works only with Interest Group 0.

Back To Top

Primary Recorder

Since in most cases, a single Recorder component is used, we have provided a shortcut for a single default Recorder called "Primary Recorder" which can be accessed from VoiceConnection.PrimaryRecorder (or PhotonVoiceNetwork.PrimaryRecorder).You can set it in the Unity Editor or via code.

Back To Top


In order to work the Recorder needs to be initialized. The PrimaryRecorder is automatically initialized. Also in PUN integration, Recorders are automatically initialized using PhotonVoiceView. In other use cases, or if the automatic initialization fails somehow, you can manually initialize a Recorder using one of two methods:

  • VoiceConnection.InitRecorder(Recorder) (or PhotonVoiceNetwork.InitRecorder(Recorder))
  • Recorder.Init(VoiceConnection)

By default, the Recorder will automatically start recording when initialized. To disable this behaviour and manually start recording using Recorder.StartRecording() after initialization, set Recorder.AutoStart to false. You can stop recording using Recorder.StopRecording().

Back To Top


You need to set the Recorder settings you want before recording is started, otherwise you will need to restart using Recorder.RestartRecording().

To know if the Recorder needs to be restarted, you can check the 'IsDirty' like flag Recorder.RequiresRestart.

Here is the list of things that require restart when changed in order for them to take effect:

  • Recorder.UserData
  • Recorder.AudioSourceFactory
  • Recorder.UnityMicrophoneDevice
  • Recorder.PhotonMicrophoneDeviceId
  • Recorder.Source
  • Recorder.MicrophoneType
  • Recorder.TypeConvert
  • Recorder.AudioClip
  • Recorder.SamplingRate
  • Recorder.FrameDuration
  • Recorder.Bitrate

Here is the list of things that do not require restart and will take effect immediately if the transmission is enabled:

  • Recorder.TransmitEnabled
  • Recorder.Encrypt
  • Recorder.ReliableMode
  • Recorder.DebugEchoMode
  • Recorder.VoiceDetection
  • Recorder.VoiceDetectionThreshold
  • Recorder.VoiceDetectionDelayMs
  • Recorder.AudioGroup
  • Recorder.LoopAudioClip (if conditions are met)

Back To Top

React On System Changes

Sometimes if you add or remove input or output audio device(s) from the system settings or if you switch the default one, Photon Voice can stop working properly. Since Photon Voice 2.5 we have introduced a new property Recorder.ReactOnSystemChanges that, once enabled, will make the Recorder automatically reinitializes itself to recover from such system changes. The default value is false for backward compatibility. You can set this value in edit mode or in play mode.

By default, the Recorder will restart recording only when the device being used is no longer available or valid, in some cases you may need to force restarts even if the device in use did not change. To enable this set Recorder.SkipDeviceChangeChecks to true.

Back To Top

Stop Recording When Paused

There is an option to stop recording when the application is paused (e.g. moves to the background or loses focus) and start again when the application is unpaused. To enable this behaviour set Recorder.StopRecordingWhenPaused to true.

Back To Top

Record Only When Enabled

If you would like to use Unity components' enabled / disabled concept for the Recorder component, you could make sure that the Recorder works only when enabled and active in the hierarchy by setting Recorder.RecordOnlyWhenEnabled to true. So when you enable or disable the Recorder from the Inspector in the Unity Editor or by code, the recording could start or stop.

To Document Top