Android 之 Fmod 变音的实现
一、下载fmod库
二、创建项目(Android Studio)
三、配置项目
四、DEMO开发
五、最后介绍一下 变音参数DPS的类型
image.png image.png image.png一、下载fmod库:官网地址:https://www.fmod.com/
解压完会有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 稍后上传