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.
Aufnahme mit Mikrofon¶
Godot unterstützt Audioaufnahmen innerhalb des Spiels unter Windows, MacOS, Linux, Android und iOS.
Ein einfaches Beispiel ist in den offiziellen Demo-Projekten enthalten und wird als Unterstützung für diese Anleitung verwendet: https://github.com/godotengine/godot-demo-projects/tree/master/audio/mic_record.
Sie müssen die Audioeingabe in den Projekteinstellungen aktivieren, da Sie sonst nur leere Audiodateien erhalten.
Der Aufbau der Demo¶
Die Demo besteht aus einer einzelnen Szene. Diese Szene enthält zwei Hauptteile: die GUI und das Audio.
Wir werden uns auf den Audioteil konzentrieren. In dieser Demo wird ein Bus mit dem Namen Record
mit dem Effekt Record
für die Audioaufnahme erstellt. Ein AudioStreamPlayer
mit dem Namen AudioStreamRecord
wird für die Aufnahme verwendet.
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);
}
Die Audioaufnahme wird von der Ressource AudioEffectRecord gehandhabt, die drei Methoden hat: get_recording(), is_recording_active(), und 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...";
}
}
Zu Beginn der Demo ist der Aufnahmeeffekt nicht aktiv. Wenn der Benutzer den RecordButton
drückt, wird der Effekt mit set_recording_active(true)
aktiviert.
Beim nächsten Druck auf den Button, wenn effect.is_recording_active()
auf true
steht, kann der aufgenommene Stream durch den Aufruf von effect.get_recording()
in der Variable recording
gespeichert werden.
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();
}
Um die Aufnahme abzuspielen, weisen Sie die Aufnahme als Stream des AudioStreamPlayer
zu und rufen play()
auf.
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));
}
Um die Aufnahme zu speichern, rufen Sie save_to_wav()
mit dem Pfad zu einer Datei auf. In dieser Demo wird der Pfad vom Benutzer über ein LineEdit
Eingabefeld definiert.