FMOD变声如何捕获并存储处理音效之后的数据

Posted yuxiaoyiyou

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了FMOD变声如何捕获并存储处理音效之后的数据相关的知识,希望对你有一定的参考价值。

类似AVAudioEngine的功能,一个Engine可以将N个connect连接(串联和并联)在一起,这样来实现多个输入源,多层处理效果的混合输出。实现这个所需功能也是通过这样的方案来实现的。也就是说,在使用的音效和目标输出之间增加一个自己的自定义音效处理,在实现这个音效处理时,将最终BUFFER数据设置成为上一音效处理效果输入的BUFFER数据,并且存储这些数据写入文件。

1.绑定两个DSP

system->playSound(sound, 0, false, &channel);
FMOD::DSP          *mydsp = configuration(system);
 int result = system->getMasterChannelGroup(&mastergroup);
//mastergroup应该类似MixOutNode
//dsp需要的音效处理效果
//mydsp自定义的音效处理
ERRCHECK(result);
//分别绑定,注意先后顺序
mastergroup->addDSP(0, dsp);
result = mastergroup->addDSP(0, mydsp);
ERRCHECK(result);

2.在自定义的音效效果处理函数中,截取数据并且将上一步处理结果设定为输出

/*
dspdesc.read                = myDSPCallback;
system->createDSP(&dspdesc, &mydsp);
*/
FMOD_RESULT F_CALLBACK myDSPCallback(FMOD_DSP_STATE *dsp_state, float *inbuffer, float *outbuffer, unsigned int length, int inchannels, int *outchannels)
{
    printf("+++++++++");
    mydsp_data_t *data = (mydsp_data_t *)dsp_state->plugindata;
    
    /*
     This loop assumes inchannels = outchannels, which it will be if the DSP is created with ‘0‘
     as the number of channels in FMOD_DSP_DESCRIPTION.
     Specifying an actual channel count will mean you have to take care of any number of channels coming in,
     but outputting the number of channels specified. Generally it is best to keep the channel
     count at 0 for maximum compatibility.
     */
    for (unsigned int samp = 0; samp < length; samp++)
    {
        /*
         Feel free to unroll this.
         */
        for (int chan = 0; chan < *outchannels; chan++)
        {
            /*
             This DSP filter just halves the volume!
             Input is modified, and sent to output.
             将输入赋予输出,并且保存这个输入结果(上一音效处理过后的PCM数据)
             */
            data->buffer[(samp * *outchannels) + chan] = outbuffer[(samp * inchannels) + chan] = inbuffer[(samp * inchannels) + chan] * data->volume_linear;
        }

    }
    printf("--->%u
",length);

    data->channels = inchannels;
    //这里有个插曲,原来长度设定为length,结果PCM数据播出一直是断断续续的
    fwrite(data->buffer, sizeof(float), length**outchannels, saveFile);
    
    
    return FMOD_OK;
}

3.注意点(采样率和输出通道数)

经设定为

system->setDSPBufferSize(44100, 2);

但是测定为获取下来的两项指标为:44100和1(设定其它数据无法正常获取,出现很大的杂音等,急需熟手指导)

end:以上就是成功实现该项功能的最主要说明,欢迎大家一起探讨

以上是关于FMOD变声如何捕获并存储处理音效之后的数据的主要内容,如果未能解决你的问题,请参考以下文章

:使用fmod对音频进行变调处理

:使用fmod对音频进行变调处理

在 C++ 中检测小的声音效果

Any to Any 实时变声的实现与落地丨RTC Dev Meetup

fmod:如何使用 FMOD_OUTPUTTYPE_WAVWRITER_NRT?

在 iPhone 中使用 FMOD 为音频添加效果并保存新音频