Android变调代码,Android 之 Fmod 变音的实现
一、下载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 变音的实现相关推荐
- android 共享代码,Android团队成员间的代码共享!(Git+Github版)
原创,转载请说明出处. 一. 这篇文章要解决什么问题,能学习到什么? 在android团队的开发中,少不了与队员之间的合作.为了避免我们傻瓜式地复制粘贴对方的负责的那部分功能代码,我们可以用svn或者 ...
- 名片夹android布局代码,Android自定义布局实现仿qq侧滑部分代码
自定义布局实现仿qq侧滑部分Android代码,供大家参考,具体内容如下 实现说明: 通过自定义布局实现: SlidingLayout继承于 HorizontalScrollView /** * Cr ...
- 获取android型号代码,Android应用开发之Android获取手机品牌、手机型号、手机唯一序列号的代码教程...
本文将带你了解Android应用开发Android获取手机品牌.手机型号.手机唯一序列号的代码教程,希望本文对大家学Android有所帮助. Android获取手机品牌.手机型号.手机唯一序列号的代码 ...
- android gravity 代码,android:layout_gravity和android:gravity属性的区别
android:gravity / android:layout_gravity区别: android:gravity 是设置该view类里面的内容相对于该view的位置,例如设置button里面的t ...
- android扔骰子代码,Android实现掷骰子效果
本文实例为大家分享了android实现掷骰子效果的具体代码,供大家参考,具体内容如下 利用handler接受子线程的消息完成骰子点数的不断更替 演示 start:开始游戏 stop:停止游戏 reco ...
- android滴滴打车代码,Android 端滴滴打车接口的开发
前两天做了一个对Android端'滴滴打车'的接口开发吧! 今天来做个简单的流程, 滴滴会提供这样一个接口, http://webapp.diditaxi.com.cn/? maptype=wgs&a ...
- android linearlayout 代码,Android如何从代码向另一个LinearLayout添加Linearlayout
我在main.xml中有一个LinearLayout: android:layout_width="match_parent" android:layout_height=&quo ...
- android下单代码,Android实现微信支付的统一下单
本文实例为大家分享了Android实现微信支付统一下单的具体代码,供大家参考,具体内容如下 准备工作 申请微信开发者账号,添加应用及申请开通微信支付功能,如 查看开通流程 统一下单的接口文档: 查看接 ...
- android内存代码,Android内存优化(五) Lint代码扫描工具
1.使用 工具栏 -> Analyze -> Inspect Code- 点击 Inspect Code 后会弹出检查范围的对话框: 默认是检查整个项目,我们可以点击 Custom sco ...
最新文章
- 四川大学c语言期末试题答案,四川大学计算机学院2005级C语言程序设计试卷(2份,有答案)...
- scala入门--快学scala第一章练习题
- vmware16 unlocker解锁以安装macos系统
- 利用python开发购物车系统
- 土方工程量计算表格excel_工程造价算量表+工程量软件,超多表格可套用,高清下载...
- Linux两种方式rd.break和init重置root管理员密码
- javascript 关键字this
- 日期和时间的正则表达式
- 五金工具客服快捷回复消息_公众号的自动回复,这样用就能零流失!
- XML学习总结(一)——XML介绍
- 实现xml和json接口(第一篇)
- 画PCB四层板细节总结
- 超市网店营销与接口测试
- 20210327-第一次java笔记
- css动画transition和animation实现遮罩动画
- 企业电子邮箱怎么申请免费注册账号?
- FIL能涨到多少?2021FIL价格预测
- 实践练习一(必选):OceanBase Docker 体验(小麦苗版)
- windows10文件资源管理器打开时显示此电脑
- boxplot 箱线图剔除离群值