• 效果

相关资料:fmod官网https://www.fmod.com/download下载需要的资源库

  • 构建项目

    首先构建支持C++的android工程,将需要的c库考入工程

这里只需要inc文件下的文件就可以了,其他的cpp文件不需要

导入so库和jar

 sourceSets {main {jniLibs.srcDirs = ['libs']}}
  • 创建native方法
public class EffectUtils {//public static final int MODE_NORMAL = 0;public static final int MODE_LUOLI = 1;public static final int MODE_DASHU = 2;public static final int MODE_JINGSONG = 3;public static final int MODE_GAOGUAI = 4;public static final int MODE_KONGLING = 5;/***** @param path* @param type*/public native static void fix(String path, int type);public native static void release();static {System.loadLibrary("fmodL");System.loadLibrary("fmod");System.loadLibrary("hxg_effects");}
}
  • 生成头文件
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class org_fmod_example_nativeutils_EffectUtils */#ifndef _Included_org_fmod_example_nativeutils_EffectUtils
#define _Included_org_fmod_example_nativeutils_EffectUtils
#ifdef __cplusplus
extern "C" {#endif
#undef org_fmod_example_nativeutils_EffectUtils_MODE_NORMAL
#define org_fmod_example_nativeutils_EffectUtils_MODE_NORMAL 0L
#undef org_fmod_example_nativeutils_EffectUtils_MODE_LUOLI
#define org_fmod_example_nativeutils_EffectUtils_MODE_LUOLI 1L
#undef org_fmod_example_nativeutils_EffectUtils_MODE_DASHU
#define org_fmod_example_nativeutils_EffectUtils_MODE_DASHU 2L
#undef org_fmod_example_nativeutils_EffectUtils_MODE_JINGSONG
#define org_fmod_example_nativeutils_EffectUtils_MODE_JINGSONG 3L
#undef org_fmod_example_nativeutils_EffectUtils_MODE_GAOGUAI
#define org_fmod_example_nativeutils_EffectUtils_MODE_GAOGUAI 4L
#undef org_fmod_example_nativeutils_EffectUtils_MODE_KONGLING
#define org_fmod_example_nativeutils_EffectUtils_MODE_KONGLING 5L
/** Class:     org_fmod_example_nativeutils_EffectUtils* Method:    fix* Signature: (Ljava/lang/String;I)V*/
JNIEXPORT void JNICALL Java_org_fmod_example_nativeutils_EffectUtils_fix(JNIEnv *, jclass, jstring, jint);/** Class:     org_fmod_example_nativeutils_EffectUtils* Method:    release* Signature: ()V*/
JNIEXPORT void JNICALL Java_org_fmod_example_nativeutils_EffectUtils_release(JNIEnv *, jclass);#ifdef __cplusplus
}
#endif
#endif
  • JNI方法调用(hxg_effect.cpp)
