众多周知,mp3 是跨平台性最好的音频格式,由于采用了压缩率更高的有损压缩算法,文件大小是大约每分钟1M,使其在网络中传输更快,占用存储空间也更少;与此同时,它的声音质量也不错,尤其是人声(相声、评书、脱口秀),当然追求无损音乐的除外。
Android 中没有提供录制 mp3 的 API,需要使用开源库 lame,lame 是专门用于编码 mp3 的轻量高效的 c 代码库。由于采用 c 语言编写,故需要用到 jni。
下载lame库
源码导入
解压下载的lame库,把libmp3lame文件夹下后缀为.c .h的文件(不包括子文件夹i386和vector下的)复制到cpp/lame文件夹内,同时把include目录下的lame.h也复制到cpp/lame文件夹内,此时 lame文件夹内包含42个文件。
images.png
修改库文件
打开刚刚拷贝的lame库文件,修改:
util.h 文件,把 570 行的两处 ieee754_float32_t 改为 float 因为Android下并不支持该类型
set_get.h 文件,把头部的 #include 改为 #include "lame.h"
fft.c 文件,删除第47行 #include "vector/lame_intrin.h"
id3tag.c和machine.h两个文件里,將HAVE_STRCHR和HAVE_MEMCPY的ifdef结构体删除或者注释
#ifdef STDC_HEADERS
# include
# include
#else
/*# ifndef HAVE_STRCHR
# define strchr index
# define strrchr rindex
# endif*/
char *strchr(), *strrchr();
/*# ifndef HAVE_MEMCPY
# define memcpy(d, s, n) bcopy ((s), (d), (n))
# define memmove(d, s, n) bcopy ((s), (d), (n))
# endif*/
#endif
可参考以下完整修改文件
diff --git a/VbrTag.c b/VbrTag.c
index 5800a44..36ee7b6 100644
--- a/VbrTag.c
+++ b/VbrTag.c
@@ -26,6 +26,8 @@
# include
#endif
+#include
+#include
#include "lame.h"
#include "machine.h"
#include "encoder.h"
diff --git a/bitstream.c b/bitstream.c
index aa35915..a2fe294 100644
--- a/bitstream.c
+++ b/bitstream.c
@@ -29,6 +29,7 @@
#include
#include
+#include
#include "lame.h"
#include "machine.h"
diff --git a/encoder.c b/encoder.c
index 48f46c7..437067f 100644
--- a/encoder.c
+++ b/encoder.c
@@ -30,6 +30,7 @@
#endif
+#include
#include "lame.h"
#include "machine.h"
#include "encoder.h"
diff --git a/fft.c b/fft.c
index 4eea1ad..27febdb 100644
--- a/fft.c
+++ b/fft.c
@@ -44,7 +44,7 @@
#include "util.h"
--- a/fft.c
+++ b/fft.c
@@ -44,7 +44,7 @@
#include "util.h"
#include "fft.h"
-#include "vector/lame_intrin.h"
+//#include "vector/lame_intrin.h"
diff --git a/id3tag.c b/id3tag.c
index ac48510..8f148b8 100644
--- a/id3tag.c
+++ b/id3tag.c
@@ -41,17 +41,20 @@
# include
# include
#else
-# ifndef HAVE_STRCHR
-# define strchr index
-# define strrchr rindex
-# endif
+//# ifndef HAVE_STRCHR
+//# define strchr index
+//# define strrchr rindex
+//# endif
char *strchr(), *strrchr();
-# ifndef HAVE_MEMCPY
-# define memcpy(d, s, n) bcopy ((s), (d), (n))
-# endif
+