在iOS中生成AcoustID/Chromaprint声学指纹

ukxgm1gy  于 2023-03-31  发布在  iOS
关注(0)|答案(1)|浏览(137)

Chromaprint是用于计算音频文件的AcoustID音频指纹的开源软件库。
我正在尝试从iOS上的本地文件生成此音频指纹。
该库可以在Windows、Linux和OS X上构建,它可以创建一个动态库以及一个独立的程序(fpcalc),该程序接受音频文件,解码音频并将其传递到chromaprint库以计算指纹。由于以下原因,它实际上不能在iOS上工作:
1.独立的fpcalc程序无法在iOS上运行,因为您无法从应用程序运行可执行文件

  1. fpcalc程序的源代码使用chrominprint和ffmpeg。据我所知,ffmpeg很难在iOS上编译。chrominprint文档指出Accelerate框架可以在OS X/iOS中使用,但没有示例代码可以做到这一点,我不知道从哪里开始。
    我在为iOS构建库时遇到了一些麻烦(CMake讨厌我),但我觉得上面的问题更相关,因为即使编译了库,它也不会开箱即用。
    我试图避免这是一个“为我写我的代码”的问题,但我非常坚持基本上每一个方面生成一个色度指纹的iOS。
    我的目标,我认为,是在iOS上重新创建fpcalc程序的功能-解码音频文件(存储在设备上,任何音频类型),并将其传递给chromaprint库以生成指纹。
    我在iOS上找到了关于声学指纹的this question,但它与chromaprint/AcoustID无关,答案也不太有帮助。Echoprint Codegen很有趣,但我需要一个chromaprint指纹。
elcex8rz

elcex8rz1#

免责声明:这是可行的,但我不知道我在做什么。肯定有更好的方法来做到这一点。
构建问题:一开始,CMake什么都不好用。我从ios-cmake项目中找到并使用了this toolchain file,大多数事情都能正常工作。正如他们的wiki上所说,你必须使用源代码中的最新版本文件,而不是下载部分。CMake抱怨Boost,Xcode抱怨Boost,但这两件事在几个小时后神奇地修复了自己。
构建fpcalc功能(指纹生成)是一个棘手的部分,因为它使用ffmpeg,我还没有准备好尝试在iOS上用我的应用程序构建它。幸运的是,苹果的Audio File Services(AudioToolbox的一部分)具有相同的低级音频功能。
我开始看this code,它可以从NSData播放MP3文件。Audio Queue Services Programming Guide也有非常有用的信息,可以打开和阅读音频文件及其属性。但是,使用mp3文件(或任何压缩格式),您从数据中读取的帧不是chromoprint需要的原始PCM数据。
幸运的是,苹果公司的this sample project可以将音频文件转换为另一种格式。尽管在我的应用程序中编译这个项目花了一些时间(很多奇怪的C++/Objective-C混合),但这正是我所需要的-它包括一个DoConvertFile方法。
基本上,我的最终代码使用了这两种方法。首先,它使用DoConvertFile将任何输入文件转换为线性PCM格式,然后使用AudioFileOpenURLAudioFileReadPackets读取转换后文件的内容。AudioFileGetProperty为我们提供了需要传递给chromaprint_new的值。然后,我们接收可以传递给chromaprint_feed的相同的逐帧音频数据,一旦你到了文件的末尾,就可以了!chromaprint_finishchromaprint_get_fingerprint工作得很好。删除转换后的文件,然后对指纹做任何你想做的事情。

相关问题