2014-09-25 112 views
2

Chromaprint是一个用于计算音频文件的AcoustID音频指纹的开源软件库。在iOS中生成AcoustID/Chromaprint声纹指纹

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

该库可以建立在W​​indows,Linux和OS X上,它可以创建动态库以及接受音频文件的独立程序(fpcalc),解码音频并将其传递给chromaprint库以计算指纹。它并没有真正在iOS上运行,原因如下:

  1. 单机fpcalc程序无法在iOS上,因为你不能从一个应用程序
  2. 运行可执行文件的源代码给fpcalc运行程序使用chromaprint 和ffmpeg。从我读过的,ffmpeg很难在iOS上编译。 Chromaprint文档声明Accelerate框架可以在OS X/iOS中使用,但是没有示例代码可以实现这一点,我不知道从哪里开始。

我一直在为iOS构建库(CMake讨厌我)时遇到了一些麻烦,但我觉得上述问题更相关,因为即使编译了库,它也不会工作盒子外面。

我试图避免这是一个“为我写代码”的问题,但我非常困扰在为iOS生成chromaprint指纹的各个方面。我认为,我的目标是重新创建iOS上fpcalc程序的功能 - 解码音频文件(存储在设备上,任何音频类型)并将其传递到chromaprint库以生成指纹。

我在iOS上发现了this question关于声学指纹识别,但它与chromaprint/AcoustID无关,答案没有帮助。 Echoprint Codegen很有趣,但我需要一个chromaprint指纹。

回答

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!我的解释现在看起来很简单,但这实际上花了数小时。 :'(

+0

我很高兴你能够正常工作,在我看来,使用扩展音频文件服务会比使用PCM转换文件更容易,将其保存在存储器中然后删除它,你通常只使用文件中的最初X秒的音频,所以你不需要转换整个文件。 – 2014-09-30 17:28:53

+0

啊,对不起,我刚刚检查过代码,它实际上使用了这个库,在这种情况下,你应该能够想知道如何在不保存转换后的文件的情况下获取指纹 – 2014-09-30 17:30:56

+0

@LukášLalinský是的,当然,您可以使用Apple的DoConvertFile函数中的代码来读取输入文件并完成所有的指纹工作。几小时的试验和错误(主要是错误),我只是转换整个文件而感到满意,我会在另一天优化它;) – ttarik 2014-09-30 17:37:36