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.
Запись с микрофона¶
Godot поддерживает запись звука в игре для Windows, macOS, Linux, Android и iOS.
Простая демонстрация включена в официальные демонстрационные проекты и будет использоваться в качестве примера для этого руководства: <https://github.com/godotengine/godot-demo-projects/tree/master/audio/mic_record> `_.
You will need to enable audio input in the project settings, or you'll just get empty audio files.
Структура демо¶
Демо состоит из одной сцены. Эта сцена состоит из двух основных частей: графическая часть и интерфейс звука.
Мы сосредоточимся на звуковой части. В этой демо для обработки аудиозаписи создается шина с именем Record и эффектом Record. Для записи используется AudioStreamPlayer с именем 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);
}
Аудиозапись обрабатывается с помощью: ref: class_AudioEffectRecord, который имеет три метода:: ref:` get_recording () <class_AudioEffectRecord_method_get_recording> ,: ref: is_recording_active () <class_Audio_AudioEffect_Record_method_is_recording: ) <class_AudioEffectRecord_method_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...";
}
}
В начале демо запись не активна. Когда пользователь нажимает кнопку RecordButton, запись включается с помощью set_recording_active (true).
При следующем нажатии кнопки, так как effect.is_recording_active () имеет значение true, записанный поток можно сохранить в переменной record, вызвав метод 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();
}
Чтобы воспроизвести запись, вы назначаете её как поток 'AudioStreamPlayer' и вызываете ''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));
}
Чтобы сохранить запись, вы вызываете save_to_wav () с указанием пути к файлу. В этой демо путь определяется пользователем через поле ввода LineEdit.