FMODIOS icon indicating copy to clipboard operation
FMODIOS copied to clipboard

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

Open install-b opened this issue 6 years ago • 11 comments

如题

install-b avatar Sep 07 '18 12:09 install-b

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

zhaochengfeng avatar Sep 08 '18 05:09 zhaochengfeng

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

install-b avatar Sep 08 '18 06:09 install-b

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

zhaochengfeng avatar Sep 10 '18 02:09 zhaochengfeng

我仿照 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);

}

MaoNan avatar Dec 27 '18 12:12 MaoNan

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

J-Jsen avatar Apr 25 '19 10:04 J-Jsen

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

lzp-coder avatar Aug 18 '20 06:08 lzp-coder

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

djcomy avatar Oct 18 '21 14:10 djcomy

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

rrdolaner avatar Jan 30 '22 12:01 rrdolaner

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

guoVN avatar May 19 '22 11:05 guoVN

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

gbzjl avatar Mar 15 '23 02:03 gbzjl

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

How ????

owennguyen3162 avatar Mar 27 '24 09:03 owennguyen3162