01.fmod实例程序的使用

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库。而这里只导入了armeabix86的so文件,那么在编译其他的平台的so时,将找不到其他平台so文件而报错。因此需要在build.gradle中配置ndk{ }

如果不在build.gradle中配置ndk{ },那么就需要导入所有平台的so库。

在这个例子中只导入了armeabix86的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

猜你喜欢

转载自blog.csdn.net/a_thousand_miles/article/details/81150906