Work in progress
The content of this page was not yet updated for Godot
4.2
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.
Você precisará ativar a entrada de áudio nas configurações do projeto ou obterá apenas arquivos de áudio vazios.
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
.