fmod介绍
fmod是一款关于变声的非常优秀的c/c++库,比如将声音变声成萝莉,大叔,空灵等。对于一些变声器如QQ变声,会说话的tom猫等都可以使用这个开源库实现。
目标
将fmod中的实例java代码运行在Android项目中,Android开发工具为android studio.
下载
下载网站 https://www.fmod.com/download 需要注册,注册用QQ邮箱就能注册,注册后下载相应版本就行。
将下载包解压.
解压下载的压缩包。然后找到如下路径:api/lowlevel
里面有三个文件夹:
* examples:示例代码
* inc:源文件
* lib:打包好的so动态库和jar
新建项目
新建Android项目,添加支持c++,Android studio默认使用的cmake编译c++。最好项目的包名为
org.fmod.example,避免后面拷贝java类下的MainActivity.java再该包名。
将lowlevel下的文件到项目中
1.将lib目录下的armeabi和x86目录下的fmod.so和fmodL.so,以及fmod.jar复制到项目的libs目录下.
2.将inc目录及其目录下的所有文件复制到cpp目录下
3.将play_sound.cpp common.h common.cpp common_platform.h common_platform.cpp 这几个文件拷贝到cpp目录下.
4.将example的java目录下的MainActivity.java拷贝到项目的包下.
5.将example的media文件下的drumloop.wav jaguar.wav swish.wav 拷贝到项目的assets目录下,如果新建项目中找不到这个目录则在main目录下新建一个assets文件夹.
复制完成之后可以看到项目中的结构如下.
修改.c文件
修改拷贝后的common.cpp这几个cpp文件的引用,将头部引用报错的.h改为
#include "inc/fmod_errors.h"
修改 Builde.gradle 和 CMakeLists.txt
这一步是最重要的,只是拷贝过来文件,还要进行相关的配置,需要修改这两个文件,
修改Builde.gradle
1、假如build.gradle
中没有配置ndk{ }
。那么当编译器在编译的时候将会编译所有平台的so库。而这里只导入了armeabi
和x86
的so文件,那么在编译其他的平台的so时,将找不到其他平台so文件而报错。因此需要在build.gradle
中配置ndk{ }
。
如果不在build.gradle
中配置ndk{ }
,那么就需要导入所有平台的so库。
在这个例子中只导入了armeabi
和x86
的so文件,如果直接编译将会报错。所以要在build.gradle
添加如下代码:
ndk {
abiFilters "armeabi","x86"
}
2.这里将so文件配置在了libs文件夹下,因此要在build.gradle
中配置:
sourceSets.main {
jniLibs.srcDirs = ['libs']
jni.srcDirs = []
}
添加后的build.gradle的代码如下.
android {
compileSdkVersion 26
buildToolsVersion "27.0.3"
defaultConfig {
applicationId "org.fmod.example"
minSdkVersion 15
targetSdkVersion 26
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
externalNativeBuild {
cmake {
cppFlags ""
}
}
// 编译平台
ndk {
abiFilters "armeabi","x86"
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
externalNativeBuild {
cmake {
path "CMakeLists.txt"
}
}
//目录
sourceSets.main {
jniLibs.srcDirs = ['libs']
jni.srcDirs = []
}
}
修改CMakeLists.txt
配置CMakeLists的时候要仔细配置,不要将路径写错。
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")
# 添加我们需要编译的cpp的路径
add_library(changeVoice
SHARED
src/main/cpp/play_sound.cpp src/main/cpp/common.cpp src/main/cpp/common_platform.cpp)
# 导入路径,为了让编译时能够寻找到这个文件夹
include_directories(src/main/cpp/inc)
# 链接好三个路径
target_link_libraries( changeVoice
libfmod
libfmodL
${log-lib} )
修改MainAcitvity.java
1.给项目添加权限
android.permission.RECORD_AUDIO
android.permission.WRITE_EXTERNAL_STORAGE
在这个文件的最后加载几个库,我们让加载自己的
static
{
System.loadLibrary("fmodL");
System.loadLibrary("fmod");
System.loadLibrary("changeVoice");
}
大功告成
这时build project,会发现没有报错,运行项目。可以看到软件如图所示.
感觉非常开心!
特别感谢这个博客https://blog.csdn.net/u011094054/article/details/79194978