You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 13:48:10