最近项目很忙成狗,想写点儿东西都没时间,各种蛋疼的需求,程序员的生活真特么苦逼,抱怨两句,开始正文。
在一个公司中,一个app的开发基本上都是两端(ios和Android)开发,而保证两端的一致性很重要,比如说录音功能,ios和Android的各自平台上录音功能存在兼容性问题,在Android平台上的录音格式,可能在Android能够正常解析,但是到了ios可就不一定了,所以今天介绍一下高质量的音频库lame。不了解该音频库的可以自行上官网查看,最新的lame库版本为3.100,3.99还版本还是12年更新的,所以本文主要是介绍lame最新库3.100的编译与集成使用。首先非常感谢作者yhirano的开源项目Mp3VoiceRecorderSampleForAndroid, 基于此基础编译新so库。
1.下载3.100 lame库,lame库下载地址在这里。
2. 将lame 3.100中的libmp3lame整个文件夹拷贝到自己项目jni目录下
3.将Mp3VoiceRecorderSampleForAndroid中的SampleLame.java和RecMicToMp3.java文件拷贝到自己的java项目中,使用javac命令编译SampleLame.java文件,再通过javah命令生成.h文件,然后编写.c文件(可以参照文中的开源项目,可以直接拿来用),编写Android.mk文件,通过ndk编译。
编译过程中会报如下错误
jni/libmp3lame_3.100/bitstream.c:33:10: fatal error: 'lame.h' file not found
很明显是没有找到lame.h这个头文件,此时我们需要回到我们下载的库中找到include文件夹找到lame.h放到我们的libmp3lame_3.100文件夹下,再次ndk-build编译,此时又会出现错误如下
jni/libmp3lame_3.100/util.h:570:12: error: unknown type name 'ieee754_float32_t'
extern ieee754_float32_t fast_log2(ieee754_float32_t x);
^
jni/libmp3lame_3.100/util.h:570:40: error: unknown type name 'ieee754_float32_t'
extern ieee754_float32_t fast_log2(ieee754_float32_t x);
既然如此,那就去util.h中找到这个未知类型,然后将ieee754_float32_t替换成我们熟知的float类型,再次ndk-build
jni/libmp3lame_3.100/set_get.h:24:10: error: 'lame.h' file not found with <angled> include; use "quotes" instead
#include <lame.h>
^~~~~~~~
"lame.h"
错误很明显啦,找到set_get.h将#include<lame.h>改成#include "lame.h",继续ndk-build命令
[armeabi] SharedLibrary : libmp3lame.so
jni/libmp3lame_3.100/id3tag.c:654: error: undefined reference to 'bcopy'
jni/libmp3lame_3.100/id3tag.c:426: error: undefined reference to 'bcopy'
jni/libmp3lame_3.100/id3tag.c:1205: error: undefined reference to 'index'
jni/libmp3lame_3.100/id3tag.c:452: error: undefined reference to 'bcopy'
jni/libmp3lame_3.100/quantize.c:1307: error: undefined reference to 'bcopy'
clang++.exe: error: linker command failed with exit code 1 (use -v to see invocation)
擦,还让不让人玩了,继续纠错,发现bcopy未定义的引用,后来网上查资料才发现
如果是x86_64的话需要在Application.mk中加上
//Application.mk
APP_ABI := armeabi armeabi-v7a arm64-v8a x86 x86_64
APP_CFLAGS += -DSTDC_HEADERS
否则就会报如上面的错误。再次编译,发现没有任何错误,心里那个舒坦啊,爽。
以上就是集成编译最新lame库遇到的坑,mark下。
最后附上LameDemo一份,包含已经解决错误的lame库一份以及编译好的so库。