UI很简单,两个节点:AudioStreamPlayer用于录音,Button用于开始/结束录音。
注意 项目设置必须 音频-驱动-启动输入,启用它,否则你得到的是空的音频文件。(在这上面折腾好久)
在音频总线上添加 Record 音频总线及选中 Record 效果。
在AudioStreamPlayer节点中Bus选中Record, Stream选择AudioStreamMicrophon。看起来Autoplay也是必须启用的。
代码不到二十行,还包括保存为wav文件。
extends Node2D
var effect
func _ready():
var idx = AudioServer.get_bus_index("Record") # 获取Record总线的索引
effect = AudioServer.get_bus_effect(idx, 0) # 使用它来检索定义的第一个效果作为AudioEffectRecord资源
func _on_button_pressed() -> void:
if effect.is_recording_active():
var recording = effect.get_recording()
effect.set_recording_active(false)
#默认值
#recording.set_mix_rate(44100)
#recording.set_format(1)
#recording.set_stereo(true)
$Button.text = "录音"
recording.save_to_wav("res://record.wav")
else:
effect.set_recording_active(true)
$Button.text = "停止"
看起来录音并不复杂,而如何将wav转换为mp3或ogg呢? 暂未看到有godot自身的方案。其中一个方案是通过Golang接力,将wav转ogg/mp3。嵌一个ffmpeg也不是不可以。
书接上方,要继续实现转mp3/ogg。这是因为wav太大,不利于网络传输。godot对ogg更友好(协议问题)。
实现方法是使用ffmpeg进行wav转ogg,其实mp3类似,只是需要另行实现文件数据的读取。
以下实现在保存音频时转为ogg,再通过AudioStreamPlayer节点播放出来。
音频文件保存在临时文件夹中。
其中要注意的是载入音频部份的方法$AudioPlayer.stream = AudioStreamOggVorbis.load_from_file(file + “.ogg”)
func save_voice():
var output = []
var temp = OS.get_environment("TEMP").replace("\\","/")
var file = (temp+"/record.wav").replace("//","/")
recording.save_to_wav(file)
var code = OS.execute("ffmpeg",["-i",file,"-y",file + ".ogg"], output)
if code==0:
$AudioPlayer.stream = AudioStreamOggVorbis.load_from_file(file + ".ogg")
$AudioPlayer.play()