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.
L'enregistrement avec le microphone¶
Godot prend en charge l'enregistrement audio en jeu pour Windows, MacOS, Linux, Android et iOS.
Une démo simple est incluse dans les projets de démonstration officiels et sera utilisée comme support pour ce tutoriel : https://github.com/godotengine/godot-demo-projects/tree/master/audio/mic_record.
Vous devrez activer l'entrée audio dans les paramètres du projet, sinon vous obtiendrez des fichiers audio vides.
La structure de la démo¶
La démo consiste en une seule scène. Cette scène comprend deux parties principales : l'interface graphique et l'audio.
Nous nous concentrerons sur la partie audio. Dans cette démo, un bus nommé Record
avec l'effet Record
est créé pour gérer l'enregistrement audio. Un AudioStreamPlayer
nommé AudioStreamRecord
est utilisé pour l'enregistrement.
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);
}
L'enregistrement audio est géré par la ressource AudioEffectRecord qui possède trois méthodes : get_recording(), is_recording_active(), et 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...";
}
}
Au début de la démo, l'effet d'enregistrement n'est pas actif. Lorsque l'utilisateur appuie sur le RecordButton
, l'effet est activé avec set_recording_active(true)
.
À la prochain pression sur le bouton, comme effect.is_recording_active()
est true
, le flux enregistré peut être stocké dans la variable recording
en appelant 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();
}
Pour lire l'enregistrement, vous affectez l'enregistrement comme le flux du AudioStreamPlayer
et appelez 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));
}
Pour enregistrer l'enregistrement, vous appelez save_to_wav()
avec le chemin vers un fichier. Dans cette démo, le chemin d'accès est défini par l'utilisateur via une zone de saisie LineEdit
.