2014-09-25 28 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