Android变调代码,Android 之 Fmod 变音的实现

一、下载fmod库

二、创建项目(Android Studio)

三、配置项目

四、DEMO开发

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

dcb24add2558

image.png

dcb24add2558

image.png

dcb24add2558

image.png

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

dcb24add2558

image.png

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

1、安装NDK与CMake

dcb24add2558

image.png

2、创建项目

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

dcb24add2558

image.png

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

dcb24add2558

image.png

最后 finish

三、项目配置

1、拷贝Lib

dcb24add2558

image.png

dcb24add2558

image.png

一定要记得 fmod.jar 右击add

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

dcb24add2558

image.png

dcb24add2558

image.png

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

dcb24add2558

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方法所在类的路径

dcb24add2558

image.png

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

dcb24add2558

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 稍后上传

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值