Chromaprint是一个开源软件库,用于计算音频文件的AcoustID音频指纹。
我试图从iOS上的本地文件生成此音频指纹。
该库可以在Windows,Linux和OS X上构建,它可以创建动态库以及接受音频文件的独立程序(fpcalc),对音频进行解码并将其传递给色度图库以计算指纹。由于以下原因,它在iOS上并不真正起作用:
我实际上在为iOS构建库时遇到了一些麻烦(CMake讨厌我),但我觉得上面的问题更相关,因为即使编译了库,它也不会只是开箱即用。
我试图避免这是一个"为我编写代码"问题,但我基本上都坚持为iOS生成色度指纹的各个方面。
我认为,我的目标是在iOS上重新创建fpcalc程序的功能 - 解码音频文件(存储在设备上,任何音频类型)并将其传递给色度图库以生成指纹。 / p>
我在iOS上找到了关于声学指纹识别的this question,但它与chromaprint / AcoustID没有关系,答案也没那么有用。 Echoprint Codegen很有趣,但我需要一个色度指纹。
答案 0 :(得分:1)
我知道了!我实际上是这样的!免责声明:这有效,但我不知道我在做什么。肯定有更好的方法。
构建问题:一开始,CMake没有任何效果。我在ios-cmake项目中找到并使用了this toolchain file,大多数工作都有效。如其维基上所述,您必须使用源代码中的最新版本文件而不是下载部分。 CMake抱怨Boost,Xcode抱怨Boost,但这两件事情都在几个小时之后神奇地修复了。
构建fpcalc功能(指纹生成)是一个棘手的部分,因为它使用ffmpeg,我还没准备好在iOS上使用我的应用程序来构建它。幸运的是,Apple的Audio File Services(AudioToolbox的一部分)具有相同类型的低级音频功能。
我开始查看播放NSData的MP3文件的this code。 Audio Queue Services Programming Guide对于打开和读取音频文件及其属性也有非常有用的信息。但是,使用mp3文件(或任何压缩格式),从数据中读取的帧不是chromaprint所需的原始PCM数据。
幸运的是,Apple的this sample project会将音频文件转换为其他格式。虽然在我的应用程序(许多奇怪的C ++ / Objective-C混合)中进行编译需要一些小小的尝试,但这是我需要的 - 它包含DoConvertFile
方法。
基本上,我的最终代码使用了这两种方法。首先,它使用DoConvertFile
将任何输入文件转换为线性PCM格式,然后使用AudioFileOpenURL
和AudioFileReadPackets
来读取转换后文件的内容。 AudioFileGetProperty
为我们提供了传递给chromaprint_new
的值。然后,我们会收到相同的逐帧音频数据,这些数据可以传递给chromaprint_feed
,一旦你在文件的末尾,那就是它! chromaprint_finish
和chromaprint_get_fingerprint
完美无缺。删除已转换的文件,并对指纹执行任何操作。
这就是你在iOS应用程序中实现AcoustID的方法!我的解释现在看起来很简单,但这需要几个小时。 :'(