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

时间:2014-09-25 06:51:52

标签: c++ ios iphone audio ffmpeg

Chromaprint是一个开源软件库,用于计算音频文件的AcoustID音频指纹。

我试图从iOS上的本地文件生成此音频指纹。

该库可以在Windows,Linux和OS X上构建,它可以创建动态库以及接受音频文件的独立程序(fpcalc),对音频进行解码并将其传递给色度图库以计算指纹。由于以下原因,它在iOS上并不真正起作用:

  1. 独立的fpcalc程序无法在iOS上运行,因为您无法从应用程序运行可执行文件
  2. fpcalc程序的源代码使用chromaprint 和ffmpeg 。根据我的阅读,ffmpeg很难在iOS上编译。 chromaprint docs声明Accelerate框架可以在OS X / iOS中使用,但没有示例代码可以执行此操作,我不知道从哪里开始。
  3. 我实际上在为iOS构建库时遇到了一些麻烦(CMake讨厌我),但我觉得上面的问题更相关,因为即使编译了库,它也不会只是开箱即用。

    我试图避免这是一个"为我编写代码"问题,但我基本上都坚持为iOS生成色度指纹的各个方面。

    我认为,我的目标是在iOS上重新创建fpcalc程序的功能 - 解码音频文件(存储在设备上,任何音频类型)并将其传递给色度图库以生成指纹。 / p>

    我在iOS上找到了关于声学指纹识别的this question,但它与chromaprint / AcoustID没有关系,答案也没那么有用。 Echoprint Codegen很有趣,但我需要一个色度指纹。

1 个答案:

答案 0 :(得分:1)

我知道了!我实际上是这样的!免责声明:这有效,但我不知道我在做什么。肯定有更好的方法。

构建问题:一开始,CMake没有任何效果。我在ios-cmake项目中找到并使用了this toolchain file,大多数工作都有效。如其维基上所述,您必须使用源代码中的最新版本文件而不是下载部分。 CMake抱怨Boost,Xcode抱怨Boost,但这两件事情都在几个小时之后神奇地修复了。

构建fpcalc功能(指纹生成)是一个棘手的部分,因为它使用ffmpeg,我还没准备好在iOS上使用我的应用程序来构建它。幸运的是,Apple的Audio File Services(AudioToolbox的一部分)具有相同类型的低级音频功能。

我开始查看播放NSData的MP3文件的this codeAudio Queue Services Programming Guide对于打开和读取音频文件及其属性也有非常有用的信息。但是,使用mp3文件(或任何压缩格式),从数据中读取的帧不是chromaprint所需的原始PCM数据。

幸运的是,Apple的this sample project会将音频文件转换为其他格式。虽然在我的应用程序(许多奇怪的C ++ / Objective-C混合)中进行编译需要一些小小的尝试,但这是我需要的 - 它包含DoConvertFile方法。

基本上,我的最终代码使用了这两种方法。首先,它使用DoConvertFile将任何输入文件转换为线性PCM格式,然后使用AudioFileOpenURLAudioFileReadPackets来读取转换后文件的内容。 AudioFileGetProperty为我们提供了传递给chromaprint_new的值。然后,我们会收到相同的逐帧音频数据,这些数据可以传递给chromaprint_feed,一旦你在文件的末尾,那就是它! chromaprint_finishchromaprint_get_fingerprint完美无缺。删除已转换的文件,并对指纹执行任何操作。

这就是你在iOS应用程序中实现AcoustID的方法!我的解释现在看起来很简单,但这需要几个小时。 :'(