一、下载fmod库

二、创建项目(Android Studio)

三、配置项目

四、DEMO开发

五、最后介绍一下 变音参数DPS的类型

image.png

image.png

image.png

解压完会有4个文件夹,api中是我们所需要用到的

image.png

二、创建项目(Android Studio 版本号 3.5)

1、安装NDK与CMake

image.png

2、创建项目

新建项目,输入项目名称,勾选包含支持c++

image.png

点下一步,直到下面的页面,选择 c++11

image.png

最后 finish

三、项目配置

1、拷贝Lib

image.png

image.png

一定要记得 fmod.jar 右击add

2、拷贝 c库类到 cpp下,如果是选择创建C++库时 会自动在main下面创建出cpp文件夹

image.png

image.png

里边的 changedvoice.cpp 是自己创建的cpp文件,是对声音的改变 。

image.png

主要变音参数都在这里进行参数配置

除了这个文件 还需要一个VoiceTools.h文件 (对C++不是很会,这样做的目的不是很清楚,先照猫画虎的弄上先)

/* DO NOT EDIT THIS FILE - it is machine generated */

#include "../../../../../../../Library/Android/sdk/ndk-bundle/sysroot/usr/include/jni.h"

/* Header for class com_mg_axechen_changevoice_VoiceTools */

#ifndef _Included_com_syido_fmoddemo_changevoice_VoiceTools

#define _Included_com_syido_fmoddemo_changevoice_VoiceTools

#ifdef __cplusplus

extern "C" {

#endif

extern "C" JNIEXPORT void JNICALL Java_com_syido_fmoddemo_changevoice_VoiceTools_changeVoice

(JNIEnv *, jclass, jstring,jint);

#ifdef __cplusplus

}

#endif

#endif

以上两个文件一定要注意 包名与路径名的对应,否则在调用时无法找到方法(JNI基础)

JNIEXPORT void JNICALL Java_com_syido_fmoddemo_changevoice_VoiceTools_changeVoice

代表 changeVoice方法所在类的路径

image.png

3、配置gradle文件 主要就是对cmake的配置。只有它配置对了,NDK才可以正常使用changeVoice.cpp才能正确编译。具体百度CMAKE为何物。

image.png

配置完gradle,回来配置cmake,如果在SDK Tools中正确安装了cmake 会在目录下生成cmake.txt文件。将如下 内容添进去,自己调整当中涉及到的路径

# For more information about using CMake with Android Studio, read the

# documentation: https://d.android.com/studio/projects/add-native-code.html

# Sets the minimum version of CMake required to build the native library.

cmake_minimum_required(VERSION 3.4.1)

find_library( log-lib

log )

set(my_lib_path ${CMAKE_SOURCE_DIR}/libs)

# 添加三方的so库

add_library(libfmod

SHARED

IMPORTED )

# 指名第三方库的绝对路径

set_target_properties( libfmod

PROPERTIES IMPORTED_LOCATION

${my_lib_path}/${ANDROID_ABI}/libfmod.so )

add_library(libfmodL

SHARED

IMPORTED )

set_target_properties( libfmodL

PROPERTIES IMPORTED_LOCATION

${my_lib_path}/${ANDROID_ABI}/libfmodL.so )

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11")

# 添加我们需要写代码的路径

add_library(changeVoice

SHARED

src/main/cpp/changeVoice.cpp )

# 导入路径,为了让编译时能够寻找到这个文件夹

include_directories(src/main/cpp/inc)

# 链接好三个路径

target_link_libraries( changeVoice

libfmod

libfmodL

${log-lib} )

四、DEMO开发

1、创建JAVA变音工具类,添加加载动态库代码,添加native方法。

/**

* Created by Wilbur on 2020/02/18

*/

public class VoiceTools {

public static final int BAIDU_BOY = 19;

public static final int BAIDU_GIRL = 18;

public static final int BAIDU_MENGMEI = 20;

public static final int BAIDU_XIAOGEGE = 21;

public static final int MODE_BOY = 8;

public static final int MODE_CHORUS = 15;

public static final int MODE_CLASSROOM = 10;

public static final int MODE_CUSTOM = 9;

public static final int MODE_DASHU = 2;

public static final int MODE_DISTORTION = 16;

public static final int MODE_GAOGUAI = 4;

public static final int MODE_HALL = 7;

public static final int MODE_JINGSONG = 3;

public static final int MODE_KONGLING = 5;

public static final int MODE_LIVEPERFORMANCE = 12;

public static final int MODE_LUOLI = 1;

public static final int MODE_MACHINE = 17;

public static final int MODE_MINIONS = 13;

public static final int MODE_NORMAL = 0;

public static final int MODE_NVSHENG = 11;

public static final int MODE_SLOWLY = 14;

public static final int MODE_VALLEY = 6;

public static native void changeVoice(String path, int mode);

static {

System.loadLibrary("changeVoice");

System.loadLibrary("fmod");

System.loadLibrary("fmodL");

}

}

使用方法

