编程语言
首页 > 编程语言> > Android利用Fmod仿QQ变声音效,狂刷200道数据结构与算法

Android利用Fmod仿QQ变声音效,狂刷200道数据结构与算法

作者:互联网

}

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

findViewById(R.id.tv_original).setOnClickListener(this);

findViewById(R.id.tv_lolita).setOnClickListener(this);

findViewById(R.id.tv_dashu).setOnClickListener(this);

findViewById(R.id.tv_thriller).setOnClickListener(this);

findViewById(R.id.tv_gaoguai).setOnClickListener(this);

findViewById(R.id.tv_kong_ling).setOnClickListener(this);

findViewById(R.id.tv_mantuntun).setOnClickListener(this);

org.fmod.FMOD.init(this);

}

public static final String path = “file:///android_asset/el.mp3”;

@Override

public void onClick(View v) {

switch (v.getId()) {

case R.id.tv_original:

FmodUtils.play(path);

break;

case R.id.tv_lolita:

FmodUtils.changeOfVoice(path, FmodUtils.ChangeOfVoice.valueOf(“LOLITA”).getType());

break;

case R.id.tv_dashu:

FmodUtils.changeOfVoice(path, FmodUtils.ChangeOfVoice.valueOf(“DASHU”).getType());

break;

case R.id.tv_thriller:

FmodUtils.changeOfVoice(path, FmodUtils.ChangeOfVoice.valueOf(“THRILLER”).getType());

break;

case R.id.tv_gaoguai:

FmodUtils.changeOfVoice(path, FmodUtils.ChangeOfVoice.valueOf(“GAOGUAI”).getType());

break;

case R.id.tv_kong_ling:

FmodUtils.changeOfVoice(path, FmodUtils.ChangeOfVoice.valueOf(“KONG_LING”).getType());

break;

case R.id.tv_mantuntun:

FmodUtils.changeOfVoice(path, FmodUtils.ChangeOfVoice.valueOf(“MANTUNTUN”).getType());

break;

}

}

@Override

protected void onDestroy() {

super.onDestroy();

//同步FMOD的生命周期

org.fmod.FMOD.close();

}

}

FmodUtils.java:

public class FmodUtils {

enum ChangeOfVoice

{

ORIGINAL(0), //原声

LOLITA(1), //萝莉

DASHU(2), //大叔

THRILLER(3), //惊悚

GAOGUAI(4), //搞怪

KONG_LING(5), //空灵

MANTUNTUN(6); //满吞吞

int type;

ChangeOfVoice(int i) {

type = i;

}

public int getType() {

return type;

}

}

public static native void play(String path);

public static native void changeOfVoice(String path, int original);

}

extern “C”

JNIEXPORT void JNICALL

Java_com_youyangbo_fmod_FmodUtils_changeOfVoice(JNIEnv *env, jclass type, jstring path_,

jint effect_type) {

const char *path = env->GetStringUTFChars(path_, 0);

//创建对象

System *system;

System_Create(&system);

//初始化

void *extradriverdata;

system->init(32, FMOD_INIT_NORMAL, extradriverdata);

//創建一個聲音

Sound *sound;

system->createSound(path, FMOD_DEFAULT, 0, &sound);

// FMOD_RESULT F_API createDSPByType (FMOD_DSP_TYPE type, DSP **dsp);

DSP *dsp;

//播放声音

Channel *channel = 0;

system->playSound(sound, 0, false, &channel);

switch (effect_type) {

case ORIGINAL:

break;

case LOLITA:

// FMOD_DSP_TYPE_PITCHSHIFT 对音频提高八度 达到萝莉效果

system->createDSPByType(FMOD_DSP_TYPE_PITCHSHIFT, &dsp);

dsp->setParameterFloat(FMOD_DSP_PITCHSHIFT_PITCH, 2.0);

channel->addDSP(0, dsp);

break;

case DASHU:

//降低八度

system->createDSPByType(FMOD_DSP_TYPE_PITCHSHIFT, &dsp);

dsp->setParameterFloat(FMOD_DSP_PITCHSHIFT_PITCH, 0.5);

channel->addDSP(0, dsp);

break;

case THRILLER:

//声音抖动

system->createDSPByType(FMOD_DSP_TYPE_TREMOLO, &dsp);

dsp->setParameterFloat(FMOD_DSP_TREMOLO_SKEW, 0.5);

channel->addDSP(0, dsp);

break;

case GAOGUAI:

//加快声音的播放速度

float frequency;

channel->getFrequency(&frequency);

channel->setFrequency(frequency*1.5);

break;

case KONG_LING:

//添加回声

system->createDSPByType(FMOD_DSP_TYPE_ECHO, &dsp);

//声音延迟

dsp->setParameterFloat(FMOD_DSP_ECHO_DELAY, 300);

//回声次数

dsp->setParameterFloat(FMOD_DSP_ECHO_FEEDBACK, 3);

channel->addDSP(0, dsp);

break;

case MANTUNTUN:

float frequency_m;

channel->getFrequency(&frequency_m);

channel->setFrequency(frequency_m*0.8);

break;

}

system->update();

//是否播放

bool isplaying = true;

//阻塞线程

while (isplaying) {

channel->isPlaying(&isplaying);

usleep(1000*1000);

}

//释放资源

sound->release();

system->close();

system->release();

env->ReleaseStringUTFChars(path_, path);

}

