zhaochengfeng / FMODIOS

fmod ios voice change
24 stars 15 forks source link

如何输出变声后的音频文件 #1

Open install-b opened 6 years ago

install-b commented 6 years ago

如题

zhaochengfeng commented 6 years ago

我先研究下~,这个Demo是帮朋友写的,网上iOS的资料很少,我也没有去深入研究。如果找到方案再通知你

install-b commented 6 years ago

那就非常感谢了。我研究了你这个代码很久没研究啥出来(技术菜)😂,有劳兄台了。

zhaochengfeng commented 6 years ago

客气,这跟技术无关的,因为这是c++写的,技术再牛不会c++看文档也官方demo也很费劲。我周末看了下,保存应该没多大问题,周末出去玩了,没时间写,晚上或者明天push上去

MaoNan commented 5 years ago

我仿照 https://www.jianshu.com/p/2e1fd3035ae1 去处理变声后输出的音频文件, 我传的音频文件地址mp3格式的,但是去播放输出文件的时候只能听到一个杂音。

代码如下

FMOD_SYSTEM mSystem; FMOD_SOUND sound; FMOD_DSP dsp; FMOD_CHANNEL channel; bool playing;

char fmod_set_audio_effect(int flag, const char path_str, const char *save_str){

FMOD_System_Create(&mSystem);
playing = true;
char *error = (char *)"nil";
int err = 0;
err = FMOD_System_SetSoftwareFormat(mSystem,8000,FMOD_SPEAKERMODE_MONO,0);//设置采样率为8000,channel为1
if(err!=0)return error;
char cDest[2000];
strcpy(cDest, save_str);

FMOD_System_SetOutput(mSystem, FMOD_OUTPUTTYPE_WAVWRITER);//保存文件格式为WAV
FMOD_System_Init(mSystem, 32, FMOD_INIT_NORMAL | FMOD_INIT_PROFILE_ENABLE, cDest);
try {
    //创建声音

    FMOD_System_CreateSound(mSystem, path_str, FMOD_DEFAULT, NULL, &sound);
    FMOD_System_PlaySound(mSystem, sound, 0, false, &channel);

    switch (flag) {
        case 0:
            //原生
            break;
        case 1:
            //萝莉
            //创建音频处理DSP 类型 为音频提高
            FMOD_System_CreateDSPByType(mSystem, FMOD_DSP_TYPE_PITCHSHIFT, &dsp);
            //设置dsp大小
            FMOD_DSP_SetParameterFloat(dsp, FMOD_DSP_PITCHSHIFT_PITCH, 2.0);
            //添加一个处理单元到通道
            FMOD_Channel_AddDSP(channel, 0, dsp);
            break;

        case 2:
            //惊悚
            //创建音频处理DSP 类型 为颤抖
            FMOD_System_CreateDSPByType(mSystem, FMOD_DSP_TYPE_TREMOLO, &dsp);
            //设置低频频率
            FMOD_DSP_SetParameterFloat(dsp, FMOD_DSP_TREMOLO_FREQUENCY, 20);
            //设置声音歪斜
            FMOD_DSP_SetParameterFloat(dsp, FMOD_DSP_TREMOLO_SKEW, 0.5);
            //添加一个处理单元到通道
            FMOD_Channel_AddDSP(channel, 0, dsp);
            break;

        case 3:
            //大叔
            //创建音频处理DSP 类型 为音频提高
            FMOD_System_CreateDSPByType(mSystem, FMOD_DSP_TYPE_PITCHSHIFT, &dsp);
            //设置dsp大小
            FMOD_DSP_SetParameterFloat(dsp, FMOD_DSP_PITCHSHIFT_PITCH, 0.5);

            //添加一个处理单元到通道
            FMOD_Channel_AddDSP(channel, 0, dsp);
            break;
        case 4:
        {
            //搞怪
            float mfrequency = 0;
            //得到频率
            FMOD_Channel_GetFrequency(channel, &mfrequency);
            FMOD_Channel_SetFrequency(channel, mfrequency * 2);
            break;
        }

        case 5 :{
            //空灵
            //创建音频处理DSP 类型 为音频提高
            FMOD_System_CreateDSPByType(mSystem, FMOD_DSP_TYPE_ECHO, &dsp);
            //设置dsp大小  延迟声
            FMOD_DSP_SetParameterFloat(dsp, FMOD_DSP_ECHO_DELAY, 300);
            //回音音量
            FMOD_DSP_SetParameterFloat(dsp, FMOD_DSP_ECHO_FEEDBACK, 20);

            //添加一个处理单元到通道
            FMOD_Channel_AddDSP(channel, 0, dsp);
            break;
        }
        case 6: {
            //机器人
            FMOD_System_CreateDSPByType(mSystem, FMOD_DSP_TYPE_ECHO, &dsp);
            FMOD_DSP_SetParameterFloat(dsp, FMOD_DSP_ECHO_DELAY, 50);
            FMOD_DSP_SetParameterFloat(dsp, FMOD_DSP_ECHO_FEEDBACK, 60);
            FMOD_Channel_AddDSP(channel, 0, dsp);
        }
        default:
            break;
    }

} catch (...) {
    FMOD_DSP_Release(dsp);
    FMOD_Sound_Release(sound);
    FMOD_System_Close(mSystem);
    FMOD_System_Release(mSystem);
    return error;
}

FMOD_System_Update(mSystem);

int unitplaying = 0;
while (unitplaying) {
    usleep(1000);
    FMOD_Channel_IsPlaying(channel, &unitplaying);
}
goto end;
end:
FMOD_DSP_Release(dsp);
FMOD_Sound_Release(sound);
FMOD_System_Close(mSystem);
FMOD_System_Release(mSystem);

char* pc = new char[2000];//足够长
return strcpy(pc,save_str);

}

J-Jsen commented 5 years ago

FMOD_System_SetOutput(mSystem, FMOD_OUTPUTTYPE_WAVWRITER);//保存文件格式为WAV 这样设置播放器就没有声音了,有没有传进去文件路径,然后变音处理后保存起来的方法?

lzp-coder commented 4 years ago

同求啊,变声之后的文件怎么获取到啊

djcomy commented 2 years ago

Any updates on this one? How to save a voice with effect?

rrdolaner commented 2 years ago

I still haven't been able to save file. Can anyone suggest a solution on the current project?

guoVN commented 2 years ago

怎么获取变声后的文件呀?

gbzjl commented 1 year ago

大佬 现在有获取变声后的文件的资料了么

owennguyen3162 commented 6 months ago

大佬 现在有获取变声后的文件的资料变

How ????