在有些需求下,动作要加速,然后音频也要跟着加速,或者反之,动作减速,音频也减速。
需求很奇葩…… 参考的几个网址: https://qa.fmod.com/t/changing-speed-of-audio-without-altering-pitch/13903 https://qa.fmod.com/t/adding-a-dsp/12211 http://blackchy.com/2018/12/10/2018-12-10-Fmod-Voice-Change/
下面是尝试了fmod中两个播放声音的方法,分别进行加速处理。
1、如果你使用的是Event进行播放声音的话 那么在D:\OGL2\fmodProject2.00.01\Assets\Plugins\FMOD\src\Runtime\wrapper\fmod_studio.cs 中,你会看到:
public struct EventInstance { public RESULT setPitch(float pitch) { return FMOD_Studio_EventInstance_SetPitch(this.handle, pitch); }这个单词Pitch是音高的意思。 我在测试的时候,使用如下代码:
public StudioEventEmitter m_emitter; public void Update() { if (Input.GetKeyDown(KeyCode.A)) { m_emitter.Play(); } if (Input.GetKeyDown(KeyCode.K)) { m_emitter.EventInstance.setPitch(2f); } }在A键按下的时候播放,在K键按下的时候,设置音高2为2.0f。 其效果是,速度变快了。如何证明速度变快了呢?可以在update中一直检测是否播放完毕,发现设置setPitch(2f)之后,其时间的确缩短了一半。
但是,但是,音频策划发现,音高升高了,经过查找,发现这种方法的确会影响音高的问题,在网址: https://qa.fmod.com/t/changing-speed-of-audio-without-altering-pitch/13903
上面说的意思是,可以加一个dsp进行缓解下。 但是下面: 这里说,没有好的解决方法。
ok,我们还是看看如何给一个event加一个dsp吧,看看效果如何:
FMOD.DSP dsp; FMOD.RESULT res = RuntimeManager.CoreSystem.createDSPByType(FMOD.DSP_TYPE.PITCHSHIFT, out dsp); //创建dsp,传入类型PITCHSHIFT FMOD.ChannelGroup channel; //得到channelgroup res = m_emitter.EventInstance.getChannelGroup(out channel); FMOD.RESULT res3 = channel.addDSP(0, dsp); //给channelgroup的0号位置加入一个dsp,经过测试1号位置也可以,其他位置无效 res = channel.getDSP(0, out dsp); //测试是否加入dsp成功 //设置dsp缓解系数 public void OnValueChanged() { Debug.LogError(m_slider.value); FMOD.RESULT res = dsp.setParameterFloat((int)FMOD.DSP_PITCHSHIFT.PITCH, m_slider.value); //FMOD.RESULT res = dsp.setParameterFloat(0, m_slider.value); //和上面一句等价 Debug.LogError("xxx = " + res); float sdsd = 0; res = dsp.getParameterFloat((int)FMOD.DSP_PITCHSHIFT.PITCH, out sdsd); Debug.LogError("sadfasf = " + sdsd); }ok,经过测试是可以稍微压低点音高的,但是效果不理想,原因是: 这个值是在0.5到2之间,也就是如果应该超过了2以上,那么你不可能设置一个很小的值,最小的值也就是0.5进行中和,所以这个局限很有限。
2、如果使用Sound方式进行声音的控制 经过查看,法线fmod中的Struct Sound中有控制速度的接口,那不妨尝试下使用Sound来播放声音,实现变速试试。
测试代码如下:
FMOD.Sound sound; FMOD.Channel channel; if (Input.GetKeyDown(KeyCode.A)) { FMOD.RESULT res = RuntimeManager.CoreSystem.createSound(dialogueSoundInfo.name_or_data, FMOD.MODE._3D, ref dialogueSoundInfo.exinfo, out sound); res = RuntimeManager.CoreSystem.createSound("D:/OGL2/fmodProject2.00.01/Assets/Dub Invitation 6.mid", FMOD.MODE._3D, out sound); //这里的路径可以测试下,是否可以使用相对路径,待测试。 FMOD.ChannelGroup group; res = RuntimeManager.CoreSystem.createChannelGroup("adfadf", out group); res = sound.setMusicSpeed(1f); res = RuntimeManager.CoreSystem.playSound(sound, group, false, out channel); FMOD.MODE mdd; res = sound.getMode(out mdd); sound.set3DMinMaxDistance(0, 1000); //这个不行,如果声音是3D的,那么直接设Sound的声音范围 //channel.set3DMinMaxDistance(0, 1000); }下面是更新位置和设置速度:
bool isplay = false; channel.isPlaying(out isplay); FMOD.VECTOR pos, v; pos.x = cube.transform.position.x; pos.y = cube.transform.position.y; pos.z = cube.transform.position.z; v.x = 0; v.y = 0; v.z = 0; if (isplay) { channel.set3DAttributes(ref pos, ref v); } if (Input.GetKeyDown(KeyCode.B)) { //m_emitter.EventInstance.setPitch(0.2f); //Debug.LogError(0.2f); //FMOD.RESULT x = m_emitter.EventInstance.setVolume(0.2f); float speed = 0; FMOD.RESULT res = sound.getMusicSpeed(out speed); res = sound.setMusicSpeed(1f); }ok,经过测试是可以的,但是对于音频的格式有要求,必须使用MOD/S3M/XM/IT/MIDI 格式的音频文件 我只测试了MIDI格式的文件。 参考网址: https://www.fmod.com/resources/documentation-api?version=2.0&page=core-api-sound.html 我试了下,使用mp3和wav格式的音频,结果,在检测FMOD.RESULT的时候,法线是ERR_FORMAT ERR_FORMAT, /* Unsupported file or audio format. */ 这个提示,提示我去查看api,发现只有上面的5种格式可以支持,所以我下载了: WIDI 4.3 Pro 进行音频的转换,结果,结果,速度真的变量,音高,我自己听还是可以的,没有变化。
所以,如果想实现变速、不变音高的需求,使用Sound比较容易些。
ok,over!!!