关于Android中将PCM转AMR的问题探讨

本文记录了在项目中将阿里云语音识别返回的PCM数据转换为AMR格式的过程。首先通过JSSRC库将16k PCM数据下采样为8k,然后转换为WAV格式,接着使用opencore-amr库将8k WAV直接编码为AMR。提供了详细的代码实现和转换步骤,适用于需要处理类似问题的开发者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

因为项目中用到了阿里的语音识别技术,但是返回的是PCM原始数据,这里就需要将PCM转为AMR的音频格式,这里将其中遇到的问题记录下来,有需要的小伙伴们可以参考一下。

这里的实现思路先大致说一下,将PCM先转为WAV,然后再由WAV转为AMR。

话不多说,直接上代码。

我们先PCM转为WAV,要注意的是16k的PCM一定要对采样率进行向下采样成8kPCM之后,再将PCM进行转换成WAV,否则后面转出来的8k的AMR就一塌糊涂了!!!重新采样用的是三方库JSSRC,我这里是对JSSRCResampler进行了一些调整,直接将源码改成了16k转8k的。

public void pcmToWav(String inFilename, String outFilename, PcmToWavTransformListener listener) {
        FileOutputStream out;
        long totalAudioLen;//总录音长度
        long totalDataLen;//总数据长度
        long longSampleRate = 8000;
        int channels = 1;
        long byteRate = 8 * longSampleRate * channels / 8;
        byte[] data = new byte[mBufferSize];
        try {
            FileInputStream inputStream = new FileInputStream(inFilename);
            totalAudioLen = input
### Android 中将 PCM 音频文件换为 MP3 格式的方案 在 Android 开发过程中,有时需要将 PCM 数据换为更常用的 MP3 格式。为了实现这一点,通常会借助第三方库 LAME 来完成编码工作。 #### 使用 LAME 进行 PCM 到 MP3 的换 LAME 是一个广泛使用的开源 MP3 编码器,在 Android 上可以通过 JNI (Java Native Interface) 方式集成 C/C++ 实现的 LAME 库来执行编解码操作[^5]。 具体步骤如下: 1. **准备环境** 安装 NDK 和配置好支持 CMake 或 ndk-build 构建系统的开发环境。 2. **下载并导入 LAME 源码** 可以从 GitHub 获取最新版本的 lame 源代码,并将其加入到项目结构中适当位置。 3. **编写 Java 层接口** 创建用于调用本地方法的 Java 类 `LameUtil.java`: ```java public class LameUtil { static { System.loadLibrary("mp3lame"); } public native int encode(short[] buffer_l, short[] buffer_r, byte[] mp3buf); } ``` 4. **实现 C/C++ 函数** 在 jni 文件夹内创建对应的 cpp 文件定义上述函数的具体逻辑: ```cpp #include "com_demo_application_LameUtil.h" #include <lame/lame.h> JNIEXPORT jint JNICALL Java_com_demo_application_LameUtil_encode(JNIEnv *env, jobject thiz, jshortArray buffer_l, jshortArray buffer_r, jbyteArray mp3buf) { // Convert arrays to pointers... ... return result; } ``` 5. **构建与调试** 修改 Application.mk 设置目标 ABI 版本以及平台等级等参数: ```makefile APP_ABI := all APP_PLATFORM := android-21 APP_MODULES := mp3lame APP_CFLAGS += -DSTDC_HEADERS ``` 6. **测试功能** 测试应用程序能否成功读取 PCM 数据并通过 LAME 编译成有效的 MP3 文件流。 这种方法允许开发者利用强大的 LAME 编码能力直接在移动设备端处理音频文件格式之间的相互化。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值