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.

使用麥克風錄音

Godot 支援於 Windows、macOS、Linux、Android 與 iOS 平台進行遊戲內音訊錄音。

官方範例專案中包含有一個簡單的示範,並將用於本教學說明:<https://github.com/godotengine/godot-demo-projects/tree/master/audio/mic_record>_。

你必須在 Audio > Driver > Enable Input 專案設定中啟用音訊輸入,否則只會獲得空白的音訊檔案。

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.

範例結構

本示範由單一場景組成,場景包含兩大部分:GUI 介面與音訊處理。

我們將聚焦於音訊部分。在此範例中,建立了一個名為 Record 的匯流排(Bus),並加上 Record 效果來處理錄音,另外用一個名為 AudioStreamRecordAudioStreamPlayer 來播放錄音。

../../_images/record_bus.png ../../_images/record_stream_player.png
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)

音訊錄製是透過 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..."

在範例開始時,錄音效果尚未啟動。當使用者按下 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()

若要播放錄音,只需將錄製內容指定為 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)]

若要儲存錄音,可以呼叫 save_to_wav() 並指定檔案路徑。在本範例中,路徑由使用者透過 LineEdit 輸入欄位自訂。