Запись с микрофона

Godot поддерживает запись звука в игре для Windows, macOS, Linux, Android и iOS.

Простая демонстрация включена в официальные демонстрационные проекты и будет использоваться в качестве примера для этого руководства: <https://github.com/godotengine/godot-demo-projects/tree/master/audio/mic_record> `_.

The structure of the demo

Демо состоит из одной сцены. Эта сцена состоит из двух основных частей: графическая часть и интерфейс звука.

Мы сосредоточимся на звуковой части. В этой демо для обработки аудиозаписи создается шина с именем Record и эффектом Record. Для записи используется AudioStreamPlayer с именем AudioStreamRecord.

../../_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);
}

Аудиозапись обрабатывается с помощью: ref: class_AudioEffectRecord, который имеет три метода:: ref:` get_recording () <class_AudioEffectRecord_method_get_recording> ,: ref: is_recording_active () <class_Audio_AudioEffect_Record_method_is_recording: ) <class_AudioEffectRecord_method_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...";
    }
}

В начале демо запись не активна. Когда пользователь нажимает кнопку RecordButton, запись включается с помощью set_recording_active (true).

При следующем нажатии кнопки, так как effect.is_recording_active () имеет значение true, записанный поток можно сохранить в переменной record, вызвав метод 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();
}

Чтобы воспроизвести запись, вы назначаете её как поток 'AudioStreamPlayer' и вызываете ''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));
}

Чтобы сохранить запись, вы вызываете save_to_wav () с указанием пути к файлу. В этой демо путь определяется пользователем через поле ввода LineEdit.