Attention: Here be dragons
This is the latest
(unstable) version of this documentation, which may document features
not available in or compatible with released stable versions of Godot.
Checking the stable version of the documentation...
Registrazione con il microfono
Godot supporta la registrazione di audio nel gioco per Windows, macOS, Linux, Android e iOS.
Una semplice demo è inclusa nei progetti demo ufficiali e sarà utilizzata come supporto per questo tutorial: https://github.com/godotengine/godot-demo-projects/tree/master/audio/mic_record.
Sarà necessario abilitare l'ingresso audio nelle impostazioni del progetto Audio > Driver > Abilita l'entrata audio, altrimenti si otterranno solo file audio vuoti.
Su iOS e iPadOS, è inoltre importante impostare l'impostazione avanzata Audio > Generali > iOS > Categoria sessione per includere Registra o Riproduci e registra.
La struttura della demo
La demo è composta da una singola scena. Tale scena include due parti principali: l'interfaccia grafica e l'audio.
Ci concentreremo sulla parte audio. In questa demo, viene creato un bus denominato Record con l'effetto Record per gestire la registrazione audio. Per la registrazione viene utilizzato un AudioStreamPlayer denominato AudioStreamRecord.
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 registrazione audio è gestita dalla risorsa AudioEffectRecord che ha tre metodi: 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...";
}
}
All'inizio della demo, l'effetto di registrazione non è attivo. Quando l'utente preme il pulsante RecordButton, l'effetto viene abilitato con set_recording_active(true).
Alla prossima pressione del pulsante, poiché effect.is_recording_active() è true, il flusso registrato si può memorizzare nella variabile recording chiamando 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();
}
Per riprodurre la registrazione, assegnarla come flusso dell'AudioStreamPlayer e chiamare 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));
}
Per salvare la registrazione, si chiama save_to_wav() con il percorso del file. In questa demo, il percorso viene definito dall'utente tramite una casella di input LineEdit.