Work in progress
The content of this page was not yet updated for Godot
4.6
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.
Gravação com microfone
Godot suporta gravação de áudio no jogo para Windows, macOS, Linux, Android e iOS.
Uma demonstração simples está incluída nos projetos de demonstração oficiais e será usada como suporte para este tutorial: https://github.com/godotengine/godot-demo-projects/tree/master/audio/mic_record.
You will need to enable audio input in the Audio > Driver > Enable Input project setting, or you'll just get empty audio files.
On iOS and iPadOS, it is also important to set the advanced Audio > General > iOS > Session Category setting to include Record or Play and Record.
A estrutura da demo
A demonstração consiste em uma única cena. Esta cena inclui duas partes principais: a GUI e o áudio.
Vamos nos concentrar na parte de áudio. Nesta demonstração, um barramento chamado Record com o efeito Record é criado para lidar com a gravação de áudio. Um AudioStreamPlayer chamado AudioStreamRecord é usado para gravação.
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);
}
A gravação de áudio é feita pelo recurso AudioEffectRecord que possui três métodos: get_recording(), is_recording_active() e 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 = _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...";
}
}
No início da demonstração, o efeito de gravação não está ativo. Quando o usuário pressiona o RecordButton, o efeito é ativado com set_recording_active(true).
No próximo botão pressionado, como effect.is_recording_active() é true, o stream gravado pode ser armazenado na variável recording chamando effect.get_recording().
func _on_play_button_pressed():
print(recording)
print(recording.format)
print(recording.mix_rate)
print(recording.stereo)
var data = recording.get_data()
print(data.size())
$AudioStreamPlayer.stream = recording
$AudioStreamPlayer.play()
private void OnPlayButtonPressed()
{
GD.Print(_recording);
GD.Print(_recording.Format);
GD.Print(_recording.MixRate);
GD.Print(_recording.Stereo);
byte[] data = _recording.Data;
GD.Print(data.Length);
var audioStreamPlayer = GetNode<AudioStreamPlayer>("AudioStreamPlayer");
audioStreamPlayer.Stream = _recording;
audioStreamPlayer.Play();
}
Para reproduzir a gravação, você atribui a gravação como o stream do AudioStreamPlayer e chama play().
func _on_save_button_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)]
private 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 salvar a gravação, chame save_to_wav() com o caminho para um arquivo. Nesta demonstração, o caminho é definido pelo usuário através de uma caixa de entrada LineEdit.