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

最佳答案

我最近一直在成功使用soundtouch库的BPMDetect类中的代码。最初是在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中。

希望这可以帮助。

关于iphone - Soundtouch bpm iPhone,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8226261/

10-09 16:28