2011-11-22 58 views
0

我正在嘗試整合一種機制來計算iPod庫(也是在iphone上)歌曲的BPM。 在網上搜索我發現最常用和最可靠的庫是做Soundtouch的。任何人都有這個庫的經驗嗎?在計算上可以使它在iPhone硬件上運行?Soundtouch bpm iPhone

回答

4

使用從BPMDetectsoundtouch庫成功地代碼我最近一直。最初編譯它C++,後來的代碼轉換爲C#,最近我一直在使用通過JNI的的Android應用C++代碼。我對iOS的開發並不十分熟悉,但我幾乎可以肯定,你可能正在嘗試做什麼。

,則應該從soundtouch源代碼使用的唯一文件如下:

C++文件

  • BPMDetect.cpp
  • FIFOSampleBuffer.cpp
  • PeakFinder .cpp

頭文件

  • BPMDetect.h
  • FIFOSampleBuffer.h
  • FIFOSamplePipe.h
  • PeakFinder.h
  • soundtouch_config.h
  • STTypes.h

至少這些是我不得不使用的唯一工具。

BPMDetect類通過其inputSamples()方法,它能夠計算即使當整個文件尚未加載到其緩衝器中的BPM值的臨危原始樣本。我發現這些中間值與整個文件加載後獲得的中間值不同,根據我的經驗,這更準確。

希望這會有所幫助。

編輯:

這是一種複雜的過程,以在註釋中說明,所以我要編輯答案。

它的要點是你需要你的android應用程序來使用本地代碼。爲此,您需要使用Android NDK工具箱從soundtouch庫中編譯上面列出的文件。

這會給你留下原生代碼,能夠處理原始聲音數據,但你仍然需要從聲音文件中獲取數據,我認爲你可以採用幾種方法。我這樣做的方式是使用FMOD library for Android,下面是一個很好的例子:FMOD for Android

假如你宣佈你的C代碼,像這樣的方法:

void Java_your_package_YourClassName_cPlay(JNIEnv *env, jobject thiz) 
{ 
    sound->play(); 
} 

在您使用以下方式你的本地方法的Android應用:

public class Sound { 
    // Native method declaration 
    private native void cPlay(); 

    public void play() 
    { 
     cPlay(); 
    } 
} 

爲了有一個更友好與你一起工作的API可以創建這些函數調用的包裝器。

我把我在使用的原生C代碼here

希望這會有所幫助。

+0

您能否提供一個Android應用程序如何處理soundtouch庫的音頻輸入數據的例子?謝謝! – shiami

+0

@ juan.facorro有沒有機會分享你的知識在android上獲取節奏?我似乎無法找到'soundtouch_config.h'。但主要問題實際上是我無法找到你在要點中使用的任何FMOD類。 –

+0

@SherifelKhatib我從事這個項目已經有一段時間了。這裏有一篇文章在Android上使用FMOD庫:[FMOD for Android](http://broadcast.oreilly.com/2011/06/fmod-for-android.html)。在使用速度檢測器時,我用這篇文章作爲指導。我將嘗試在接下來的幾天內使用應用程序的代碼創建一個github項目。 –