Android项目使用Lame库录制.mp3格式音频

在android开发中常常需要使用设备录制音频,但是得到的音频文件格式通常是.ma4或.arm等格式,为了得到具有通用格式的mp3音频文件。这里可以在andoid项目中使用开源库。
从github上下载了一个开源项目,这个android项目中使用了lame这个开源库来录制mp3格式的音频文件。下面通过几个步骤来一步一步移植下载的开源项目到自己的android开源项目中:
1、在eclipse中配置NDK
由于这个lame开源库是用C++编写的,为了在android中编译并调用它,就需要借用NDK。
1.1、到android官网下载NDK并解压到自定义文件夹下:
NDK
1.2、在Eclipse中配置NDK,Windows->Preferences->Android->NDK,在右边的NDK Location中选择解压出来的NDK的位置(如果使用从android官网下载的eclipse,在Android选项下没有NDK这个选项,这时需要在网上下载一个jar包:com.android.ide.eclipse.ndk_23.0.2.1259578.jar,并将该jar包导入到eclipse的plugins目录中):
jar包:
ndk的jar包
eclipse中配置NDK
这里写图片描述
1.3、在Eclipse中新建android项目AndroidMp3,然后为该项目配置C++编译器:
右键项目Properties->Builders在右边的选项卡中点击“New”新建编译器(选择Program):
C++编译器
在弹出的对话框中编辑编译器:
Main选项:
Location:选择NDK的ndk-build.cmd
Working Directory:选择为哪个工程创建的编译器
Main选项
Refresh选项:
勾选Refresh resources upon completion和Recursively include sub-folders;
选择The entire workspace
Refresh选项
Build Options选项:
勾选“After a “Clean””,
勾选“During manual builds”,
勾选“During auto builds”,
勾选“Specify working set of relevant resources”。
点击“Specify Resources…”并勾选对应工程的jni目录:
Build Options
至此,就已经在Eclipse中配置好了NDK并为项目创建了C++编译器。
2、在项目中使用lame库
2.1、下载lame库(lame-3.99.5.tar.gz)并解压,在项目中新建文件夹jni,复制lame-3.99.5里面文件夹libmp3lame下的所有.c和.h的文件到jni文件夹下(如果不放心,可以将整个libmp3lame文件夹复制到jni下)。

2.2、编辑文件
在util.h中,将

extern ieee754_float32_t fast_log2(ieee754_float32_t x);

替换成

extern float fast_log2(float x);

在set_get.h中,将

#include <lame.h>

替换成

#include "lame.h"

2.3、编译得到Android.mk
右键项目Android Tools->Add Native Support来生成.so文件
同时会在jni文件夹下会生成Android.mk文件
.so文件

Android.mk文件
2.4、编辑Android.mk文件

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LAME_LIBMP3_DIR := lame-3.98.4_libmp3lame

LOCAL_MODULE    := mp3lame
LOCAL_SRC_FILES := $(LAME_LIBMP3_DIR)/bitstream.c $(LAME_LIBMP3_DIR)/fft.c $(LAME_LIBMP3_DIR)/id3tag.c $(LAME_LIBMP3_DIR)/mpglib_interface.c $(LAME_LIBMP3_DIR)/presets.c $(LAME_LIBMP3_DIR)/quantize.c $(LAME_LIBMP3_DIR)/reservoir.c $(LAME_LIBMP3_DIR)/tables.c $(LAME_LIBMP3_DIR)/util.c $(LAME_LIBMP3_DIR)/VbrTag.c $(LAME_LIBMP3_DIR)/encoder.c $(LAME_LIBMP3_DIR)/gain_analysis.c $(LAME_LIBMP3_DIR)/lame.c $(LAME_LIBMP3_DIR)/newmdct.c $(LAME_LIBMP3_DIR)/psymodel.c $(LAME_LIBMP3_DIR)/quantize_pvt.c $(LAME_LIBMP3_DIR)/set_get.c $(LAME_LIBMP3_DIR)/takehiro.c $(LAME_LIBMP3_DIR)/vbrquantize.c $(LAME_LIBMP3_DIR)/version.c com_uraroji_garage_android_lame_SimpleLame.c

include $(BUILD_SHARED_LIBRARY)

LOCAL_MODULE := mp3lame 是后面用到的这个编译出来的库的名称,可以自定义;
LOCAL_SRC_FILES := 后跟的是之前导入到jni目录下的所有.c文件。LOCAL_SRC_FILES:= 默认是读取jni根目录下的文件的,这里因为将这些.c文件放在了lame-3.98.4_libmp3lame目录下,所以需要先得到这个文件夹目录:

LAME_LIBMP3_DIR := lame-3.98.4_libmp3lame

然后在后面的每个.c文件名前添加前缀:

$(LAME_LIBMP3_DIR)/

而变成

$(LAME_LIBMP3_DIR)/bitstream.c

不然可能会出现

No rule to make target NDK

的错误。
这当中可能会遇到的问题:
1、Type ‘size_t’ could not be resolved的错误,这是没有导入头文件的原因造成的,这时只需要右键项目Properties->C/C++ Genaral->Paths and Symbols 在右边包含进NDK下的某些include文件:例如
D:\Android\android-ndk-r10\toolchains\arm-linux-androideabi-4.8\prebuilt\windows-x86_64\lib\gcc\arm-linux-androideabi\4.8\include
这里写图片描述
2、Type ‘uint16_t’ could not be resolve的错误,同样是需要导入一些头文件:例如
D:\Android\android-ndk-r10\platforms\android-14\arch-x86\usr\include
至此基本上就在项目中导入了lame库,至于具体lame库的原理和使用注意事项,这里不予讨论。

扫描二维码关注公众号,回复: 2423103 查看本文章

猜你喜欢

转载自blog.csdn.net/whurs/article/details/45487521