public void startChange(View view) {

String path = Environment.getExternalStorageDirectory().getPath()+ File.separator+"voice.wav";

Log.i("getPath",path);

File file = new File(path);

if (!file.exists()) {

Log.e("Main", "没有文件");

return;

}

switch (view.getId()) {

// 普通

case R.id.btn_normal:

VoiceTools.changeVoice(path, VoiceTools.MODE_NORMAL);

break;

// 萝莉

case R.id.btn_luoli:

VoiceTools.changeVoice(path, VoiceTools.MODE_LUOLI);

break;

// 大叔

case R.id.btn_dashu:

VoiceTools.changeVoice(path, VoiceTools.MODE_DASHU);

break;

// 惊悚

case R.id.btn_jingsong:

VoiceTools.changeVoice(path, VoiceTools.MODE_JINGSONG);

break;

// 搞怪

case R.id.btn_gaoguai:

VoiceTools.changeVoice(path, VoiceTools.MODE_GAOGUAI);

break;

// 空灵

case R.id.btn_kongling:

VoiceTools.changeVoice(path, VoiceTools.MODE_KONGLING);

break;

// 山谷

case R.id.btn_shangu:

VoiceTools.changeVoice(path, VoiceTools.MODE_VALLEY);

break;

// 大堂

case R.id.btn_datang:

VoiceTools.changeVoice(path, VoiceTools.MODE_HALL);

break;

// 男生

case R.id.btn_nansheng:

VoiceTools.changeVoice(path, VoiceTools.MODE_BOY);

break;

五、最后介绍一下 变音参数DPS的类型

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, //通道混合

FMOD_DSP_TYPE_TRANSCEIVER,

FMOD_DSP_TYPE_OBJECTPAN,

FMOD_DSP_TYPE_MULTIBAND_EQ, //多频带EQ

FMOD_DSP_TYPE_MAX,

FMOD_DSP_TYPE_FORCEINT = 65536 /* Makes sure this enum is signed 32bit. */

} FMOD_DSP_TYPE;

......DEMO 稍后上传

Android变调代码,Android 之 Fmod 变音的实现相关推荐

  1. android 共享代码,Android团队成员间的代码共享!(Git+Github版)

    原创,转载请说明出处. 一. 这篇文章要解决什么问题,能学习到什么? 在android团队的开发中,少不了与队员之间的合作.为了避免我们傻瓜式地复制粘贴对方的负责的那部分功能代码,我们可以用svn或者 ...

  2. 名片夹android布局代码,Android自定义布局实现仿qq侧滑部分代码

    自定义布局实现仿qq侧滑部分Android代码,供大家参考,具体内容如下 实现说明: 通过自定义布局实现: SlidingLayout继承于 HorizontalScrollView /** * Cr ...

  3. 获取android型号代码,Android应用开发之Android获取手机品牌、手机型号、手机唯一序列号的代码教程...

    本文将带你了解Android应用开发Android获取手机品牌.手机型号.手机唯一序列号的代码教程,希望本文对大家学Android有所帮助. Android获取手机品牌.手机型号.手机唯一序列号的代码 ...

  4. android gravity 代码,android:layout_gravity和android:gravity属性的区别

    android:gravity / android:layout_gravity区别: android:gravity 是设置该view类里面的内容相对于该view的位置,例如设置button里面的t ...

  5. android扔骰子代码,Android实现掷骰子效果

    本文实例为大家分享了android实现掷骰子效果的具体代码,供大家参考,具体内容如下 利用handler接受子线程的消息完成骰子点数的不断更替 演示 start:开始游戏 stop:停止游戏 reco ...

  6. android滴滴打车代码,Android 端滴滴打车接口的开发

    前两天做了一个对Android端'滴滴打车'的接口开发吧! 今天来做个简单的流程, 滴滴会提供这样一个接口, http://webapp.diditaxi.com.cn/? maptype=wgs&a ...

  7. android linearlayout 代码,Android如何从代码向另一个LinearLayout添加Linearlayout

    我在main.xml中有一个LinearLayout: android:layout_width="match_parent" android:layout_height=&quo ...

  8. android下单代码,Android实现微信支付的统一下单

    本文实例为大家分享了Android实现微信支付统一下单的具体代码,供大家参考,具体内容如下 准备工作 申请微信开发者账号,添加应用及申请开通微信支付功能,如 查看开通流程 统一下单的接口文档: 查看接 ...

  9. android内存代码,Android内存优化(五) Lint代码扫描工具

    1.使用 工具栏 -> Analyze -> Inspect Code- 点击 Inspect Code 后会弹出检查范围的对话框: 默认是检查整个项目,我们可以点击 Custom sco ...

最新文章

  1. 四川大学c语言期末试题答案,四川大学计算机学院2005级C语言程序设计试卷(2份,有答案)...
  2. scala入门--快学scala第一章练习题
  3. vmware16 unlocker解锁以安装macos系统
  4. 利用python开发购物车系统
  5. 土方工程量计算表格excel_工程造价算量表+工程量软件,超多表格可套用,高清下载...
  6. Linux两种方式rd.break和init重置root管理员密码
  7. javascript 关键字this
  8. 日期和时间的正则表达式
  9. 五金工具客服快捷回复消息_公众号的自动回复,这样用就能零流失!
  10. XML学习总结(一)——XML介绍
  11. 实现xml和json接口(第一篇)
  12. 画PCB四层板细节总结
  13. 超市网店营销与接口测试
  14. 20210327-第一次java笔记
  15. css动画transition和animation实现遮罩动画
  16. 企业电子邮箱怎么申请免费注册账号?
  17. FIL能涨到多少?2021FIL价格预测
  18. 实践练习一(必选):OceanBase Docker 体验(小麦苗版)
  19. windows10文件资源管理器打开时显示此电脑
  20. boxplot 箱线图剔除离群值

热门文章

  1. C++ 牛客网做题笔记【500题总结】
  2. Android引导用户打开应用市场评分自己的app
  3. smo算法matlab实现,SVM之序列最小最优化算法(SMO算法)
  4. CSS布局 通栏平均分布型
  5. python中 对于java的或和and符号
  6. Qt 5.15.2 QTextEdit无法设置新字体的处理方式
  7. 比较实用的注册表实用工具
  8. vue 基于MediaRecorder+canvas实现视频录屏
  9. Echarts 饼图,legend样式美化
  10. 10 个提供免费域名搜索建议服务的网站