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.
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.
Debes habilitar la entrada de audio en la configuración del proyecto, de lo contrario, obtendrás archivos de audio vacíos.
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.
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_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...";
}
}
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_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 reproducir la grabación, asigna la grabación como el stream del AudioStreamPlayer
y llama a 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 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
.