介绍一下关于DSP的类型

typedef enum

{

FMOD_DSP_TYPE_UNKNOWN, // 不知类型

FMOD_DSP_TYPE_MIXER, //不需要任何输入,并将它们混合在一起

FMOD_DSP_TYPE_OSCILLATOR, //振荡器

FMOD_DSP_TYPE_LOWPASS, //低通滤波

FMOD_DSP_TYPE_ITLOWPASS, //特低通滤波

FMOD_DSP_TYPE_HIGHPASS, //高通滤波

FMOD_DSP_TYPE_ECHO, //回声

FMOD_DSP_TYPE_FADER, //衰减器

FMOD_DSP_TYPE_FLANGE, //轮缘 对声音产生法兰效应

FMOD_DSP_TYPE_DISTORTION, //扭曲

FMOD_DSP_TYPE_NORMALIZE, //归一化

FMOD_DSP_TYPE_LIMITER, //限幅器

FMOD_DSP_TYPE_PARAMEQ, //参数化

FMOD_DSP_TYPE_PITCHSHIFT, //频移

FMOD_DSP_TYPE_CHORUS, //合唱

FMOD_DSP_TYPE_VSTPLUGIN,

FMOD_DSP_TYPE_WINAMPPLUGIN, //温普拉普林

FMOD_DSP_TYPE_ITECHO, //特回声

FMOD_DSP_TYPE_COMPRESSOR, //压缩机

FMOD_DSP_TYPE_SFXREVERB, //SFX混响器

FMOD_DSP_TYPE_LOWPASS_SIMPLE, //低通简单

FMOD_DSP_TYPE_DELAY, //延迟

FMOD_DSP_TYPE_TREMOLO, //颤音

FMOD_DSP_TYPE_LADSPAPLUGIN, //拉斯帕拉金/

FMOD_DSP_TYPE_SEND,

FMOD_DSP_TYPE_RETURN,

FMOD_DSP_TYPE_HIGHPASS_SIMPLE,//高通简单

FMOD_DSP_TYPE_PAN,

FMOD_DSP_TYPE_THREE_EQ, //三重均衡器

FMOD_DSP_TYPE_FFT, //快速傅立叶变换

FMOD_DSP_TYPE_LOUDNESS_METER, //劳氏流量计

FMOD_DSP_TYPE_ENVELOPEFOLLOWER,

FMOD_DSP_TYPE_CONVOLUTIONREVERB, //卷积混响

FMOD_DSP_TYPE_CHANNELMIX, //通道混合

总结

找工作是个很辛苦的事情,而且一般周期都比较长,有时候既看个人技术,也看运气。第一次找工作,最后的结果虽然不尽如人意,不过收获远比offer大。接下来就是针对自己的不足,好好努力了。

最后为了节约大家的时间,我把我学习所用的资料和面试遇到的问题和答案都整理成了PDF文档,都可以分享给有需要的朋友,如有需要私信我【资料】或者**【点这里】免费领取**

《Android面试复习资料汇总》

喜欢文章的话请关注、点赞、转发 谢谢!

thub.com/a120464/Android-P7/blob/master/Android%E5%BC%80%E5%8F%91%E4%B8%8D%E4%BC%9A%E8%BF%99%E4%BA%9B%EF%BC%9F%E5%A6%82%E4%BD%95%E9%9D%A2%E8%AF%95%E6%8B%BF%E9%AB%98%E8%96%AA%EF%BC%81.md)免费领取**

《Android面试复习资料汇总》

喜欢文章的话请关注、点赞、转发 谢谢!

标签:QQ,200,DSP,狂刷,dsp,FMOD,FmodUtils,path,TYPE
来源: https://blog.csdn.net/m0_66264169/article/details/122788934