fmod中音频变速的问题

在有些需求下,动作要加速,然后音频也要跟着加速,或者反之,动作减速,音频也减速。

需求很奇葩……
参考的几个网址:
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!!!

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
fmod是一个用于音频处理的库,它提供了许多函数和接口来获取和处理音频数据。要使用fmod获取音频数据并绘制图形,可以按照以下步骤进行: 1. 初始化fmod:首先,我们需要初始化fmod库。这可以通过调用fmod提供的初始化函数来完成。在初始化过程,我们需要指定音频设备的一些参数,例如采样率、声道数等。 2. 创建fmod系统对象:一旦fmod初始化完成,我们可以创建一个fmod系统对象。系统对象可以用来管理和控制音频资源,包括加载音频文件、播放音频、获取音频数据等。 3. 打开音频文件:使用系统对象提供的函数,我们可以打开一个音频文件。打开音频文件后,我们可以通过fmod提供的函数来获取音频数据。例如,使用fmod系统对象的"getWaveData"函数可以获取当前播放位置的音频数据。 4. 绘制图形:获取到音频数据后,我们可以使用各种图形库或绘图工具来绘制图形。例如,我们可以使用Python的matplotlib库或者其他绘图库来创建音频波形图。通过将获取到的音频数据作为输入,我们可以将其与时间轴进行绘制,以呈现音频信号的波形形状。 5. 更新音频数据:如果需要实时更新绘图,我们可以使用一个循环来不断获取音频数据并更新图形。在每次循环,我们可以调用fmod的函数来获取新的音频数据,并使用绘图库来更新图形。 总结:使用fmod获取音频数据并绘制图形的过程包括初始化fmod、创建系统对象、打开音频文件、获取音频数据和绘制图形。这些步骤可以帮助我们实现音频数据的可视化,以便更好地理解和分析音频信号。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值