Grabación con micrófono

Godot soporta la grabación de audio en el juego para Windows, MacOS, Linux, Android e iOS.

Una demo sencilla está incluida en los proyectos de demostración oficiales y puede usarse como ayuda para este tutorial: https://github.com/godotengine/godot-demo-projects/tree/master/audio/mic_record.

La estructura de la demo

La demostración consiste en una sola escena. Esta escena incluye dos partes principales: la interfaz gráfica y el audio.

Nos centraremos en la parte de audio. En esta demostración, se crea un bus llamado Record con el efecto Record para manejar la grabación de audio. Un AudioStreamPlayer llamado AudioStreamRecord se utiliza para la grabación.

../../_images/record_bus.png ../../_images/record_stream_player.png
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);
}

La grabación de audio es manejada por el recurso AudioEffectRecord que tiene tres métodos: get_recording(), : ref:is_recording_active() <class_AudioEffectRecord_method_is_recording_active>, y set_recording_active().

func _on_RecordButton_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..."
public void OnRecordButtonPressed()
{
    if (_effect.IsRecordingActive())
    {
        _recording = _effect.GetRecording();
        GetNode<Button>("PlayButton").Disabled = false;
        GetNode<Button>("SaveButton").Disabled = false;
        _effect.SetRecordingActive(false);
        GetNode<Button>("RecordButton").Text = "Record";
        GetNode<Label>("Status").Text = "";
    }
    else
    {
        GetNode<Button>("PlayButton").Disabled = true;
        GetNode<Button>("SaveButton").Disabled = true;
        _effect.SetRecordingActive(true);
        GetNode<Button>("RecordButton").Text = "Stop";
        GetNode<Label>("Status").Text = "Recording...";
    }
}

Al comienzo de la demostración, el efecto de grabación no está activo. Cuando el usuario pulsa el RecordButton, el efecto se activa con set_recording_active(true).

En el siguiente botón presiona, ya que efecto.is_recording_active() es true, el flujo grabado puede ser almacenado en la variable recording llamando a effect.get_recording().

func _on_PlayButton_pressed():
    print(recording)
    print(recording.format)
    print(recording.mix_rate)
    print(recording.stereo)
    var data = recording.get_data()
    print(data)
    print(data.size())
    $AudioStreamPlayer.stream = recording
    $AudioStreamPlayer.play()
public void OnPlayButtonPressed()
{
    GD.Print(_recording);
    GD.Print(_recording.Format);
    GD.Print(_recording.MixRate);
    GD.Print(_recording.Stereo);
    byte[] data = _recording.Data;
    GD.Print(data);
    GD.Print(data.Length);
    var audioStreamPlayer = GetNode<AudioStreamPlayer>("AudioStreamPlayer");
    audioStreamPlayer.Stream = _recording;
    audioStreamPlayer.Play();
}

Para reproducir la grabación, asigna la grabación como el stream del AudioStreamPlayer y llama a play().

func _on_SaveButton_pressed():
    var save_path = $SaveButton/Filename.text
    recording.save_to_wav(save_path)
    $Status.text = "Saved WAV file to: %s\n(%s)" % [save_path, ProjectSettings.globalize_path(save_path)]
public void OnSavebuttonPressed()
{
    string savePath = GetNode<LineEdit>("SaveButton/Filename").Text;
    _recording.SaveToWav(savePath);
    GetNode<Label>("Status").Text = string.Format("Saved WAV file to: {0}\n({1})", savePath, ProjectSettings.GlobalizePath(savePath));
}

Para guardar la grabación, se llama "save_to_wav" con la ruta de un archivo. En esta demostración, la ruta es definida por el usuario a través de un campo de entrada LineEdit.