说起QQ变声效果大家并不陌生,这是用的啥技术呢?其实它使用到了fmod的东西,现在我们就来研究一下变声技术
QQ截图20171102222041.pngfmod 官网:https://www.fmod.com/studio
是不是很炫,以前想都不敢想能实现这效果,现在就能实现了,来代码搞起。。
这里呢,我们先来搭建一下QQ变声效果的开发环境做一个播放声音的进而开发变声效果。
正文
image先进入官网去下载Android的开发包,如图,我们接下来就搞这个目录里面的东西,因为是刚上手当然是低级别的,哈哈
image我们来说一下这三个目录是啥东西,example是开发的示例文件,inc是需要引入的.h文件,lib是需要加入的jar包
好,现在我们做的仅仅是先将声音播放出来,变不变声先不管,开发环境是Eclipse,之后会介绍AS的开发步骤
进入example目录找到play_sound.cpp、inc目录导入Eclipse jni目录,play_sound.cpp需要包含common.h(因为fmod.hpp是inc里面的只需要指定一下就可以)
image为什么还有hpp格式的文件呢?是因为在hpp格式文件里面既包含h文件的声明又包含cpp的实现,所以才命名为hpp格式,这里我们不仅要导入common.h还需要导入实现common.cpp文件
common.h
image这里我们看到我们还需要导入common_platform.h,当然也需要导入相应的.cpp文件了
然后我们执行下面的操作生成Android.mk文件
image接着我们导入example里面提供的MainActivity文件,记住包名不要改变,接着我们利用javah工具得到.h文件,那这.h文件让哪个文件来包含进来呢?经过查看看到common_platform.cpp里面有相应的实现代码
到这里我们还少些什么呢,那就是.so文件需要导入进来,因为作者将inc里面的声明实现都放在了so文件里面,所以需要将so文件加入jni文件里面
之后我们需要配置一下Android.mk
LOCAL_PATH := $(call my-dir)
#编译libfmod.so文件
include $(CLEAR_VARS)
LOCAL_MODULE := fmod
LOCAL_SRC_FILES := libfmod.so
include $(PREBUILT_SHARED_LIBRARY)
#编译libfmodL.so文件
include $(CLEAR_VARS)
LOCAL_MODULE := fmodL
LOCAL_SRC_FILES := libfmodL.so
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := voicer_change #生成so文件的名字
##编译相应的cpp文件,都需要编译不让会出现找不到类的情况
LOCAL_SRC_FILES := play_sound.cpp common.cpp common_platform.cpp
LOCAL_SHARED_LIBRARIES := fmod fmodL #编译的时候要依赖的共享库
LOCAL_LDLIBS := -llog #打印Log
include $(BUILD_SHARED_LIBRARY)
至此我们就可以进行build了,当然会报错#include<string.h>找不到,因为需要提供C++标准库支持
image这时候我们需要新建一个Application.mk
APP_ABI := armeabi #编译与调试的CPU架构
APP_STL := stlport_static
APP_STL := gnustl_static #支持 C++异常处理,标准模板块
APP_CPPFLAGS +=-std=c++11 #允许使用c++11的函数等功能
进行build还会发生so生成失败,这时候我们需要引入下面的这些路径才可以
image前面的三个是有关jni.h jni_md.h的路径
后面的是有关C++标准库相关的路径,所以需要引用,当时就是没有引入就报了一堆错误,擦擦,所以要想build成功就需要进行引入
最后进行build,当在build成功之后不能运行,需要close project之后在open然后在运行,这样就可以运行了哦,当然在运行之前需要将声音资源加入到assets目录下面,具体的界面如下:
image至此,QQ变声的NDK环境就搭建好了,接下来我们将在这基础上开发QQ变声的功能,O(∩_∩)O谢谢
网友评论