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...
Nahrávání s mikrofonem
Godot podporuje nahrávání zvuku ve hře pro Windows, macOS, Linux, Android a iOS.
Jednoduchá ukázka je součástí oficiálních ukázkových projektů a bude použita pro podpoření tohoto návodu: https://github.com/godotengine/godot-demo-projects/tree/master/audio/mic_record.
Budete muset povolit zvukový vstup v nastavení projektu Zvuk > Ovladač > Povolit vstup, jinak získáte pouze prázdné zvukové soubory.
On iOS and iPadOS, it is also important to set the advanced Audio > General > iOS > Session Category setting to include Record or Play and Record.
Struktura ukázky
Ukázka sestává z jediné scény, která obsahuje dvě hlavní části: GUI a zvuk.
Zaměříme se na zvukovou část. V této ukázce je vytvořena sběrnice Record ("nahrávání") s efektem Record pro zpracování zvukového záznamu. Pro nahrávání se používá AudioStreamPlayer ("přehrávač zvukových streamů") s názvem 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);
}
Zvukový záznam zpracovává zdroj AudioEffectRecord ("zvukový efekt nahrávání"), který má tři metody: get_recording() ("získat nahrávku"), is_recording_active() ("je nahrávání aktivní") a set_recording_active() ("nastavit nahrávání aktivní").
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...";
}
}
Na začátku ukázky není efekt nahrávání aktivní. Když uživatel stiskne tlačítko RecordButton, efekt se aktivuje pomocí set_recording_active(true).
Při dalším stisknutí tlačítka, jelilkož effect.is_recording_active() je true, lze zaznamenaný stream uložit do proměnné recording zavoláním 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();
}
Pro přehrání nahrávky přiřadíte nahrávku jako stream přehrávače AudioStreamPlayer a zavoláte 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));
}
Pro uložení nahrávky zavoláte save_to_wav() s cestou k souboru. V této ukázce je cesta definována uživatelem pomocí vstupního pole LineEdit.