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!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章