0

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

4

1 回答 1

4

我最近成功地使用了soundtouch库的BPMDetect类中的代码。最初在C++上编译它,后来将代码翻译成C#,最近我一直在通过 JNI在Android应用程序上使用C++代码。我对iOS中的开发并不十分熟悉,但我几乎可以肯定你正在尝试做的事情是可能的。

您应该使用soundtouch源代码中的唯一文件如下:

C++ 文件

  • BPMDetect.cpp
  • FIFOSampleBuffer.cpp
  • 峰查找器.cpp

头文件

  • BPMDetect.h
  • FIFOSampleBuffer.h
  • FIFOSamplePipe.h
  • 峰值查找器.h
  • soundtouch_config.h
  • STTypes.h

至少这些是我必须用来让它工作的唯一的。

BPMDetect类通过其inputSamples ()方法接收原始样本,即使整个文件尚未加载到其缓冲区中,它也能够计算 bpm 值。我发现这些中间值与加载整个文件后获得的值不同,根据我的经验,这更准确。

希望这可以帮助。

编辑:

在评论中解释这是一种复杂的过程,所以我将编辑答案。

它的要点是您需要您的 android 应用程序来使用本机代码。为此,您需要使用Android NDK工具集从 soundtouch 库编译上面列出的文件。

这将为您留下能够处理原始声音数据的本机代码,但您仍然需要从声音文件中获取数据,我认为您可以通过多种方式进行操作。我这样做的方式是使用 Android 的FMOD 库,这是一个很好的例子: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 代码放在一个要点

希望这可以帮助。

于 2012-01-16T18:20:24.213 回答