变调库soundtouch Android Demo编译

3,760 阅读2分钟

1. 背景

最近项目需要实现音频不变速变调,查询了开源库,主要有soundtouch。

官方对应的Android Demo源码为eclipse,使用的native代码路径也为相对路径。本篇文章主要记录把Android Demo迁移到Android Studio,成功编译出so文件,正常运行demo。

2. 迁移到Android Studio

  1. 下载soundtouch最新代码

git clone https://gitlab.com/soundtouch/soundtouch.git

  1. 打开Android Studio导入Android Demo

android demo路径如下:

/Users/mac/work/code/android/soundtouch/source/Android-lib

打开Android Studio选择Import project(Gradle,Eclipse ADT,etc.)导入项目

  • 此时Android Studio会自动将Eclipse项目转换为Android Studio项目格式
  • 项目取名SoundTouchAndroidLib。
    image
  1. 配置NDK环境

(1)在项目SoundTouchAndroidLib/gradle.properties新增

android.useDeprecatedNdk=true

如果没有gradle.properties新建一个即可 (2)下载ndk

image

  • 选中Cmake,LLDB,NDK点击Apply即可下载对应文件。 (3)为项目配置ndk路径
    image
    配置ndk路径 (4)在/Users/mac/work/code/SoundTouchAndroidLib/app/build.gradle添加
sourceSets.main {
jni.srcDirs = ['libs']
}

(5)拷贝soudntouch native代码到项目

新建目录/Users/mac/work/code/SoundTouchAndroidLib/app/src/main/jni/SoundTouch,拷贝native代码,主要包括

  • soundtouch/source/SoundTouch

  • soundtouch/source/SoundStretch

  • soundtouch/include

    image
    (6)找到STTypes.h头文件,将#define ST_NO_EXCEPTION_HANDLING 1 原先的注释去掉。
    image
    (7)修改.h引用路径

  • 打开jni/source-jni.cpp,将

#include "../../../include/SoundTouch.h"
#include "../source/SoundStretch/WavFile.h"

修改为

#include "SoundTouch/include/SoundTouch.h"
#include "SoundTouch/SoundStretch/WavFile.h"
  • 打开jni/Android.mk,将
LOCAL_MODULE    := soundtouch
LOCAL_SRC_FILES := soundtouch-jni.cpp ../../SoundTouch/AAFilter.cpp  ../../SoundTouch/FIFOSampleBuffer.cpp \
                ../../SoundTouch/FIRFilter.cpp ../../SoundTouch/cpu_detect_x86.cpp \
                ../../SoundTouch/sse_optimized.cpp ../../SoundStretch/WavFile.cpp \
                ../../SoundTouch/RateTransposer.cpp ../../SoundTouch/SoundTouch.cpp \
                ../../SoundTouch/InterpolateCubic.cpp ../../SoundTouch/InterpolateLinear.cpp \
                ../../SoundTouch/InterpolateShannon.cpp ../../SoundTouch/TDStretch.cpp \
                ../../SoundTouch/BPMDetect.cpp ../../SoundTouch/PeakFinder.cpp 

# for native audio
LOCAL_SHARED_LIBRARIES += -lgcc 

修改为

LOCAL_MODULE    := soundtouch
LOCAL_SRC_FILES := soundtouch-jni.cpp \
                SoundTouch/SoundTouch/AAFilter.cpp \
                SoundTouch/SoundTouch/FIFOSampleBuffer.cpp \
                SoundTouch/SoundTouch/FIRFilter.cpp \
                SoundTouch/SoundTouch/cpu_detect_x86.cpp \
                SoundTouch/SoundTouch/sse_optimized.cpp \
                SoundTouch/SoundStretch/WavFile.cpp \
                SoundTouch/SoundTouch/RateTransposer.cpp \
                SoundTouch/SoundTouch/SoundTouch.cpp \
                SoundTouch/SoundTouch/InterpolateCubic.cpp \
                SoundTouch/SoundTouch/InterpolateLinear.cpp \
                SoundTouch/SoundTouch/InterpolateShannon.cpp \
                SoundTouch/SoundTouch/TDStretch.cpp \
                SoundTouch/SoundTouch/BPMDetect.cpp \
                SoundTouch/SoundTouch/PeakFinder.cpp \

# for native audio
# LOCAL_SHARED_LIBRARIES += -lgcc

==注意==-lgcc这行注释掉了

3. NDK编译出so文件

(1)在Terminal工具运行,编译so

/Users/mac/work/code/env/android-ndk-r20/ndk-build NDK_PROJECT_PATH=/Users/mac/work/code/SoundTouchAndroidLib/app/src/main

(2)报错路径不对 /Users/mac/work/code/SoundTouchAndroidLib/app/src/main/jni/SoundTouch/SoundTouch/xx.h文件的include路径都需要修改下。

  • 我是编译一次编译,发现一个错误改一个路径,有点傻。 (3)输出so 如果xx.h文件的include路径修改完毕,应该就可以得到so文件了。
    image
    (4)扫尾
  • /Users/mac/work/code/SoundTouchAndroidLib/app/src/main/下的libs文件夹重命名为jniLibs
  • /Users/mac/work/code/SoundTouchAndroidLib/app/src/main/下的obj文件夹删除

4. 运行demo,验证变调效果

image

  • 找一个wav文件即可对效果进行验证。

5. 总结

  1. 实践出真知

6. 参考资料

  1. soundtouch官网
  2. soundtouch源码
  3. Android SoundTouch(处理音频)
  4. 文章源码