Work in progress
The content of this page was not yet updated for Godot
4.1
and may be outdated. If you know how to improve this page or you can confirm
that it's up to date, feel free to open a pull request.
Recording with microphone¶
Godot supports in-game audio recording for Windows, macOS, Linux, Android and iOS.
A simple demo is included in the official demo projects and will be used as support for this tutorial: https://github.com/godotengine/godot-demo-projects/tree/master/audio/mic_record.
You will need to enable audio input in the project settings, or you'll just get empty audio files.
The structure of the demo¶
The demo consists of a single scene. This scene includes two major parts: the GUI and the audio.
We will focus on the audio part. In this demo, a bus named Record
with the
effect Record
is created to handle the audio recording.
An AudioStreamPlayer
named AudioStreamRecord
is used for recording.


var effect
var recording
func _ready():
# We get the index of the "Record" bus.
var idx = AudioServer.get_bus_index("Record")
# And use it to retrieve its first effect, which has been defined
# as an "AudioEffectRecord" resource.
effect = AudioServer.get_bus_effect(idx, 0)
private AudioEffectRecord _effect;
private AudioStreamSample _recording;
public override void _Ready()
{
// We get the index of the "Record" bus.
int idx = AudioServer.GetBusIndex("Record");
// And use it to retrieve its first effect, which has been defined
// as an "AudioEffectRecord" resource.
_effect = (AudioEffectRecord)AudioServer.GetBusEffect(idx, 0);
}
The audio recording is handled by the AudioEffectRecord resource which has three methods: get_recording(), is_recording_active(), and set_recording_active().
func _on_record_button_pressed():
if effect.is_recording_active():
recording = effect.get_recording()
$PlayButton.disabled = false
$SaveButton.disabled = false
effect.set_recording_active(false)
$RecordButton.text = "Record"
$Status.text = ""
else:
$PlayButton.disabled = true
$SaveButton.disabled = true
effect.set_recording_active(true)
$RecordButton.text = "Stop"
$Status.text = "Recording..."
private void OnRecordButtonPressed()
{
if (_effect.IsRecordingActive())
{
_recording