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的遊戲內音訊錄製.
一定要查看Viewport演示! 可以下載演示檔案中的Viewport資料夾, 或: https://github.com/godotengine/godot-demo-projects/tree/master/audio/mic_record.
你需要在專案設定中啟用音訊輸入,否則只能獲得空的音訊檔。
根節點的結構¶
該演示由單一場景組成, 這個場景包括兩個主要部分:GUI和音訊.
我們將重點介紹音訊部分. 在本演示中, 建立了一個名為 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
, 可以通過呼叫 effect.get_recording()
將錄製的流儲存到 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
輸入框定義.