我正在尝试集成一种机制来计算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/