Запис з мікрофона¶
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);
}
Аудіозапис обробляється ресурсом AudioEffectRecord, який має три методи: get_recording(), is_recording_active(), та set_recording_active().
func _on_RecordButton_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..."
public 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
, записаний потік можна зберегти у змінну recording
, викликавши effect.get_recording()
.
func _on_PlayButton_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()
public 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_SaveButton_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)]
public 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
.