//
// Created by yuanxx on 2019/9/17.
//#include "inc/fmod.hpp"
#include "org_fmod_example_nativeutils_EffectUtils.h"
#include <stdlib.h>
#include <unistd.h>#include <android/log.h>
#define LOGI(FORMAT,...) __android_log_print(ANDROID_LOG_INFO,"huangxiaoguo",FORMAT,##__VA_ARGS__);
#define LOGE(FORMAT,...) __android_log_print(ANDROID_LOG_ERROR,"huangxiaoguo",FORMAT,##__VA_ARGS__);#define MODE_NORMAL 0
#define MODE_LUOLI  1
#define MODE_DASHU  2
#define MODE_JINGSONG  3
#define MODE_GAOGUAI  4
#define MODE_KONGLING  5using namespace FMOD;
int lastType=10;
JNIEXPORT void JNICALL Java_org_fmod_example_nativeutils_EffectUtils_fix(JNIEnv *env, jclass jcls, jstring path_jstr, jint type){System *system;Sound *sound;Channel *channel;DSP *dsp;bool playing=true;float frequency = 0;const char* path_cstr = env->GetStringUTFChars(path_jstr,NULL);try{//初始化System_Create(&system);system->init(32, FMOD_INIT_NORMAL, NULL);//创建声音system->createSound(path_cstr, FMOD_DEFAULT, NULL, &sound);lastType=type;switch(type){case MODE_NORMAL://原生system->playSound(sound, 0, false, &channel);break;case MODE_LUOLI://萝莉//dsp -> 音效 创建fmod中预定义好的音效//FMOD_DSP_TYPE_PITCHSHIFT dsp,提升或者降低音调用的一种音效system->createDSPByType(FMOD_DSP_TYPE_PITCHSHIFT, &dsp);//设置音调的参数dsp->setParameterFloat(FMOD_DSP_PITCHSHIFT_PITCH,2.5);system->playSound(sound, 0, false, &channel);//添加到channelchannel->addDSP(0,dsp);break;case MODE_DASHU://大叔(男生)system->createDSPByType(FMOD_DSP_TYPE_PITCHSHIFT,&dsp);dsp->setParameterFloat(FMOD_DSP_PITCHSHIFT_PITCH,0.8);system->playSound(sound, 0, false, &channel);//添加到channelchannel->addDSP(0,dsp);break;case MODE_JINGSONG://惊悚system->createDSPByType(FMOD_DSP_TYPE_TREMOLO,&dsp);dsp->setParameterFloat(FMOD_DSP_TREMOLO_SKEW, 0.5);system->playSound(sound, 0, false, &channel);channel->addDSP(0,dsp);break;case MODE_GAOGUAI://搞怪//提高说话的速度system->playSound(sound, 0, false, &channel);channel->getFrequency(&frequency);frequency = frequency * 1.6;channel->setFrequency(frequency);break;case MODE_KONGLING://空灵system->createDSPByType(FMOD_DSP_TYPE_ECHO,&dsp);dsp->setParameterFloat(FMOD_DSP_ECHO_DELAY,300);dsp->setParameterFloat(FMOD_DSP_ECHO_FEEDBACK,20);system->playSound(sound, 0, false, &channel);channel->addDSP(0,dsp);break;}}catch (...) {LOGE("%s","发生异常");goto end;}system->update();//每秒钟判断下是否在播放while(playing){if(lastType!=type){break;}channel->isPlaying(&playing);//单位是微秒usleep(1000 * 1000);}goto end;end:env->ReleaseStringUTFChars(path_jstr,path_cstr);sound->release();system->close();system->release();
}
JNIEXPORT void JNICALL Java_org_fmod_example_nativeutils_EffectUtils_release(JNIEnv *env, jclass jcls){lastType=10;
}
  • 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.4.1)# Creates and names a library, sets it as either STATIC
# or SHARED, and provides the relative paths to its source code.
# You can define multiple libraries, and CMake builds them for you.
# Gradle automatically packages shared libraries with your APK.find_library( log-liblog )set(my_lib_path ${CMAKE_SOURCE_DIR}/libs)# 添加三方的so库
add_library(libfmodSHAREDIMPORTED )
# 指名第三方库的绝对路径
set_target_properties( libfmodPROPERTIES IMPORTED_LOCATION${my_lib_path}/${ANDROID_ABI}/libfmod.so )
# 添加三方的so库
add_library(libfmodLSHAREDIMPORTED )# 指名第三方库的绝对路径
set_target_properties( libfmodLPROPERTIES IMPORTED_LOCATION${my_lib_path}/${ANDROID_ABI}/libfmodL.so )set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11")# 添加我们需要写代码的路径,这是播放音频库
add_library(hxg_voicerSHAREDsrc/main/cpp/common.cppsrc/main/cpp/common_platform.cppsrc/main/cpp/play_sound.cpp )# 添加我们需要写代码的路径,这是声音特效
add_library(hxg_effectsSHAREDsrc/main/cpp/hxg_effect.cpp )# 导入路径,为了让编译时能够寻找到这个文件夹
include_directories(src/main/cpp/inc)# 链接好三个路径
target_link_libraries( hxg_voicerlibfmodlibfmodL${log-lib} )
target_link_libraries( hxg_effectslibfmodlibfmodL${log-lib} )
  • 添加NDK支持平台
