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...
Запис з мікрофона
Godot підтримує запис звуку всередині гри для Windows, macOS, Linux, Android та iOS.
Проста демонстрація цього включена в офіційні демо-проекти і буде використовуватися в якості зразка для цього уроку: https://github.com/godotengine/godot-demo-projects/tree/master/audio/mic_record.
Вам потрібно буде ввімкнути аудіовхід у налаштуваннях проекту Audio > Driver > Enable Input, інакше ви отримаєте лише порожні аудіофайли.
На iOS та iPadOS також важливо встановити розширений параметр Аудіо > Загальні > iOS > Категорія сеансу, щоб увімкнути Запис або Відтворення та запис.
Структура демо
Демонстрація складається з однієї сцени. Ця сцена включає в себе дві основні частини: графічний інтерфейс і аудіо.
Ми зосередимося на аудіо-частині. У цій демонстрації для обробки аудіозапису створюється шина 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_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, записаний потік можна зберегти у змінну recording, викликавши 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.