Soundtouch bpm iPhone

时间:2011-11-22 11:47:31

标签: iphone ios cocoa bpm soundtouch

我正在尝试集成一种机制来计算iPod库中歌曲的BPM(也在iphone上)。 在网上搜索我发现做这件事最常用和最可靠的库是soundtouch.Anyone有这个库的经验吗?计算上可以让它在iPhone硬件上运行吗?

1 个答案:

答案 0 :(得分:4)

我最近成功使用了 soundtouch 库的 BPMDetect 类中的代码。最初在 C ++ 上编译它,稍后将代码翻译为 C#,最近我在上使用 C ++ 代码> Android 应用程序通过JNI。我对 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中。

希望这有帮助。