defaultConfig {...........externalNativeBuild {cmake {cppFlags ""abiFilters "armeabi-v7a", "arm64-v8a", "x86", "x86_64"}}}
  • 实现变音效果
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;import org.fmod.FMOD;
import org.fmod.example.nativeutils.EffectUtils;import java.io.File;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class Main2Activity extends AppCompatActivity {private ExecutorService cachedThreadPool ;private String mPath;int mMode = EffectUtils.MODE_NORMAL;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);FMOD.init(this);setContentView(R.layout.activity_main2);if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {String[] perms = {"android.permission.RECORD_AUDIO", "android.permission.WRITE_EXTERNAL_STORAGE"};if (checkSelfPermission(perms[0]) == PackageManager.PERMISSION_DENIED ||checkSelfPermission(perms[1]) == PackageManager.PERMISSION_DENIED) {requestPermissions(perms, 200);}}mPath = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separatorChar + "111.mp3";cachedThreadPool  = Executors.newCachedThreadPool();}public void mFix(View view) {switch (view.getId()) {case R.id.btn_record://原声Log.e("huangxiaoguo","--------原声---------");mMode = EffectUtils.MODE_NORMAL;cachedThreadPool .execute(mRunnable);break;case R.id.btn_luoli://萝莉Log.e("huangxiaoguo","-------萝莉----------");mMode = EffectUtils.MODE_LUOLI;cachedThreadPool .execute(mRunnable);break;case R.id.btn_dashu://大叔Log.e("huangxiaoguo","----------惊悚-------");mMode = EffectUtils.MODE_DASHU;cachedThreadPool .execute(mRunnable);break;case R.id.btn_jingsong://惊悚mMode = EffectUtils.MODE_JINGSONG;cachedThreadPool .execute(mRunnable);break;case R.id.btn_gaoguai://搞怪Log.e("huangxiaoguo","-----------搞怪------");mMode = EffectUtils.MODE_GAOGUAI;cachedThreadPool .execute(mRunnable);break;case R.id.btn_kongling://空灵Log.e("huangxiaoguo","--------空灵---------");mMode = EffectUtils.MODE_KONGLING;cachedThreadPool .execute(mRunnable);break;}}public void stop(View view){Log.e("huangxiaoguo","--------暂停---------");EffectUtils.release();}private Runnable mRunnable = new Runnable() {@Overridepublic void run() {if (cachedThreadPool .isShutdown()) {return;}EffectUtils.fix(mPath, mMode);}};@Overrideprotected void onDestroy() {super.onDestroy();if (cachedThreadPool  != null && !cachedThreadPool .isShutdown()&& !cachedThreadPool .isTerminated()) {cachedThreadPool .shutdownNow();}FMOD.close();}
}

Demo地址:https://pan.baidu.com/s/1-JNR-66g0CPuTMa96Ms4dw

NDK开发(四):仿QQ变声相关推荐

  1. 自学体验使用fmod 以及 仿QQ变声 fmod

    模块一 体验使用fmod 到 https://www.fmod.com/download 上下载fmod android版本的 这里我们用的是别人生成的so库 libfmod.so库 libfmodL ...

  2. 仿QQ变声功能的实现

    Android ndk开发之QQ变声 要做出QQ变声的效果,用Android系统自带的MediaPlayer是无法实现的,只能另想他法了.听说汤姆猫是用SoundTouch实现的,而QQ是用FMOD实 ...

  3. android fmod,Android利用Fmod仿QQ变声音效

    看到QQ一些变声音效,这些声音效果可以采用SoundTouch,Fmod去处理.这篇文章我们用Fmod去实现变声音效的处理.fmod官网https://www.fmod.com/,fmod Ex 声音 ...

  4. NDK开发—仿QQ变声器

    1.实现功能前的准备 这是我学习NDK的一个练手项目.虽然最后实现的结果并不是非常专业,但是确实能改变声音的音色,这是非常适合NDK新手的项目. 1.1.主要原理 通过修改声音的属性来实现声音音色的变 ...

  5. NDK开发——Android Studio+CMake实现QQ变声效果

    项目演示 Github:https://github.com/AndroidHensen/NDKVoice 项目分析 项目采用Fmod开源库,一个非常简单通用的音频引擎,对原始声音进行音效的处理即可做 ...

  6. Android NDK开发之旅25 NDK 模仿QQ变声特效

    ###前言 我们这次用到的是fmod这个库,fmod是音效引擎游戏开发革命引擎,著名的游戏开发引擎CosCos2D.U3D都封装了这个库. 学习NDK的目的就是为了让我们的APP能够使用C/C++开源 ...

  7. Android 开发之 QQ变声功能实现

    1.简介 在QQ中我们使用到的一个功能就是变声,QQ是使用FMOD实现的,那么同样的我们也使用FMOD让自己的应用可以变音 2.FMOD简介 fmod Ex 声音系统是为游戏开发者准备的革命性音频引擎 ...

  8. java gui界面设计qq_Java swing界面开发(仿QQ登录界面)

    首先引入包的概念,包:给代码分类,提高的了代码的可读性,封装后方便管理.在包中类的引入:import 包名.类名;包名需小写,多单词用"."隔开.类名的命名规范:首字母大写其后的每 ...

  9. 音视频开发之旅(五) -----变声 FMOD和soundTouch使用和对比

    1前言 这边先穿插一下变声相关的知识 ,这一章主要讲音频的处理.大家应该也接触过这类应用,比如QQ的变声,或者在游戏直播里,一些主播使用的变速器,那么,到底是如何做到这样的效果呢?这一篇文章将会给大家 ...

最新文章

  1. IntelliJ IDEA16 热部署,解决每次修改java文件就得重启tomcat的问题
  2. mysql json坑_使用mysql innodb 使用5.7的json类型遇到的坑和解决办法
  3. java statement 返回类型,6.3 返回类型和返回语句 | Return type Return statement
  4. 修改Tomcat端口号
  5. java ftp 连接超时时间_ftpClient的连接超时设置(setConnectTimeout,setSoTimeout) | 学步园...
  6. editorloop 占用_速度控制 部分重复 语言学习软件 Loopman
  7. 【POJ 1151】Atlantis
  8. nodejs安装_nodejs调试全局安装的cli脚本
  9. hive使用适用场景_Hive 中 Map Join 的适用场景:非等值连接
  10. sqlserver200864位下载_Microsoft SQL Server 2008 R2 官方简体中文正式版下载
  11. 【唐宇迪】opencv实战学习
  12. 背景动态星空H5特效源代码
  13. iphone 计算机找不到了,电脑找不到苹果手机热点
  14. Python在大数据处理中的实践运用,实践操作精选
  15. 攻防世界CTF —— PHP本地文件包含漏洞解题思路
  16. jieba的简单使用
  17. Java 课程设计--数据库管理系统
  18. 学习FPGA之一:初识FPGA
  19. 【leetcode】P110平衡二叉树的判断
  20. windows共享文件夹报错:登录失败: 禁用当前的账户 解决办法

热门文章

  1. 做什么网站挣钱,这几种类型的网站可能适合你!
  2. UnsupportedOperationException; ImmutableCollections.uoe
  3. 麦克斯韦方程组的组成由来、媒介的电磁性质和边界条件
  4. 手机app客户端软件制作成本
  5. IntelliJ Idea -- 自动引包设置
  6. 《满城黄金甲》另类观后感
  7. springCloud运行主类,错误: 找不到或无法加载主类 com.kuang.springcloud.DeptConsumer_80
  8. Android~快捷方式兼容适配
  9. iOS开发之加载、滑动翻阅大量图片优化解决方案
  10. 诺贝尔奖大数据告诉你:最聪明的星座是谁