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

You will need to enable audio input in the Audio > Driver > Enable Input project setting, or you'll just get empty audio files.

演示项目的结构

该演示由单个场景组成。该场景包含两个主要部分:GUI 和音频。

我们将重点介绍音频部分。在该演示中,创建了一个名为 Record 的总线,并附有效果 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 输入框定义。