如何在Android中集成Rubber Band库实现音调偏移?
分步集成Rubber Band库到Android应用
一、准备工作
- 获取最新版Rubber Band库源码
- 安装Android NDK 25+版本,确保适配最新库结构
二、修正NDK构建配置
你的现有Android.mk因库结构更新导致错误,以下是适配最新版本的配置文件:
1. 替换Android.mk内容
LOCAL_PATH := $(call my-dir)/.. LOCAL_MODULE := rubberband LOCAL_MODULE_FILENAME := librubberband-jni RUBBERBAND_PATH := $(LOCAL_PATH) RUBBERBAND_SRC_PATH := $(RUBBERBAND_PATH)/src # 更新头文件包含路径 LOCAL_C_INCLUDES := \ $(RUBBERBAND_PATH) \ $(RUBBERBAND_SRC_PATH) \ $(RUBBERBAND_SRC_PATH)/kissfft \ $(RUBBERBAND_SRC_PATH)/speex LOCAL_CFLAGS := \ -Wall \ -O3 \ -DUSE_SPEEX \ -DUSE_KISSFFT \ -DPROCESS_SAMPLE_TYPE=float \ -DLACK_POSIX_MEMALIGN \ -DUSE_OWN_ALIGNED_MALLOC \ -DLACK_SINCOS \ -DNO_EXCEPTIONS \ -DNO_THREADING \ -DNO_THREAD_CHECKS \ -DNO_TIMING \ -DNO_TIMING_COMPLETE_NOOP \ -DUSE_POMMIER_MATHFUN # 修正源文件列表,移除废弃文件 RUBBERBAND_JNI_FILES := \ $(RUBBERBAND_SRC_PATH)/jni/RubberBandStretcherJNI.cpp RUBBERBAND_SRC_FILES := \ $(RUBBERBAND_SRC_PATH)/base/Profiler.cpp \ $(RUBBERBAND_SRC_PATH)/system/Allocators.cpp \ $(RUBBERBAND_SRC_PATH)/system/sysutils.cpp \ $(RUBBERBAND_SRC_PATH)/system/VectorOpsComplex.cpp \ $(RUBBERBAND_SRC_PATH)/StretcherChannelData.cpp \ $(RUBBERBAND_SRC_PATH)/dsp/AudioCurveCalculator.cpp \ $(RUBBERBAND_SRC_PATH)/dsp/FFT.cpp \ $(RUBBERBAND_SRC_PATH)/dsp/Resampler.cpp \ $(RUBBERBAND_SRC_PATH)/audiocurves/SilentAudioCurve.cpp \ $(RUBBERBAND_SRC_PATH)/audiocurves/CompoundAudioCurve.cpp \ $(RUBBERBAND_SRC_PATH)/audiocurves/HighFrequencyAudioCurve.cpp \ $(RUBBERBAND_SRC_PATH)/audiocurves/SpectralDifferenceAudioCurve.cpp \ $(RUBBERBAND_SRC_PATH)/audiocurves/ConstantAudioCurve.cpp \ $(RUBBERBAND_SRC_PATH)/audiocurves/PercussiveAudioCurve.cpp \ $(RUBBERBAND_SRC_PATH)/StretcherImpl.cpp \ $(RUBBERBAND_SRC_PATH)/StretcherProcess.cpp \ $(RUBBERBAND_SRC_PATH)/StretchCalculator.cpp \ $(RUBBERBAND_SRC_PATH)/RubberBandStretcher.cpp \ $(RUBBERBAND_SRC_PATH)/speex/resample.c LOCAL_SRC_FILES += \ $(RUBBERBAND_JNI_FILES) \ $(RUBBERBAND_SRC_FILES) \ $(RUBBERBAND_SRC_PATH)/kissfft/kiss_fft.c \ $(RUBBERBAND_SRC_PATH)/kissfft/kiss_fftr.c # 架构优化配置 ifeq ($(TARGET_ARCH_ABI), armeabi-v7a) LOCAL_CFLAGS += \ -mfpu=neon \ -mfloat-abi=softfp \ -ffast-math \ -ftree-vectorize \ -freciprocal-math \ -fsingle-precision-constant \ -D__ARM_ARCH_7__ \ -DARM_RUNFAST LOCAL_ARM_MODE := arm LOCAL_ARM_NEON := true endif LOCAL_LDLIBS += -llog include $(BUILD_SHARED_LIBRARY)
2. 创建Application.mk文件
在同目录下新增Application.mk,指定ABI和NDK参数:
APP_ABI := arm64-v8a armeabi-v7a x86_64 APP_PLATFORM := android-24 APP_STL := c++_static APP_CPPFLAGS := -std=c++17
三、执行NDK构建
- 打开终端,进入Android.mk所在目录
- 执行构建命令:
ndk-build NDK_PROJECT_PATH=. APP_BUILD_SCRIPT=Android.mk - 构建成功后,
libs/目录会生成对应ABI的librubberband-jni.so文件
四、集成到Android项目
- 将
libs/目录复制到Android项目的app/src/main/路径下 - 在app模块的
build.gradle中添加配置:
android { sourceSets { main { jniLibs.srcDirs = ['src/main/libs'] } } }
五、实现音调偏移功能
在Java/Kotlin代码中加载库并调用JNI方法:
Java示例代码
public class PitchShifter { static { System.loadLibrary("rubberband-jni"); } // JNI方法声明 private native long createStretcher(int sampleRate, int channels, int options, double initialRatio); private native void setPitchScale(long handle, double scale); private native int getSamplesRequired(long handle); private native int process(long handle, float[][] input, int inputFrames, boolean finalize); private native int retrieve(long handle, float[][] output, int maxFrames); private native void destroyStretcher(long handle); // 封装音调偏移逻辑 public float[] shiftPitch(float[] audioData, int sampleRate, double pitchScale) { // 参考RubberBand官方文档完成具体处理流程 // 包括创建Stretcher实例、设置音调参数、处理音频数据、释放资源等 return audioData; } }
常见问题排查
- 构建报错"文件不存在":检查Android.mk中的源文件路径是否与最新库结构一致
- 运行时崩溃:确保so文件与设备ABI匹配,JNI方法签名正确
- 声音失真:调整RubberBand的处理参数(如窗口大小、音调曲线类型),尝试不同的options配置
内容的提问来源于stack exchange,提问作者shivani
相关产品推荐
相关产品推荐

