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

如何在Android Studio中实现MP3/WAV音频增益调节并播放

Android Studio实现音频增益功能开发指南

首先明确前提:你提供的C代码仅支持WAV格式的16位PCM音频增益,MP3属于压缩格式,需要先解码为原始PCM数据后再做增益处理,完整实现流程如下:

第一步 项目NDK环境配置

  • 打开你的Android Studio项目,在local.properties中确认已配置ndk路径
  • 在模块级build.gradle的android.defaultConfig下添加NDK配置,开启CMake编译:
android {
    defaultConfig {
        externalNativeBuild {
            cmake {
                cppFlags ""
                abiFilters "armeabi-v7a", "arm64-v8a"
            }
        }
    }
    externalNativeBuild {
        cmake {
            path "src/main/cpp/CMakeLists.txt"
            version "3.22.1"
        }
    }
}
  • 在src/main/cpp目录下创建CMakeLists.txt和你的C代码文件audio_gain.c

第二步 改造C增益代码适配JNI调用

你原来的代码是直接读写本地文件,改造成接收PCM数据和增益参数的JNI接口,避免硬编码文件路径,同时添加削波保护防止增益过大出现爆音:

#include <jni.h>
#include <math.h>
#include <android/log.h>

#define LOG_TAG "AUDIO_GAIN"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)

JNIEXPORT void JNICALL
Java_com_your_package_name_AudioGainProcessor_processPcmGain(JNIEnv *env, jobject thiz,
                                                             jshortArray pcm_data,
                                                             jint gain_db) {
    jsize len = (*env)->GetArrayLength(env, pcm_data);
    jshort *pcm = (*env)->GetShortArrayElements(env, pcm_data, NULL);

    // 增益dB转倍数:10^(gain/20)
    float gain_factor = powf(10, gain_db / 20.0f);

    for (int i = 0; i < len; i++) {
        float sample = pcm[i] / 32767.0f;
        float processed = sample * gain_factor;
        // 削波保护 防止超出16位采样范围出现爆音
        if (processed > 1.0f) processed = 1.0f;
        if (processed < -1.0f) processed = -1.0f;
        pcm[i] = (short) (processed * 32767.0f);
    }

    (*env)->ReleaseShortArrayElements(env, pcm_data, pcm, 0);
}

注意把代码中的com_your_package_name替换成你自己项目的包名。

第三步 实现MP3解码逻辑

使用Android系统自带的MediaExtractor和MediaCodec解码raw目录下的MP3文件为16位PCM数据:

  • 读取raw资源的方法:
InputStream inputStream = getResources().openRawResource(R.raw.your_mp3_file);
  • 解码流程:
    1. 用MediaExtractor读取音频轨道信息
    2. 配置MediaCodec为解码模式,输入MP3压缩数据,输出原始PCM
    3. 循环读取解码后的PCM数据,送入第二步的JNI增益处理方法

第四步 实现UI交互与音频播放

  • 布局中添加SeekBar控件,设置增益范围(建议设置为0到30dB,避免增益过大损坏扬声器),监听SeekBar变化获取用户输入的增益值:
SeekBar gainSeekBar = findViewById(R.id.gain_seekbar);
gainSeekBar.setMax(30);
int currentGain = 0;
gainSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
    @Override
    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
        currentGain = progress;
    }
    @Override public void onStartTrackingTouch(SeekBar seekBar) {}
    @Override public void onStopTrackingTouch(SeekBar seekBar) {}
});
  • 增益处理后的PCM数据可以直接用AudioTrack实时播放,不需要先存为本地文件,降低IO开销

注意事项

  • 你原始的C代码只支持16位单声道WAV,改造后的JNI方法支持任意长度的16位PCM,单双声道都可以处理
  • 如果需要直接处理WAV文件,可以保留原C代码的文件读写逻辑,把WAV文件从raw目录复制到App私有存储目录后再传入C代码处理
  • 增益超过20dB后可能会出现明显爆音,建议添加音量过载提示
  • 如果需要导出处理后的WAV文件,处理完PCM后需要手动拼接WAV头信息再写入本地文件

内容的提问来源于stack exchange,提问作者Someshwaran

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 17:54:04