Android基于Fmod实现变音

背景

先看两个场景:

在这里插入图片描述
在这里插入图片描述
怎么做到的?我也想装一波
在这里插入图片描述

今天带小伙伴们了解一下如何做到上面的效果。

fmod介绍

古人有云:视频界有ffmpeg,音频界有fmod。

下面的游戏大家伙可以看看,有没有眼熟的:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
我随便截了几张图,有兴趣的可以到Fmod官网去具体了解。
怎么样有没有兴趣搞点有意思的玩玩,音频引擎已经有了。

我这边在调音编辑器里玩了一会,但是调音水平有限,不过多介绍了,有兴趣的自己down下来玩儿。
在这里插入图片描述
废话不多说,准备干活

第一步 先下载Android平台的引擎

在这里插入图片描述

第二步 下载后需要的文件:

在这里插入图片描述

.hpp是什么
.hpp,本质就是将.cpp的实现代码混入.h头文件当中,定义与实现都包含在同一文件,则该类的调用者只需要include该.hpp文件即可,无需再将cpp加入到project中进行编译。而实现代码将直接编译到调用者的obj文件中,不再生成单独的obj,采用hpp将大幅度减少调用project中的cpp文件数与编译次数,也不用再发布lib与dll文件,因此非常适合用来编写公用的开源库。
hpp的优点不少,但是编写中有以下几点要注意:
1、是Header Plus Plus的简写。(.h和.hpp就如同.c和.cpp似的)
2、与.h类似,.hpp是C++程序头文件格式。
3、是VCL专用的头文件,已预编译。
4、是一般模板类的头文件。
5、一般来说,.h里面只有声明,没有实现,而.hpp里声明实现都有,后者可以减少.cpp的数量。
6、.h里面可以有using namespace std,而.hpp里则无。
7、不可包含全局对象和全局函数。

新建项目并部署C/C++库步骤

第一步 新建Native Project

在这里插入图片描述
然后一路next 完事儿。

但是在运行的时候遇到了一个插曲(环境问题,可以忽略),仅做记录,各位看官大佬可以忽略。
  • AS环境为最新版白狐
  • AGP为最新版7.0.2
    要求JDK为java 11,但是我主项目必须配置为jdk1.8,AS本身自带的就是java11所以我没有另外下载,而是直接在app的build.gradle里面
//app的build.gradle中android闭包下修改为
    compileOptions {
   
        sourceCompatibility JavaVersion.VERSION_11
        targetCompatibility JavaVersion.VERSION_11
    }

结果无效,不想折腾了所以降低agp版本,解决首次编译问题
如果有大佬操作过不同项目配置不同jdk版本和环境变量的请不吝赐教。

最终可运行的项目如下

在这里插入图片描述

Cmake导入库流程

前置知识

CMake是什么?
一个跨平台构建系统

add_library 指令
语法:add_library(libname [SHARED | STATIC | MODULE] [EXCLUDE_FROM_ALL] [source])
将一组源文件 source 编译出一个库文件,并保存为 libname.so (lib 前缀是生成文件时 CMake自动添加上去的)。其中有三种库文件类型,不写的话,默认为 STATIC:

  • SHARED: 表示动态库,可以在(Java)代码中使用 System.loadLibrary(name) 动态调用;
  • STATIC: 表示静态库,集成到代码中会在编译时调用;
  • MODULE: 只有在使用 dyId 的系统有效,如果不支持 dyId,则被当作 SHARED 对待;
  • EXCLUDE_FROM_ALL: 表示这个库不被默认构建,除非其他组件依赖或手工构建

target_link_libraries 指令
语法:target_link_libraries(target library <debug | optimized> library2…)
这个指令可以用来为 target 添加需要的链接的共享库,同样也可以用于为自己编写的共享库添加共享库链接。

#指定 compress 工程需要用到 libjpeg 库和 log 库
target_link_libraries(compress libjpeg ${
   log-lib})
第一步 导入头文件并声明

将上面提到的Fmod引擎Android平台的inc文件夹拷贝到项目的cpp文件下。并声明之:

//CMakeLists.txt
# 声明导入的头文件(以cpp文件夹为~)
include_directories("inc")
第二步 为了以后拓展,修改c文件引入形式(可忽略)
//CMakeLists.txt
# 批量导入所有源文件
file(GLOB allCPP *.c *.h *.cpp)

add_library(
             voicechangeapp
             SHARED
            ${
   allCPP}
        )
第三步 导入fmod库文件并配置

将上面提到的Fmod引擎Android平台的lib文件夹下面的arm64-v8a(armeabi、armeabi-v7a、x86等)放到src/main/jniLibs文件夹下。并在CMakeList.txt中新增配置

//CMakeLists.txt
set(CMAKE_CXX_FLAGS "${
     CMAKE_CXX_FLAGS} -L${
     CMAKE_SOURCE_DIR}/../jniLibs/${
     CMAKE_ANDROID_ARCH_ABI}")

target_link_libraries( # Specifies the target library.
        voicechangeapp
        log
        fmod
        fmodL
        )

最终CMakeLists.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.10.2)

# 声明导入的头文件(以cpp文件夹为~)
include_directories("inc")
# 批量导入所有源文件
file(GLOB allCPP *.c *</
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Alex_ChuTT

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值