使用[chromaprint]获取声音指纹

首先,这是我第一次在CSDN上写博客。随便简单的记录下这几天研究NDK的坑吧,总之还是弄出来了,记录一下吧,写的很垃圾不要喷

公司需求:使用第三方chromaprint 的so库,获取声音指纹(一串64位字符串),然后传给后台数据库做比对。有点类似听歌识曲。

给的资料就一个chromaprint 网址和经过Linux环境下交叉编译后的so文件。

刚开始百度,说android 调用第三方的so 有两种方法。

第一:就是符合jni格式的so,直接调用他本地的函数。

第二:不符合jni格式的so,需要用本地so去调用第三方的so,然后生成动态库。在java中调用生成的动态库。

因为在网址上有个调用的简单demo,我想的就是看能不能直接调用,最后发现,这里面的函数根本不存在。于是就草草放弃了,

我选择第二种,通过导入第三方的.h头文件和so库,然后写本地的native方法,通过javah生成本地头文件,然后写本地的.c文件,找了写C的同事帮忙调用so的函数,然后通过NDK编译动态库,编译很快就通过了,暗自窃喜马上要成功了,但是运行的时候却报错。找不到这个so文件,这个错误让我想了N久,也找同事了很久,在网上找文档也N久。。。总之花费了很长时间。。都想着要放弃了。


但是无意中看到之前同事写的关于调用第三方的so库时,说的一句话,直接看API文档,文档叫你如何调用就如何调用。

于是看了文档后,才发现之前的工作都是因为自作聪明。直接在libs中拷贝so就可以直接通过

public native String fpCalc(String[] paramArrayOfString);
这个函数调用了。参数就是你保存在手机上的MP3文件。别忘了前面要加上“-md5”,把这2个放在集合中作为参数。他就会返回一个info给你,如下图:

info的内容一看就明白了,要什么就自己截取吧。


哦对了,android录音的格式WAV,但没有MP3的跨平台性高,所以调用fpcalc之前必须转码。我用的是github上面的

GavinCT/AndroidMP3Recorder


链接在这里:https://github.com/GavinCT/AndroidMP3Recorder

说了一大堆屁话,目的就是提醒自己和各位,多看看API文档。不要自作聪明。没有文档就要向提供方索要,毕竟Android开发第三方的东西,NDK技术基本不是问题,而是需要如何去调用第三方的我们不清楚的东西。

最后还是要感谢CSDN上面帮助我的大神:天堂1223


猜你喜欢

转载自blog.csdn.net/qq_35780104/article/details/76060920
今日推荐