(摘) Godot录音并转换为mp3/ogg

声明:内容源自网络,版权归原作者所有。若有侵权请在网页聊天中联系我

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()

相关文章